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

时间:2011-08-17 15:10:06

标签: 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());
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);

我需要检查邮件是否已发送。

6 个答案:

答案 0 :(得分:19)

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

  1. 一旦致电smtp.Send(),我们无法保证您的消息会被发送。
  2. 由于SMTP 路由,您无法确定路由上的某个节点是否会因传送到上行链路而失败。

答案 1 :(得分:9)

您可以将DeliveryNotificationOptions的{​​{1}}属性设置为MailMessage

此处有更多相关信息: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%可靠。这只是一个选择。

答案 2 :(得分:1)

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

  • 设置一个无回复地址作为实际收件箱,然后进入 电子邮件帐户使用pop3并查找退回邮件。
  • 在使用某些内容发送电子邮件地址之前,请验证其是否有效 像这个电子邮件验证库:

http://www.kellermansoftware.com/p-37-net-email-validation.aspx

答案 3 :(得分:1)

万一有人偶然发现。这是我在使用Exchange的旧Win 2003服务器上的经验。我的.Net应用程序使用SMTP发送电子邮件并使用组地址作为“发件人”,因此任何回复都将发送给整个组。这是一个调度操作,我们希望小组中的任何人都能协助处理任何回复。我们希望将任何未送达通知发送给该组。它不会发生。我甚至进入了消息跟踪,并看到Exchange表示已将通知发送给该组,但他们从未得到过。接下来,我进入了SMTP虚拟服务器属性,并在“将未送达报告的副本发送到:”中输入了组电子邮件地址。同样的结果,消息跟踪说它将它发送给组但它从未交付。显然,非送达通知仅会发送到非个人的电子邮件地址。我把它改成了一个单独的地址,然后就可以了。

答案 4 :(得分:0)

如果您的代码或SMTP服务器上没有收到任何例外,您可以认为它已经发送。这是电子邮件的问题,没有办法保证交付。

答案 5 :(得分:0)

如果您有权访问包含SMTP日志的服务器,则根据所使用的服务器类型和使用的详细程度,您可以更好地了解交付的实际成功。

例如,如果您使用的是SmarterMail,则可以编写一个简单的解析器来读取smtp日志并向您的应用程序报告。并不是说这不应该是阻止操作,就像你的电子邮件是灰名单一样,它可能需要几分钟才能交付。

另一种选择是创建一个捕获所有“noreply”电子邮件地址,并使用发件人中包含的电子邮件ID发送您的电子邮件,即noreply-bounces-32432@bounces.mydomain.com并使用pop3阅读器检查用于退回电子邮件的收件箱。使用“发件人”中的电子邮件ID,您可以确定哪些电子邮件无法发送。你也可以做一些过滤确定它是“无法交付”还是仅仅是“不在办公室”类型的回复。

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