2

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

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的主题以指示谁应该接收电子邮件,如下所示:“我的主题(收件人: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);
    }
}
4

2 回答 2

2

可能你应该为事件和/或所需的主题操作创建一个简单的包装类SmtpClientBeforeSend像这样?

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);
    }
}
于 2013-06-08T15:57:33.650 回答
2

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

它是为您的开发环境提供一个单独的*.config文件,而不是您在生产环境中拥有的文件 - 这可以使用配置转换(有或没有SlowCheetah)或任何自制解决方案来管理。

这个配置文件将指向一个开发 SMTP 服务器——一个只接收消息而不发送它们的服务器。有很多方法可以做到这一点。

于 2013-06-08T16:32:56.127 回答