如何检查是否电子邮件是用C#MAILMESSAGE [复制]发表(How to check if e

2019-07-30 08:03发布

这个问题已经在这里有一个答案:

  • 如何确认邮件已送达或不? 6个回答

我使用下面的代码来发送电子邮件,它工作正常的大部分时间和测试过程中,我们发现有时不提供电子邮件。 我怎样才能改变这种代码来检查电子邮件传递状态或字体的任何其他故障。

        public static void SendEmail(string to, string subject, string message, bool isHtml)
        {
            try
            {
            var mail = new MailMessage();

            // Set the to and from addresses.
            // The from address must be your GMail account
            mail.From = new MailAddress("noreplyXYZ@gmail.com");
            mail.To.Add(new MailAddress(to));

            // Define the message
            mail.Subject = subject;
            mail.IsBodyHtml = isHtml;
            mail.Body = message;

            // Create a new Smpt Client using Google's servers
            var mailclient = new SmtpClient();
            mailclient.Host = "smtp.gmail.com";//ForGmail
            mailclient.Port = 587; //ForGmail


            // This is the critical part, you must enable SSL
            mailclient.EnableSsl = true;//ForGmail
            //mailclient.EnableSsl = false;
            mailclient.UseDefaultCredentials = true;

            // Specify your authentication details
            mailclient.Credentials = new System.Net.NetworkCredential("noreplyXYZ@gmail.com", "xxxx123");//ForGmail
            mailclient.Send(mail);
            mailclient.Dispose();
    }
                    catch (Exception ex)
                    {
    throw ex;
                        }
    }

我知道SMTP是负责发送电子邮件和它是不可能到交货状态,但他们是围绕一个方法来检查电子邮件传递的状态

更新后的代码 (这是正确的)

public static void SendEmail(string to, string subject, string message, bool isHtml)
{
    var mail = new MailMessage();

    // Set the to and from addresses.
    // The from address must be your GMail account
    mail.From = new MailAddress("noreplyXYZ@gmail.com");
    mail.To.Add(new MailAddress(to));

    // Define the message
    mail.Subject = subject;
    mail.IsBodyHtml = isHtml;
    mail.Body = message;

    // Create a new Smpt Client using Google's servers
    var mailclient = new SmtpClient();
    mailclient.Host = "smtp.gmail.com";//ForGmail
    mailclient.Port = 587; //ForGmail

    mailclient.EnableSsl = true;//ForGmail
    //mailclient.EnableSsl = false;
    mailclient.UseDefaultCredentials = true;

    // Specify your authentication details
    mailclient.Credentials = new System.Net.NetworkCredential("noreplyXYZ@gmail.com", "xxxx123");//ForGmail
    mailclient.Send(mail);
    mailclient.Dispose();
    try
    {
        mailclient.Send(mail);
        mailclient.Dispose();
    }
    catch (SmtpFailedRecipientsException ex)
    {
        for (int i = 0; i < ex.InnerExceptions.Length; i++)
        {
            SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
            if (status == SmtpStatusCode.MailboxBusy ||status == SmtpStatusCode.MailboxUnavailable)
            {
                // Console.WriteLine("Delivery failed - retrying in 5 seconds.");
                System.Threading.Thread.Sleep(5000);
                mailclient.Send(mail);
            }
            else
            {
                //  Console.WriteLine("Failed to deliver message to {0}", ex.InnerExceptions[i].FailedRecipient);
                throw ex;
            }
        }
    }
    catch (Exception ex)
    {
        //  Console.WriteLine("Exception caught in RetryIfBusy(): {0}",ex.ToString());
        throw ex;
    }
    finally
    {
        mailclient.Dispose();
    }

}

Answer 1:

那么,你有包裹在一个代码整个身体try块用空的catch块。 因此,如果消息无法发送不管什么原因,你会不知道 ,因为你的函数将简单地返回。

如果你看一下MSDN文档SmtpClient.Send你会发现有许多不同的例外它可以抛出各种原因的。 一对夫妇有趣的:

  • SmtpException
  • SmtpFailedRecipientsException

一对夫妇的你更新后的注意事项:

你可能不意味着这样做:

mailclient.Send(mail);
mailclient.Dispose();
try
{
    mailclient.Send(mail);
    mailclient.Dispose();
}

你处置mailclient试图再次使用它之前。

using

MailMessageSmtpClient都实现IDisposable ,所以这将是最佳实践(和最简单的),把他们在一个using块:

using (var mail = new MailMessage())
using (var mailclient = new SmtpClient())
{
    // ...
}

然后,你将不必担心调用Dispose()在你的finally块(你可能不需要他们都那么)。

throw

你可能知道,但没有点:

catch (Exception ex)
{
    throw ex; 
}

foreach

for (int i = 0; i < ex.InnerExceptions.Length; i++)
{
    SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
    // ... 
}

可以重新写为:

foreach (var innerEx in ex.InnerExceptions)
{
    var status = innerEx.StatusCode;
}

Thread.Sleep()

如果这个代码是面向用户的,你可能真的不希望这样做,因为它会导致页面挂5秒等待发送。 在我看来,你不应该处理直接在网页代码发送邮件无论如何,你应该排队它的后台任务发送。 但是,这是一个完全不同的问题。

只需几件事情让您有一个更好的C#编码器。



Answer 2:

这听起来像你问如果有实时的方式来检查,看看是否你的用户得到的消息。 如果是的话,我建议你不追求这条道路。 虽然大多数时候发送的电子邮件似乎是瞬间的,它可以被传递到收件人的邮箱之前持股待涨的任何时间的长短。

我建议你去通过下面的asp.net论坛链接:
SMTP服务器和电子邮件常见问题解答
交货通知发送电子邮件时,无法正常工作
最佳实践做检查落实,如果电子邮件发送

注意: 这里是要找出如果消息确实传递没有可靠的方法。

还有另外SO线程已经availalbe你问我:
如何MAILMESSAGE检查在.NET交付?
ASP.NET MVC如何确定电子邮件没有到达接收器



文章来源: How to check if email was delivered using C# MailMessage [duplicate]