Возможно кто-то еще не знает, но Python позволяет из коробки поднимать SMTP сервер, который можно использовать для тестирования отправки почты. Перегрузив один метод класса SMTPServer, можно заставить его складывать почту в виде файлов в определенное место:
#! /usr/bin/python
# -*- encoding: utf-8 -*-
import os
import asyncore
from smtpd import SMTPServer
from datetime import datetime
path = os.getcwd() + "/messages"
class SmtpServer(SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
message = datetime.now().strftime("%d-%m-%Y_%H-%M-%S.%f") + ".eml"
if not os.path.exists(path):
os.mkdir(path)
f = open(path + "/" + message, "w")
f.write(data)
f.close()
print "%s saved." % message
def run():
if not os.path.exists(path):
os.mkdir(path)
SmtpServer(("localhost", 25), None)
try:
asyncore.loop()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
run()
В итоге сообщения будут падать в папку messages c именем по шаблону: ДД-ММ-ГГГГ_ЧЧ-ММ-СС.МКС.
Вечером на коленке прикрутил к этой штуке web-морду, вот что получилось:
Достаточно простой вариант для анонимной авторизации. Складывает файлы в %TEMP%*IP сервера* и в итоге, имейлы можно пропарсить. Они в стандартном формате .eml.
Одна из задач была просто отправить 200 000 писем. Т.е. их нужно было просто правильно отправить, не проверяя. В таком случае, отправка писем занимала 4 часа.
Тогда, я воспользовался модулем на языке Perl:
И время отправки сократилось до 1 часа.
Для более основательного теста с учетом разных типов авторизации, я использую SMTP сервер, встроенный в Windows Server 2008.
Письма он также складывает как текстовые файлы.
Единственная проблема была, когда я запустил тест для реальной базы. Дело в том, что SMTP в Windows Server 2008 автоматически нашел реальный сервер моей компании для дальнейшего форвардинга писем. Если бы я не заменил реальные имейлы на свой в базе – была бы беда
Да, в интеренете полно всяких инструментов на подобии MailCatcher. Просто этот вариант очень простой и кроссплатформенный к тому же. Выбрал именно его, из-за того что мне не дадут поставить какие то программы на сервер, а тут для разворачивания по сути ничего ставить и не нужно, кроме интерпретатора Python, который на большинстве Linux есть из коробки
Web-морду сделал по тому жепринципу, минимум установок дополнительных пакетов. Поднимается через встроенный в Python cgi сервер.
Почему не абстрагироваться от языка написания тестов в сторону готовых простых решений, например sendemail и не использовать готовые SMTP сервера, например smtp.yandex.ru для отправки писем?
Sendmail – это было хорошее решение для приложений 10 лет назад. И сейчас, вполне годится для небольших скриптов на perl и bash. Но, в соверменных проектах – использовать его грех. Кроме того, у многих языков уже есть реализация отправки через SMTP, которую можно вызвать внутри языка так же просто, как и sendmail из командной строки.
Использование сторонних smtp серверов может нарушить пункт договора о передаче конфиденциальных данных. Да, для меня это важно.
В результате дебага или тестирования, можно случайно сделать ошибку, которая на локальном сервере будет просто фэйлом, а на реальном – эпик фэйлом.
Сторонние SMTP это вообще на мой взгляд не вариант. Во-первых как уже писал @dzhariy, это не безопасно и может еще нарушать политику безопасности компании, как в моем случае. Во-вторых, это несколько неудобно потом проверять что ты отправил и усложняет автоматизацию. В случае локального SMTP достаточно просто по ssh пойти в папку и взять нужный файл с письмом и проверить его. Про SendEmail не слышал, только про sendmail, который тоже в принипе можно настроить так чтобы он ложил письма в папку, но это только для локальных пользователей, что несколько неудобно, хотя наверное можно наделать alias. В любом случае это требует прав, которых в моем случае например нет
Лично мне он понравился тем что работает локально, не требует напильника, есть веб и REST интерфейсы. Что ещё нужно для счастья? Ах, точно реалтайм апдейты! Они тоже есть )