Тестовый SMTP сервер для проверки отправки почты

Возможно кто-то еще не знает, но 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-морду, вот что получилось:

Кому интересно, скачать можно тут: http://yadi.sk/d/JJdpYdQVEJaTs

3 лайка

Я для своих целей пользуюсь Antix SMTP Impostor

Достаточно простой вариант для анонимной авторизации. Складывает файлы в %TEMP%*IP сервера* и в итоге, имейлы можно пропарсить. Они в стандартном формате .eml.

Одна из задач была просто отправить 200 000 писем. Т.е. их нужно было просто правильно отправить, не проверяя. В таком случае, отправка писем занимала 4 часа.

Тогда, я воспользовался модулем на языке Perl:

И время отправки сократилось до 1 часа.

Для более основательного теста с учетом разных типов авторизации, я использую SMTP сервер, встроенный в Windows Server 2008.
Письма он также складывает как текстовые файлы.
Единственная проблема была, когда я запустил тест для реальной базы. Дело в том, что SMTP в Windows Server 2008 автоматически нашел реальный сервер моей компании для дальнейшего форвардинга писем. Если бы я не заменил реальные имейлы на свой в базе – была бы беда :blush:

Да, в интеренете полно всяких инструментов на подобии MailCatcher. Просто этот вариант очень простой и кроссплатформенный к тому же. Выбрал именно его, из-за того что мне не дадут поставить какие то программы на сервер, а тут для разворачивания по сути ничего ставить и не нужно, кроме интерпретатора Python, который на большинстве Linux есть из коробки :smile:
Web-морду сделал по тому жепринципу, минимум установок дополнительных пакетов. Поднимается через встроенный в Python cgi сервер.

А, кстати, с авторизацию в smtpd настроить можно, хотя бы basic с обычным паролем и логином?

А в питоне обязательно вручную задавать разделитель? Автоматически он не определяет?

Почему не абстрагироваться от языка написания тестов в сторону готовых простых решений, например sendemail и не использовать готовые SMTP сервера, например smtp.yandex.ru для отправки писем?

А если не ненастоящие адреса? Или с машины, где нет интернета?

Sendmail – это было хорошее решение для приложений 10 лет назад. И сейчас, вполне годится для небольших скриптов на perl и bash. Но, в соверменных проектах – использовать его грех. Кроме того, у многих языков уже есть реализация отправки через SMTP, которую можно вызвать внутри языка так же просто, как и sendmail из командной строки.

  1. Использование сторонних smtp серверов может нарушить пункт договора о передаче конфиденциальных данных. Да, для меня это важно.
  2. В результате дебага или тестирования, можно случайно сделать ошибку, которая на локальном сервере будет просто фэйлом, а на реальном – эпик фэйлом.

Я не призываю отказаться от всего и пользоваться только Sendemail, я просто предложил.
Кстати, не путайте sendmail и sendemail — это разные вещи. :slight_smile:

Как-то не задумывался над этим. Да немного надо допилить скрипт. Проверил, в Windows катит если к пути добавлять “/” как в *nix системах.

Сторонние SMTP это вообще на мой взгляд не вариант. Во-первых как уже писал @dzhariy, это не безопасно и может еще нарушать политику безопасности компании, как в моем случае. Во-вторых, это несколько неудобно потом проверять что ты отправил и усложняет автоматизацию. В случае локального SMTP достаточно просто по ssh пойти в папку и взять нужный файл с письмом и проверить его. Про SendEmail не слышал, только про sendmail, который тоже в принипе можно настроить так чтобы он ложил письма в папку, но это только для локальных пользователей, что несколько неудобно, хотя наверное можно наделать alias. В любом случае это требует прав, которых в моем случае например нет :smile:

1 лайк

Про упомянутый выше Mailcatcher написал небольшой пост: Тестирование Email с Mailcatcher и MailTrap

Лично мне он понравился тем что работает локально, не требует напильника, есть веб и REST интерфейсы. Что ещё нужно для счастья? Ах, точно реалтайм апдейты! Они тоже есть )

Я для тестирования пользуюсь emailvoid.com
Удобно и бесплатно.