我想收到一封包含python的电子邮件。然后我想退出邮件服务器并在我的脚本中使用电子邮件的内容。
例如:
if "any_string" in data:
print "success"
<< exit mailserver >>
<< any other commands >>
代码:
import smtpd
import asyncore
class FakeSMTPServer(smtpd.SMTPServer):
__version__ = 'TEST EMAIL SERVER'
def process_message(self, peer, mailfrom, rcpttos, data):
print 'Receiving message from:', peer
print 'Message addressed from:', mailfrom
print 'Message addressed to :', rcpttos
print 'Message length :', len(data)
print 'Message :', data
return
if __name__ == "__main__":
smtp_server = FakeSMTPServer(('0.0.0.0', 25), None)
try:
asyncore.loop()
except KeyboardInterrupt:
smtp_server.close()
答案 0 :(得分:2)
您可以使用SMTP.quit()关闭SMTP会话。在您的情况下,您可以像smtp_server.quit()
关于在字符串中搜索单词,您可以这样做
data = 'my Test data'
for word in data.split():
if 'test' in word:
print "success"
如果你想忽略大小写(大写/小写),那么只需使用lower()将字符串转换为小写,然后检查如下所示:
data = 'my Test data'
for word in data.lower().split():
if 'test' in word:
print "success"
如果要在使用asyncore.loop()
时停止脚本,则可能需要使用其他线程启动SMTP服务器,然后才能控制它。这个问题解释了细节。 How to handle asyncore within a class in python, without blocking anything?
答案 1 :(得分:1)
您可以通过asyncore
方法调用asyncore.close_all
退出process_message
循环:
def process_message(self, peer, mailfrom, rcpttos, data):
# ...
print 'Message :', data
asyncore.close_all()
return
修改
如果要在退出asyncore
循环后访问邮件文本,只需将其存储为smtp服务器的属性
#...
class FakeSMTPServer(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
# ...
self.data = data
# ...
if __name__ == "__main__":
smtp_server = FakeSMTPServer(('0.0.0.0', 25), None)
try:
asyncore.loop()
except KeyboardInterrupt:
smtp_server.close()
# smtp_server.data contains text of message