发送前拦截电子邮件(SmtpClient)

时间:2013-06-08 15:43:05

标签: c# smtpclient

我正在使用以下代码发送电子邮件:

using (var mailMessage = new MailMessage("from@example.com", "to@example.com"))
{
    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="someone.else@example.com" />
</appSettings>

当“RedirectAllEmailsTo”的值不为空时,我希望将我的应用程序中的所有电子邮件发送到指定的电子邮件,而不是发送到 MailMessage 中指定的接收者实例

我还想更改 MailMessage 的主题,以指示谁应该收到这样的电子邮件:“我的主题(receiver:to@example.com)”。

是否有可能拦截电子邮件,更改接收器以及主题,或者我是否必须编写自己的类,而不是直接使用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);
    }
}

2 个答案:

答案 0 :(得分:2)

可能你应该为SmtpClient事件和/或所需的主题操作创建一个简单的包装类,如下所示?

BeforeSend

答案 1 :(得分:2)

处理此问题的标准方法(即,不在开发环境中发送电子邮件)来拦截电子邮件。

开发环境的单独*.config文件比生产中的文件要好 - 可以使用config transformations(有或没有SlowCheetah)或其他方式管理家庭酿造的解决方案。

此配置文件将指向开发SMTP服务器 - 仅接收消息但不发送消息的服务器。有plenty of ways这样做。