C# 如何确认邮件是否已送达?

C# 如何确认邮件是否已送达?,c#,system.net.mail,C#,System.net.mail,下面是我的代码,请看一看 System.Net.Mail.MailMessage oMail = new System.Net.Mail.MailMessage(); System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(); oMail.From = new System.Net.Mail.MailAddress("one@gmail.com"); oMail.To.Add(TextBox1.Text.Trim());

下面是我的代码,请看一看

System.Net.Mail.MailMessage oMail = new System.Net.Mail.MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
oMail.From = new System.Net.Mail.MailAddress("one@gmail.com");
oMail.To.Add(TextBox1.Text.Trim());
oMail.Subject = "Subject*";
oMail.Body = "Body*";
oMail.IsBodyHtml = true;
smtp.Host = "smtp.sendgrid.net";
System.Net.NetworkCredential cred = new System.Net.NetworkCredential("myusername", "mypassword");
smtp.UseDefaultCredentials = false;
smtp.Credentials = cred;
smtp.Send(oMail);

在这里,我需要检查邮件是否已送达。

如果您的代码或SMTP服务器上没有收到任何异常,则可以假定邮件已送达。这是电子邮件的问题,无法保证传递。

您可以将
MailMessage
DeliveryNotificationOptions
属性设置为
OnSuccess

这里有更多信息:

在这里:


正如评论中所指出的,该方法并非100%可靠。这只是一种选择。

你不能。由于您使用SMTP,在一般情况下,无法判断传递是否成功。阅读SMTP规范。邮件在传递时路由,因此:

  • 无法保证您的邮件会在您调用
    smtp.Send()
    时立即发送
  • 由于SMTP已路由,因此无法确保路由上的某些节点不会在向上行传输时失败

  • 如果您有权访问包含SMTP日志的服务器,则根据使用的服务器类型和使用的详细程度,您可能能够更好地了解传递的实际成功程度

    例如,如果您正在使用SmarterMail,您可以编写一个简单的解析器来读取smtp日志并向应用程序报告。并不是说这不应该是一个阻止操作,因为如果你的电子邮件是灰色列表,它可能需要很多分钟才能送达

    另一个选择是创建一个全面的“noreply”电子邮件地址,并使用发件人ie noreply bounces中包含的电子邮件id发送电子邮件-32432@bounces.mydomain.com并使用pop3阅读器检查收件箱中是否有返回的电子邮件。使用“发件人”中的电子邮件id,您可以确定哪些电子邮件未能发送。您还可以进行一些筛选,以确定这是“无法交付”还是仅仅是“外出”类型的回复


    有很多选项可供选择,这取决于您想投入多少精力。

    以下是一些确保电子邮件可交付性的最佳做法:

    • 将单个无回复地址设置为实际收件箱,然后进入 使用pop3创建电子邮件帐户并查找回复邮件
    • 在您使用某些东西发送电子邮件之前,请验证电子邮件地址是否有效 与此电子邮件验证库类似:

    以防有人无意中发现。以下是我使用Exchange在旧的Win 2003服务器上的体验。我的.Net应用程序使用SMTP发送电子邮件,并使用组地址作为“发件人”,因此任何回复都将发送到整个组。这是一个调度操作,我们希望组中的任何人都能协助回复。我们希望向集团发送任何未交货通知。它不会发生。我甚至进入邮件跟踪,看到Exchange说它向该组发送了通知,但他们从未收到。接下来,我进入SMTP虚拟服务器属性,并在“将未送达报告副本发送到:”中输入组电子邮件地址。同样的结果是,邮件追踪显示它将邮件发送给了该组,但从未发送过。显然,未送达通知将只发送到个人而不是团体的电子邮件地址。我把它改成了一个单独的地址,它可以正常工作。

    显然不正确!SMTP不是保证的传递。正如任何人都知道的那样,几周后他收到了一张无法交付的罚单……但是,如果任何emailid被反弹,它不会显示任何异常..我已经检查了很多次..是否有任何方法可以获取反弹邮件ID或通过smtp邮件消息获取反弹邮件ID?那么您需要在电子邮件中添加一个链接,收件人可以单击返回URL或web服务,以确定发送是什么意思?将邮件发送到主机或确认收件人已阅读邮件?@Blindy:这绝对不可靠,因为只有在recepient允许的情况下才会发送此通知(大多数邮件客户端都是这样做的)。这和发回一封电子邮件一样:“谢谢,明白了”。你仍然错过了它总比什么都没有好的部分。