当我使用C#编程以批量发送邮件时,我的代码是这样的:
public static bool Send(MailAddress Messagefrom,
string MessageTo,
string MessageSubject,
string MessageBody)
{
MailMessage message = new MailMessage();
message.From = Messagefrom;
message.To.Add(MessageTo);
message.Subject = MessageSubject;
message.Body = MessageBody;
message.BodyEncoding = System.Text.Encoding.UTF8;
//message.SubjectEncoding = Encoding.BigEndianUnicode;
message.IsBodyHtml = true;
message.Priority = MailPriority.High;
MailHelper mh = new MailHelper();
SmtpClient sc = mh.setSmtpClient("smtp.qq.com", 25);
sc.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
try
{
sc.SendAsync(message, message);
}
catch (Exception e)
{
LogHelper.WriteLog("Main send failed....\t the detail info:" +
e.ToString());
return false;
}
return true;
}
这是一个问题!当第一个邮件发送失败时(例如邮件地址为null
),下一封邮件无法发送!
因为我有太多的邮件等待发送,如果这种情况,如何解决?例如失败的邮件可能仍然在这个表和管理员手工处理它。
但是这种情况可能在Send
函数中,为什么会发生这种情况?
答案 0 :(得分:2)
你必须在调用Send()函数的foreach循环中捕获错误并在某处记录错误:
foreach (var mail in mailsToSend)
{
try
{
// Call your send function
Send(...)
}
catch (Exception ex)
{
// Log the error somewhere (console, file, ...)
Console.WriteLine("Error sending mail {0}", mail);
}
}
这可确保当一封电子邮件无法发送并继续发送其他邮件时,应用程序不会崩溃。
此外,您应在 Send()
功能中使用SendAsync()
代替Send()
。这是因为SendAsync
函数启动了一个用于发送邮件的新线程,而Send将停止执行程序,直到邮件被发送为止。您不应该使用SendAsync
功能的另一个原因是因为根据微软一次只能发送一封邮件。这意味着使用SendAsync函数超过1个邮件将导致它抛出异常。