asp.net net.mail - маршрутизировать все письма на другой адрес электронной почты в режиме отладки
-
10-07-2019 - |
Вопрос
Есть ли в любом случае, чтобы все электронные письма шли на другой адрес, когда System.Web.HttpContext.Current.IsDebuggingEnabled
имеет значение true? Или мне нужен новый класс, который я использую для отправки электронной почты везде?
Решение
Мы используем решение, аналогичное методу MailProxy, описанному tvanfosson Однако у нас есть несколько отличий, которые, я чувствую, стоит упомянуть. Во-первых, мы просто расширяем класс SmtpClient и переопределяем методы Send в среде разработки или тестирования. Мы используем конфигурационный файл для определения среды. Затем мы используем этот класс в любое время, когда нам нужно отправить электронные письма. Этот класс определит, кто в данный момент вошел в приложение, и перенаправит все сгенерированные им электронные письма, при переходе на другой ресурс к стандартному списку получателей, если вошедший в систему пользователь по какой-либо причине недоступен. Это помогает, если у вас есть несколько человек, которые тестируют или разрабатывают, так как они будут получать только те письма, которые они сгенерировали. Мы также добавляем исходных получателей сообщения в тело сообщения. Это снова полезно при тестировании сообщений типа рабочего процесса, чтобы убедиться, что они отправляются нужным лицам Наконец, я считаю полезным добавить тег [DEV] или [QA] к теме сообщения, чтобы я мог настроить правило в своем почтовом клиенте для обработки всех тестовых сообщений.
Другие советы
Я бы настроил SMTP-сервер, чтобы ваше веб-приложение использовало его в качестве сервера исходящей почты (указано в некоторой конфигурации). На производственных сайтах сервер будет работать нормально, но для отладки вы можете настроить SMTP-сервер для маршрутизации всей почты на ваш выбранный адрес. Преимущество этого состоит в том, что вы вообще не меняете свое приложение, что может быть полезно, если изменение поведения предотвращает возникновение ошибок, которые вы пытаетесь воспроизвести, и т. Д. Моя компания использует этот подход для обеспечения качества, и он работает довольно хорошо.
Вы можете поместить это в свой код везде, где вы его используете:
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
{
mail.To = "debug@debug.com";
}
else
{
mail.To = recipientAddress;
}
Или просто создайте простую оболочку для получения адресов электронной почты (даже что-то в методе получения адресов получателей) или оболочку для всего класса smtpclient или mailmessage.
Я должен быть честным, я использую старый добрый
#if DEBUG
Mail.To("debug@debugaddress.com");
#else
Mail.To("actualrecipient@destinationaddress.com");
#endif
Чтобы я не использовал отладочный код в своих производственных приложениях. Подход, который я использую для доступа к базе данных, заключается в том, чтобы использовать запись dns, т.е. database1.domain.com, и в файле hosts на моем компьютере разработчика он указывает на мою локальную систему, а на моем рабочем компьютере - на сервер базы данных. Вы можете использовать нечто подобное, чтобы иметь отладочный почтовый сервер и рабочий почтовый сервер, но это кажется излишним по сравнению с первым решением, приведенным выше.
Я думаю, что лучший способ справиться с этим - использовать прокси-класс для почтового клиента. При создании прокси-класса используйте параметр, чтобы указать, работать ли в режиме отладки или нет. Пусть прокси-сервер поддерживает тот же интерфейс, что и почтовый клиент, но автоматически заменяет адреса исходящей электронной почты, когда он работает в режиме отладки.
public class MailProxy
{
private bool IsDebug { get; set; }
private string DebugAddress { get; set; }
private SmtpClient Client { get; set; }
public MailProxy( SmtpClient client,
bool debugging,
string debugAddress )
{
this.IsDebug = debugging;
this.DebugAddress = debugAddress;
}
public void Send( MailMessage message )
{
if (this.IsDebug)
{
message.To = new MailAddress(this.DebugAddress);
}
this.Client.Send( message );
}
...
}