[英]Intercept e-mails before sending (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的主题,以表明应该由谁接收电子邮件,例如:“我的主题(收件人: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);
}
}
也许您应该仅使用BeforeSend
事件和/或所需的主题操作为SmtpClient
创建一个简单的包装类,这样吗?
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);
}
}
解决此问题的标准方法(即在开发环境中不发送电子邮件)是不拦截电子邮件。
与您的生产环境相比,它要为您的开发环境提供一个单独的*.config
文件-可以使用config转换 (带有或不带有SlowCheetah )或任何自制的解决方案进行管理。
此配置文件将指向开发SMTP服务器-仅接收邮件而不发送邮件的服务器。 有很多方法可以做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.