1

当我用 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功能上,为什么会发生这种情况?

4

1 回答 1

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()而不是。这是因为该函数启动了一个新线程来发送邮件,而 Send 将停止您的程序执行,直到邮件发送完毕。您不应该使用该功能的另一个原因是,根据微软的说法,一次只能发送一封邮件。这意味着对超过 1 封邮件使用 SendAsync 函数将导致它引发异常。SendAsync()Send()SendAsyncSendAsync

于 2013-12-04T13:48:56.597 回答