目前,我开发了一个脚本,该脚本将读取传入/最新的电子邮件并根据某些条件(例如电子邮件主题和文本)过滤电子邮件。当用户选择subject
or text
,他们可以选择要过滤电子邮件的条件(等于、不包含等)。
我的问题我有一个演示网站,可以让用户添加不同的条件来过滤电子邮件。但现在我的脚本只能处理一种条件并同时执行。如何使我的脚本检测多个条件并根据多个规则过滤电子邮件?我使用 Django 来做我的网站
我之前的脚本:
用户点击后OK
,脚本在view.py
将直接执行,并且仅根据当前条件解析电子邮件
我想要实现的目标:
我修改了我的 html 模板,它会不断地让用户添加几个条件,而不是只执行一个条件。示例:当用户选择参数等并单击OK
新行将被存储,脚本将根据用户想要解析的规则数量来解析电子邮件。 (点击后submit
只有满足所有规则时才会触发脚本)
预期输出(基于上图)系统能够使用这两个规则解析传入的电子邮件:电子邮件主题必须等于测试并且文本必须包含文本包含
可能的解决方案当有新规则进来时,是否能够动态添加If Else语句?并计数直到规则的最后一行然后执行。
我的py脚本(此代码是以前的版本,它只能在用户单击“确定”时执行一次)
from django.http import HttpResponse
import datetime
import email
import imaplib
import mailbox
import smtplib
def index(request):
return render(request,'DemoApp/hi.html')
def send(request):
EMAIL_ACCOUNT = "[email protected]"
PASSWORD = "xxx"
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(EMAIL_ACCOUNT, PASSWORD)
mail.list()
mail.select('inbox')
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN)
i = len(data[0].split())
for x in range(i):
latest_email_uid = data[0].split()[x]
result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
# result, email_data = conn.store(num,'-FLAGS','\\Seen')
# this might work to set flag to seen, if it doesn't already
raw_email = email_data[0][1]
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)
# Header Details
date_tuple = email.utils.parsedate_tz(email_message['Date'])
if date_tuple:
local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
local_message_date = "%s" % (str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
email_from = str(email.header.make_header(email.header.decode_header(email_message['From'])))
email_to = str(email.header.make_header(email.header.decode_header(email_message['To'])))
subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))
# Body details
for part in email_message.walk():
if part.get_content_type() == "text/plain":
body = part.get_payload(decode=True)
#Get all value from
ParameterGet = str(request.POST.get('Parameter', None))
ConditionGet = str(request.POST.get('Condition', None))
valuetomatch = str(request.POST["valuetomatch"])
def emailSendDetails():
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "ALERT NOTICE!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
#<----------------Parameter---------------->
#Subject
if ParameterGet == "Subject":
# <----------------Condition---------------->
#Equals
if ConditionGet == "Equals":
if valuetomatch == subject:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "subject equals!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
# Contain
if ConditionGet == "Contain":
if valuetomatch in subject:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "subject contain!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
# Does not contain
if ConditionGet == "NotContain":
if valuetomatch not in subject:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "subject not contain!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
# <----------------Parameter---------------->
#Text
if ParameterGet == "Text":
# <----------------Condition---------------->
# Equals
if ConditionGet == "Equals":
if valuetomatch == body.decode('utf-8').rstrip():
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "text equals!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
# Contain
if ConditionGet == "Contain":
if valuetomatch in body.decode('utf-8'):
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "text contain!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
# Does not contain
if ConditionGet == "NotContain":
if valuetomatch not in body.decode('utf-8'):
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "text notcontain!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
else:
continue
return render(request, 'DemoApp/hi.html', {'key': "Send successfully"})
相同的脚本,但它不链接到 Html 或 django 模板,它的所有硬编码参数,但它有助于调试
import datetime
import email
import imaplib
import mailbox
import smtplib
while True:
EMAIL_ACCOUNT = "[email protected]"
PASSWORD = "xxx"
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(EMAIL_ACCOUNT, PASSWORD)
mail.list()
mail.select('inbox')
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN)
i = len(data[0].split())
for x in range(i):
latest_email_uid = data[0].split()[x]
result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
# result, email_data = conn.store(num,'-FLAGS','\\Seen')
# this might work to set flag to seen, if it doesn't already
raw_email = email_data[0][1]
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)
# Header Details
date_tuple = email.utils.parsedate_tz(email_message['Date'])
if date_tuple:
local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
local_message_date = "%s" % (str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
email_from = str(email.header.make_header(email.header.decode_header(email_message['From'])))
email_to = str(email.header.make_header(email.header.decode_header(email_message['To'])))
subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))
# Body details
for part in email_message.walk():
if part.get_content_type() == "text/plain":
body = part.get_payload(decode=True)
print("From:", email_from)
print("Email To:", email_to)
print("date:", local_message_date)
print("Subject:", subject)
print("body:", body.decode('utf-8'))
'''If subject have "Consent" it will send specific email to recipient'''
if "Consent" in subject:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(EMAIL_ACCOUNT, PASSWORD)
msg = "ALERT NOTICE!"
server.sendmail(EMAIL_ACCOUNT, "[email protected]", msg)
server.quit()
else:
print("no email");
else:
continue
我当前的 Html 模板
<!DOCTYPE html>
<html lang="en">
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Quicksand:300,500" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<style>
.buttonSubmit{
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
body {font-family: 'Quicksand', sans-serif;}
.button {
border-radius: 50px;
background-color: #ff9633;
border: none;
color: #FFFFFF;
text-align: center;
font-size: 15px;
padding: 10px;
width: 80px;
transition: all 0.5s;
cursor: pointer;
margin: 5px;
margin-left:500px;
}
.button span {
cursor: pointer;
display: inline-block;
position: relative;
transition: 0.5s;
}
.button span:after {
content: '\00bb';
position: absolute;
opacity: 0;
top: 0;
right: -20px;
transition: 0.5s;
}
.button:hover span {
padding-right: 25px;
}
.button:hover span:after {
opacity: 1;
right: 0;
}
/* The Modal (background) */
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
/* Modal Content */
.modal-content {
position: relative;
background-color: #fefefe;
margin: auto;
padding: 0;
border: 1px solid #888;
width: 45%;
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
-webkit-animation-name: animatetop;
-webkit-animation-duration: 0.4s;
animation-name: animatetop;
animation-duration: 0.4s
}
/* Add Animation */
@-webkit-keyframes animatetop {
from {top:-300px; opacity:0}
to {top:0; opacity:1}
}
@keyframes animatetop {
from {top:-300px; opacity:0}
to {top:0; opacity:1}
}
/* The Close Button */
.close {
color: white;
float: right;
font-size: 28px;
font-weight: bold;
}
.close:hover,
.close:focus {
color: #000;
text-decoration: none;
cursor: pointer;
}
.modal-header {
padding: 2px 16px;
background-color: #ff9633;
color: white;
}
.modal-body {padding: 2px 16px;}
.modal-footer {
padding: 2px 16px;
background-color: #ff9633;
color: white;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #ff9633;
}
li {
float: left;
}
li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
li a:hover {
background-color:
#fa7d34;
}
</style>
</head>
<body>
<ul>
<li>
<div id="myBtn1"><a href="#AddCon">Alert Policies</a></div>
</li>
<li><a href="#contact">Test3</a></li>
<li><a href="#about">Test4</a></li>
</ul>
<!-- The Modal -->
<div id="myModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<div class="modal-header">
<span class="close">×</span>
<h2>Alert Policies</h2>
</div>
<div class="modal-body">
<p style="font-size:14px">Please select an event parameter as well as the condition type and value that
apply.</p>
<!-- parameter drop down -->
<form method="post">
<label for="Parameter"> <b style="font-size:13px"> Event parameter to evaluate </b></label>
<select name="Parameter" id="Parameter" style="width:340px; font-family: 'Quicksand', sans-serif;">
<option disabled selected value>select a parameter</option>
<option value="Subject">Subject</option>
<option value="Text">Text</option>
</select>
<br><br>
<label for="Condition"> <b style="font-size:13px"> Type of condition </b></label>
<select name="Condition" id="Condition"
style="width:340px; margin-left:69px; font-family: 'Quicksand', sans-serif;">
<option disabled selected value>select a condition</option>
<option value="Equals">Equals</option>
<option value="Contain">Contain</option>
<option value="NotContain">Does not contain</option>
</select>
<br><br>
<label for="valuetomatch"> <b style="font-size:13px"> Value to match</b></label>
<input type="text" id="valuetomatch" name="valuetomatch"
style="width:333px; margin-left:80px; font-family: 'Quicksand', sans-serif;">
<br>
<br>
</form>
<button class="button"><span>OK</span></button>
</div>
</div>
</div>
<table id="myTable">
<tr>
<th>Event Parameter</th>
<th>Condition</th>
<th>Value to match</th>
<th>Action</th>
</tr>
</table>
<br>
<a href="#" class="buttonSubmit">Submit</a>
<script>
//add tablebox
$(document).ready(function(){
$(".button").on('click', function () {
para = document.getElementById("Parameter").value;
condi = document.getElementById("Condition").value;
value2match = document.getElementById("valuetomatch").value;
if (para && condi && value2match !== null) {
var table = document.getElementById("myTable");
var row = table.insertRow(-1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
var cell4 = row.insertCell(3);
cell1.innerHTML = document.getElementById("Parameter").value;
cell2.innerHTML = document.getElementById("Condition").value;
cell3.innerHTML = document.getElementById("valuetomatch").value;
cell4.innerHTML = '<button class = "del_img "onClick="delSpec(this)">Delete</button> </div>';
//close the modal
modal.style.display = "none";
}else
{
alert("All the input box cannot be empty!");
}
});
});
function delSpec(node)
{
r=node.parentNode.parentNode;
r.parentNode.removeChild(r);
}
// Get the modal
var modal = document.getElementById("myModal");
// Get the button that opens the modal
var btn = document.getElementById("myBtn1");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks the button, open the modal
btn.onclick = function() {
modal.style.display = "block";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
</script>
</body>
</html>