我有一个在后台运行的线程,当某些东西被唤醒时,它将从数据库中休眠和提取数据。我使用谷歌应用程序使用SmtpClient发送电子邮件(代码如下)。
我想知道是否有任何我知道的事情?我计划一次只发送一封电子邮件(注册或忘记密码电子邮件)。我有点担心会发生一些事情,比如无效的电子邮件锁定线程,因为我没有设置超时或者可能谷歌应用程序正在完成并导致应用程序爆炸。我应该注意什么?我应该问我应该如何测试?
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential(fromAddr, pass),
EnableSsl = true
};
MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
mail.IsBodyHtml = true;
client.Send(mail);
答案 0 :(得分:3)
如果您使用的是IIS。在服务器上安装SMTP,将所有邮件发送到localhost。这样,如果电子邮件没有立即通过,SMTP服务器将对电子邮件进行排队,而不是挂起您的应用程序。
您需要配置SMTP服务器以将gmail用作智能主机。如果您需要有关如何配置此信息的更多信息,请与我们联系。
答案 1 :(得分:2)
在代码中添加try / catch,你没事。在最坏的情况下,它最终会超时。它不会永远运行,谷歌不会永远保持连接打开(事实上,当涉及到超时时,SMTP是非常不可原谅的......如果你很慢,它将会终止连接)。
try
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential(fromAddr, pass),
EnableSsl = true
};
MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
mail.IsBodyHtml = true;
client.Send(mail);
}
catch
{
// do something
}
说到测试...使用不同的gMail帐户。您也可以查看每天发送的电子邮件的限制。不确定gMail的号码是什么,但它们不只是让你发送你想发送的数量。
答案 2 :(得分:1)
我假设这是在ASP.Net下完成的,因为它是标签之一。
这个过程有多重要?如果您的环境允许,这可能是Windows服务的一个很好的候选者,而不是ASP.Net运行时的一部分。
您已经提到从数据库中提取数据并发送电子邮件。这些都不依赖于ASP.Net。此外,服务可以为您提供更好的线程,测试,日志记录和异步选项。
如果您想坚持使用ASP.Net运行时,那么您还可以考虑Asynchronous Pages(如果您还没有)。这将允许您生成多个邮件线程并让主页面线程等待结果。您还可以设置一个超时值,以允许您取消和记录卡住的线程。设置和处理异步超时会照顾到我怀疑的大部分担忧。此解决方案至少会使您的邮件发送您的make页面请求线程。
测试应该是直截了当的。您可以注册单独的Google帐户进行测试。
答案 3 :(得分:0)
您可以设置Timeout
的{{1}}属性,然后处理SmtpClient
调用引发的任何异常。然后它不会锁定线程,但你必须在你认为合适的情况下处理异常的原因。