asp.net net.mail - маршрутизировать все письма на другой адрес электронной почты в режиме отладки

StackOverflow https://stackoverflow.com/questions/638768

  •  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 );
     }

     ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top