如何扫描python smtpd服务器的文本

时间:2014-06-18 11:27:21

标签: python asyncore smtpd

我想收到一封包含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()

2 个答案:

答案 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