0

我正在开发一个用于发送电子邮件的 asp.net 应用程序。我想确保如果出现问题,它会记录错误并移至下一条记录。我正在使用 SmtpClient 类发送电子邮件。但是现在,如果某些电子邮件地址有误,它就会崩溃。如何强制它移动到下一条记录?

我的代码是这样的:

 var EmailsQueue = context.WC_EmailToolQueue.Where(t => t.EmailDate == null).ToList();

            foreach (var email in EmailsQueue)
            {
                MailMessage message = new MailMessage();
                message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail);
                message.To.Add(new MailAddress(email.Email));
                message.Body = body;
                message.IsBodyHtml = true;
                message.Subject = subject;

                using (SmtpClient smtp = new SmtpClient
                {
                    Host = email.WC_EmailToolTemplates.Host, 
                    Port = email.WC_EmailToolTemplates.Port,  
                    Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass), 
                    EnableSsl = email.WC_EmailToolTemplates.EnableSSL 
                })
                   try
                {
                    smtp.Send(message);
                }
                catch (Exception ex) {

                }
                }

问候, 阿西夫·哈米德

4

3 回答 3

2

使用 Try/Catch 捕获异常。

try
{
    // Send Email code
}
catch (Exception ex) //Or specific exceptions
{
    Log(ex.ToString());
}
于 2012-06-29T15:35:23.463 回答
0

你可以使用一个try catch块。如果地址格式无效,Add函数将抛出错误。如果需要,您也可以记录它

   try
    {
         message.To.Add(new MailAddress(email.Email));
    }
    catch (FormatException ex)
    {
        //If you want you may log it here
    }

编辑:根据 OP 的问题编辑。

下面的代码将跳过向那些有问题的项目(地址错误等)发送电子邮件。但循环执行剩余的项目

foreach (var email in EmailsQueue)
{
    MailMessage message = new MailMessage();
    try
    {
        message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail);
        message.To.Add(new MailAddress(email.Email));            
        message.Body = body;
        message.IsBodyHtml = true;
        message.Subject = subject;

        using (SmtpClient smtp = new SmtpClient
        {
            Host = email.WC_EmailToolTemplates.Host,
            Port = email.WC_EmailToolTemplates.Port,
            Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass),
            EnableSsl = email.WC_EmailToolTemplates.EnableSSL
        })
        smtp.Send(message);
    }
    catch (Exception ex)
    {
        //error in sending email to one item in collection
        //Log it ig you want .Foreach will continue with remaining items    
    }
}
于 2012-06-29T15:36:48.610 回答
0

只需将一些日志记录到您已经拥有的内容的 catch 块中。然后 foreach 循环将继续到下一条记录:

var EmailsQueue = context.WC_EmailToolQueue.Where(t => t.EmailDate == null).ToList();

    foreach (var email in EmailsQueue)
    {
        MailMessage message = new MailMessage();
        message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail);
        message.To.Add(new MailAddress(email.Email));
        message.Body = body;
        message.IsBodyHtml = true;
        message.Subject = subject;

        using (SmtpClient smtp = new SmtpClient
        {
            Host = email.WC_EmailToolTemplates.Host,
            Port = email.WC_EmailToolTemplates.Port,
            Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass),
            EnableSsl = email.WC_EmailToolTemplates.EnableSSL
        })
            try
            {
                smtp.Send(message);
            }
            catch (Exception ex)
            {
                //log the error here <--------
            }
    }
于 2012-06-29T15:57:13.250 回答