Лучший способ протестировать большой объем электронная почта SMTP, отправляющая код?

Я записал компонент в службе Windows (C#), который ответственен за отправку иногда больших объемов электронных писем. Эти электронные письма перейдут к получателям на многих доменах – действительно, любом домене. (Да, получатели хотят электронную почту. Нет, я не посылаю спам. Да, я нахожусь в соответствии СПАМУ CAN. Да, я - осведомленное электронное письмо отправки из кода, сосет.) Многие электронные письма являются транзакционными (сгенерированный в ответ на пользовательские действия); некоторые являются объемными (автоматические составления стандартных писем в основном).

Я не хочу полагаться на внешний сервер SMTP. (Среди других соображений мысль о необходимости проверить почтовый ящик на возвращенные сообщения и попытку проанализировать их дает мне плохо чувства.)

Мой дизайн довольно прост. Оба транзакционные и объемные сообщения сгенерированы и введены в Таблицу базы данных. Эта таблица содержит почтовый конверт и содержание плюс количество попытки и повторная попытка - после даты.

Услуга работает несколько рабочих потоков, которые захватывают 20 строк за один раз и цикл через каждого. Пользуясь библиотекой Simple DNS Plus, я захватываю запись (записи) MX домена получателя и затем использую System.Net.Mail.SmtpClient синхронно послать электронное письмо. Если вызов к Send() успешно выполняется, я могу исключить электронную почту из очереди. Если это временно перестало работать, я могу увеличить количество попытки и установить соответствующую повторную попытку - после даты. Если это постоянно перестало работать, я могу исключить из очереди и обработать отказ.

Очевидно, отправка тысяч тестовых электронных писем к сотням различных фактических доменов является Очень Плохой Идеей. Однако мне определенно нужно к стресс-тесту, который мои многопоточные отправляют коду. Я также не совсем уверен, что лучший способ состоит в том, чтобы моделировать различные виды отказа SMTP. Плюс, я хочу удостовериться, что я заканчиваю различные методы управления спама (graylisting для именования самого соответствующего для сетевого уровня вещей).

Даже мои небольшие трудности с тестированием усилены моим недавним исследованием моих соединений блокирования ISP с портом 25 на любом сервере кроме сервера SMTP моего ISP. (В производстве эта вещь, конечно, будет на надлежащем сервере, где порт 25 не заблокирован. Это не помогает мне протестировать от моей dev машины.)

Так, эти две вещи мне является самым любопытным на предмет:

  1. Как я должен пойти о тестировании моего кода?
  2. Каковы различные пути который SmtpClient.Send() может перестать работать? Перечислены шесть исключений; SmtpException и SmtpFailedRecipientsException кажется, являюсь самым релевантным.

Обновление: ответ B Marc указывает, что я в основном создаю свой собственный сервер SMTP. Он делает справедливое замечание, которое я изобретаю велосипед, таким образом, вот мое объяснение для того, чтобы не использовать 'фактическое' (Постфикс, и т.д.) вместо этого:

  1. Электронные письма имеют отличающийся, отправляют приоритеты (хотя это не связано с конвертом X-Priority). Объемная электронная почта является низким приоритетом; транзакционный высоко. (И любая электронная почта или группа электронных писем могут быть далее настроены, чтобы иметь произвольный приоритет.) Я должен смочь приостановить отправку электронных писем более низкого приоритета, таким образом, электронные письма более высокого приоритета могут быть поставлены сначала. (Для выполнения этого рабочие потоки просто поднимают самые высокие приоритетные объекты с очереди каждый раз, когда они получают еще 20.)

    Если я уже отправил несколько тысяч объемных объектов внешнему серверу SMTP, у меня нет способа приостановить их, в то время как объекты, которые я хочу отправить теперь, отправляются. Поверхностный выставочный Постфикс поиска Google действительно не поддерживает приоритеты; Sendmail располагает по приоритетам на информации в конверте, который не удовлетворяет мои потребности.

  2. Я должен смочь отобразить прогресс отправить процесса уничтожения (группа объемных электронных писем) моим пользователям. Если я просто передал все свои электронные письма к внешнему серверу, я понятия не имею, как далеко вперед в фактической доставке это.

  3. Я не решаюсь анализировать возвращенные сообщения, потому что возвращенное сообщение каждого MTA отличается. Sendmail отличается от биржи, отличается от [...]. Кроме того, в какой частоте я проверяю свой ящик входящих сообщений возврата? Что, если само возвращенное сообщение не поставляется?

  4. Я слишком ужасно не обеспокоен уничтожением, переставшим работать на полпути через.

    Если мы говорим катастрофический отказ (завершающее приложение необработанное исключение, сбой питания, безотносительно): Так как рабочие потоки исключают каждую электронную почту из очереди от базы данных, когда она успешно поставляется, я могу знать, кто получил уничтожение и кто не имеет. Далее, когда сервисный сброс после отказа, это просто берет, где это кончило в очереди.

    Если мы говорим локальный отказ (a SmtpException, Отказ DNS, или поэтому дальше): Я просто регистрирую отказ, увеличиваю счетчик попытки электронной почты и попробовал еще раз позже. (Который является в основном, к чему призывает спецификация SMTP.) После n попытки, я могу постоянно перестать работать, сообщение (исключите его из очереди), и зарегистрируйте отказ для исследования позже. Таким образом, я могу найти странные пограничные случаи, которые мой код не обрабатывает – даже если мой код не составляет 100%, совершенствуют в первый раз. (И давайте будем честны, это не будет.)

  5. Я надеюсь, что маршрут roll-my-own в конечном счете позволит мне выводить электронные письма быстрее, чем если бы я должен был полагаться на внешний сервер SMTP. Я должен был бы волноваться об ограничении уровня, если бы сервер не находился под моим контролем; даже если это было, это - все еще узкое место. Многопоточная архитектура я пошел со средствами, которые я подключаю к нескольким удаленным серверам параллельно, уменьшая общее количество времени, который требуется для передачи n сообщений.

6
задан Community 23 May 2017 в 10:27
поделиться