我使用特定的类异步发送电子邮件。您可以找到原始课程here。
此类使用委托函数发送电子邮件:
public class Email
{
public bool SendEmail(MailMessage message)
{
try
{
SmtpClient smtpClient = new SmtpClient();
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.EnableSsl = true;
...
smtpClient.Send(message);
}
catch (Exception ex)
{
ErrorLogger.SaveLog(ex);
}
return true;
}
public delegate bool SendEmailDelegate(MailMessage message);
public void GetResultsOnCallback(IAsyncResult ar)
{
SendEmailDelegate del = (SendEmailDelegate)((AsyncResult)ar).AsyncDelegate;
try
{
bool result = del.EndInvoke(ar);
}
catch (Exception ex)
{
ErrorLogger.SaveLog(ex);
}
}
public void SendEmailAsync(MailMessage message)
{
try
{
SendEmailDelegate dc = new SendEmailDelegate(this.SendEmail);
AsyncCallback cb = new AsyncCallback(this.GetResultsOnCallback);
IAsyncResult ar = dc.BeginInvoke(message, cb, null);
}
catch (Exception ex)
{
ErrorLogger.SaveLog(ex);
}
}
}
但是在我在ASP.NET MVC 2中开发的网站上,当我尝试发送96封电子邮件时,只收到了少数几封。在我的第一次测试中,我收到了52封电子邮件,在第二封57封电子邮件中。
我有这个静态类来调用发送电子邮件对象
public static class EmailSender
{
private static void SendEmail(MailMessage mail)
{
Email sender = new Email();
sender.SendEmailAsync(mail);
}
public static void SendRevival(UserViewModel user){
...
SendEmail(mailMessage);
}
}
我这样使用它:
foreach(UserViewModel user in users){
EmailSender.SendRevival(user);
}
应用程序和服务器都没有错误。
有谁知道发生了什么事?
THX。
答案 0 :(得分:1)
您是否正在查看致电
的回复结果?sender.SendEmailAsync(mail);
查看邮件是否实际发送?
我刚看了这个方法的源代码,它就是这样做的:
public bool SendEmailAsync(string toEmail, string toName)
{
try
{
SendEmailDelegate dc = new SendEmailDelegate(this.SendEmail);
AsyncCallback cb = new AsyncCallback(this.GetResultsOnCallback);
IAsyncResult ar = dc.BeginInvoke(toEmail, toName, cb, null);
}
catch (Exception ex)
{
return false;
}
return true;
}
也就是说,代码正在捕获任何抛出的异常并且只返回false。不仅如此,而且在AsyncCallback中它也做同样的事情,即它“吃掉”异常并且你永远不会知道任何异常。
要调试您的问题,我会使用同步SendEmail
调用并将其代码(在SendEmail
方法中)更改为 NOT 捕获异常,以便被调用者(您)知道发生了什么。例如
private static void SendEmail(MailMessage mail)
{
Email sender = new Email();
sender.SendEmail(mail);//modify this method as well!
}