如何扫描python 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()

可以使用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服务器,然后你可以控制它。这个问题解释了细节。如何在python类中处理asyncore,而不阻塞任何东西?

您可以通过在process_message方法中调用asyncore.close_all来退出asyncore循环:

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

相关内容

  • 没有找到相关文章

最新更新