2013-06-08 1 views
2

Я использую следующий код для отправки по электронной почте:Перехват электронной почты перед отправкой (SmtpClient)

using (var mailMessage = new MailMessage("[email protected]", "[email protected]")) 
{ 
    mailMessage.Subject = "My topic"; 
    mailMessage.IsBodyHtml = true; 
    mailMessage.Body = "My content"; 
    using (var smtpClient = new SmtpClient()) 
    { 
     smtpClient.Send(mailMessage); 
    } 
} 

Я хотел бы, чтобы иметь возможность перехватывать электронную почту, и изменить тему а также получателя, когда я использую этот код в своей тестовой среде. Я хочу, чтобы иметь возможность настроить что-то вроде этого в моем файле web.config:

<appSettings> 
    [...] 
    <add key="RedirectAllEmailsTo" value="[email protected]" /> 
</appSettings> 

Когда значение «RedirectAllEmailsTo» разве пустой, я хотел бы все электронные письма в моем приложении, для отправки указанный адрес электронной почты вместо назначенного получателя в моем примере MailMessage.

Я также хотел бы изменить тему MailMessage, чтобы указать, кто должен получать электронное письмо примерно так: «Моя тема (приемник: [email protected])».

Возможно ли перехватывать электронные письма и изменять ресивер, а также тему, или мне нужно написать собственный класс, вместо непосредственного использования SmtpClient?

Это мой код. Надеюсь, есть лучший способ справиться с этим.

public static void SendEmail(MailMessage mailMessage) 
{ 
    var redirectAllEmailsTo = ConfigurationManager.AppSettings["RedirectAllEmailsTo"]; 
    if (string.IsNullOrEmpty(redirectAllEmailsTo) == false) 
    { 
     mailMessage.Subject += string.Format(" (to: {0}, cc: {1}, bcc: {2})", 
      string.Join(", ", mailMessage.To.Select(m => m.Address)), 
      string.Join(", ", mailMessage.CC.Select(m => m.Address)), 
      string.Join(", ", mailMessage.Bcc.Select(m => m.Address))); 

     mailMessage.To.Clear(); 
     mailMessage.CC.Clear(); 
     mailMessage.Bcc.Clear(); 
     mailMessage.To.Add(redirectAllEmailsTo); 
    } 
    using (var smtpClient = new SmtpClient()) 
    { 
     smtpClient.Send(mailMessage); 
    } 
} 
+6

Почему бы не создать конфигурационный файл dev, который использует dev smtp-сервер? – Oded

+0

@Oded: Вы могли бы также ответить на этот вопрос :) – leppie

+0

@leppie - достаточно справедливо. Готово. – Oded

ответ

2

может быть вы Shoule просто создать простой класс обертки для SmtpClient с BeforeSend события и/или желаемыми операциями темы, как это?

class SmtpClientWrapper 
{ 
    SmtpClient _client = new SmtpClient(); 

    public event EventHandler BeforeSend; 

    private void PreprocessMesage(MailMessage message) 
    { 
     //do something with the message topic, as you desire 
    } 

    public void Send(MailMessage message) 
    { 
     BeforeSend(this, EventArgs.Empty); 
     PreprocessMessage(message); 
     _client.Send(message); 
    } 
} 
2

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

Он должен иметь отдельный *.config файл для среды разработки, чем тот, который вы имеете в производстве - это можно управлять с помощью config transformations (с или без SlowCheetah), или любой другой дом варят решение.

Этот конфигурационный файл указывает на SMTP-сервер разработки - тот, который принимает сообщения только и не отправляет их. Это делается plenty of ways.

+0

Очень интересно. В этом конкретном случае я хочу, чтобы все электронные письма отправлялись на конкретный адрес электронной почты со списком получателей из исходного MailMessage в теме. Причиной этого является то, что клиент для этого проекта хочет пообщаться с сайтом в среде разработки и получать все электронные письма с информацией о том, кто должен был получать каждое электронное письмо. – Martin

+0

@Martin - Ну, похоже, вы можете просто отправить сообщение _extra_ с диагностической информацией (например, список предполагаемых получателей) на указанный адрес. Что-то, с чем вы можете использовать 'ConditionalAttribute'. – Oded

+0

@Martin: Различные способы сделать это. Основное предложение от меня, чтобы «SmtpClient» создавался как локальная переменная. Затем примените то, что сказал Одед в терминах условной компиляции. – leppie