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

既に持っているものの 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 に答える
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 に答える