【问题标题】:How to confirm that mail has been delivered or not?如何确认邮件是否已送达?
【发布时间】:2011-10-29 00:50:38
【问题描述】:

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

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);

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

【问题讨论】:

  • 那么您需要电子邮件中的链接,收件人单击该链接返回到 URL 或 Web 服务以确保
  • 送达是什么意思?将邮件发送给主机或确认收件人已阅读邮件?

标签: c# system.net.mail


【解决方案1】:

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

【讨论】:

  • 显然不正确! SMTP 不保证交付。正如任何人都知道的那样,几周后收到了一张无法送达的票......
  • 但是,如果有任何 emailid 被退回,它不会显示任何异常......我已经检查了很多次......有没有办法获得退回 mailerID
  • 是通过 smtp 邮件本身获取它的任何方式
【解决方案2】:

您可以将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

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

【讨论】:

  • @Blindy:这绝对不可靠,因为只有在收件人允许的情况下才会发送此通知(大多数邮件客户端都是这样做的)。这与发回电子邮件相同:“谢谢,知道了”。
  • 你仍然错过了总比没有好的部分。
【解决方案3】:

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

  1. 无法保证您的消息在您致电smtp.Send() 后立即发送。
  2. 由于 SMTP 是路由,因此您无法确定路由上的某些节点不会因传递到上行链路而失败。

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2014-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多