Как сканировать 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()

2 ответа

Решение

Вы можете выйти из 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

Вы можете использовать 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, ничего не блокируя?

Другие вопросы по тегам