Я перешел на aiosmtpd, так как мне нужна была многопоточная обработка (а smtpd однопоточный, да и к тому же похоже, что его больше не поддерживают).
Кстати, меня озадачивает aiosmtpd управление почтой содержимым конвертов, оно кажется гораздо более детальным, чем раньше, поэтому хорошо, если вам нужна действительно тонкая настройка , но несколько великоват, если вы просто хотите обработать тело, не изменяя остальную часть.
Чтобы сделать пример, просто необходим метод smtpd process_message Параметр data_decode=True для обработки и декодирования тела письма, ничего не трогая, в то время как метод aiosmtpd HANDLE_data, похоже, неспособен автоматически декодировать почтовый конверт и часто выдает исключения со встроенными изображениями, вложениями и т. д.
EDIT добавлены примеры кода, сначала smtpd: следующий код создаст экземпляр smtp-сервера, ожидающего почты на порту 10025 и доставка на 10027 через smtplib (оба локальные). Безопасно работать с переменной data (в основном выполнять подстановку строк, моя цель) для всех видов почты (текстовых/html, со встроенными изображениями, вложениями...)
Код: Выделить всё
class PROXY_SMTP(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data, decode_data=True):
server = smtplib.SMTP('localhost', 10027)
server.sendmail(mailfrom, rcpttos, data)
server.quit()
server = PROXY_SMTP(('127.0.0.1', 10025), None)
asyncore.loop()
Код: Выделить всё
class MyHandler:
async def handle_DATA(self, server, session, envelope):
peer = session.peer
mailfrom = envelope.mail_from
rcpttos = envelope.rcpt_tos
data = envelope.content.decode()
server = smtplib.SMTP('localhost', 10027)
server.sendmail(mailfrom, rcpttos, data)
server.quit()
my_handler = MyHandler()
async def main(loop):
my_controller = Controller(my_handler, hostname='127.0.0.1', port=10025)
my_controller.start()
loop = asyncio.get_event_loop()
loop.create_task(main(loop=loop))
try:
loop.run_forever()
Как я могу проанализировать и декодировать текст письма в aiosmtpd, выполнить замену строк, как я это сделал в smtpd, и повторно внедрить его через smtplib?
Подробнее здесь: https://stackoverflow.com/questions/599 ... nd-reinjec