如何确认邮件是否已经送达

本文关键字:是否 何确认 确认 | 更新日期: 2023-09-27 18:05:47

下面是我的代码,看看吧

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,因此在一般情况下,无法判断传递是否成功。阅读SMTP规范。邮件在发送时被路由,因此:

  1. 不能保证您的消息在您呼叫smtp.Send()时立即发送。
  2. 由于SMTP是路由的,您不能确定路由上的某些节点不会在发送到上行链路时失败。

可以设置MailMessageDeliveryNotificationOptions属性为OnSuccess

在这里有更多的信息:http://msdn.microsoft.com/en-us/library/system.net.mail.deliverynotificationoptions.aspx

和这里:http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.deliverynotificationoptions.aspx

正如在评论中指出的那样,这种方法不是100%可靠的。这只是一个选项。

以下是一些确保邮件可送达的最佳做法:

  • 设置一个无回复地址作为实际的收件箱,然后进入使用pop3的电子邮件帐户并查找反弹消息。
  • 在您使用某些东西发送之前验证电子邮件地址是否有效像这样的电子邮件验证库:
http://www.kellermansoftware.com/p-37-net-email-validation.aspx

以防有人偶然发现。以下是我在一台旧的win2003服务器上使用Exchange的经验。我的。net应用程序使用SMTP发送电子邮件,并使用组地址作为"发件人",因此任何回复都将发送到整个组。这是一次调度行动,我们希望小组中的任何人都能协助回复。我们预计任何未交货通知都将发送给该集团。它不会发生。我甚至进入了消息跟踪,看到Exchange说它向小组发送了通知,但他们从未收到过。接下来,我进入SMTP虚拟服务器属性,并在"发送未交付报告副本到:"中输入组电子邮件地址。同样的结果,消息跟踪说它发送给了小组,但从来没有发送过。显然,非送达通知将只发送到个人的电子邮件地址,而不是一个团体。我把它改成了一个单独的地址,它工作了

如果在您的代码或SMTP服务器上没有收到任何异常,则可以假定它已被传递。这是电子邮件的一个问题,没有办法保证交付。

如果您可以访问包含SMTP日志的服务器,根据所使用的服务器类型和所使用的详细级别,您可能能够更好地了解交付的实际成功情况。

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

另一个选择是创建一个捕获所有"不回复"的电子邮件地址,并发送包含在发件人的电子邮件id (noreply-bounces-32432@bounces.mydomain.com)和使用pop3阅读器来检查收件箱返回的电子邮件。使用"发件人"中的电子邮件id可以找出发送失败的电子邮件。您还可以进行一些过滤,以确定它是"无法交付"还是仅仅是"不在办公室"类型的回复。

有很多选择,只是取决于你想投入多少汗水。