Как сканировать 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, ничего не блокируя?