2011-08-17 465 views
12

下面是我的编码,只需看看它如何确认邮件是否已发送?

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("[email protected]"); 
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); 

在这里,我需要检查邮件是否已交付与否。

+0

那么你需要一个电子邮件中的链接,收件人点击回到URL或网络服务,以确保 –

+0

你是什么意思交付?将邮件发送给主持人或确认接收者阅读邮件? –

回答

19

你不能。由于您使用SMTP,通常情况下,无法确定传递是否成功。阅读SMTP规范。邮件在发送时会被路由,因此:

  1. 无法保证一旦您致电smtp.Send()即发送邮件。
  2. 由于SMTP是路由,您不能确定路由上的某个节点不会因传递到上行链路而失败。
0

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

+0

显然不正确! SMTP不是保证交付。正如任何人都知道几周后收到不可交付的票... –

+0

但是,如果有任何emailid反弹它不显示任何异常..我已经检查了很多次...有什么办法可以得到反弹mailerID –

+0

不是来自这个代码,没有。 –

8

您可以将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%可靠。这只是一个选择。

+4

这不是100%可靠。 – agibalov

+2

比其他两个答复更可靠,它绝对没有什么... – Blindy

+0

Blindy:不正确。 –

0

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

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

另一种选择是创建一个所有“noreply”电子邮件地址的捕获,并发送您的电子邮件与发件人中包含的电子邮件ID,即[email protected]并使用pop3阅读器来检查返回电子邮件的收件箱。使用“发件人”中的电子邮件ID可以计算出哪些电子邮件未能发送。你也可以做一些过滤来确定它是否“无法提供”或者仅仅是“不在办公室”类型的回复。

很多可用的选项,只取决于你想投入多少汗水。

1

下面是保证电子邮件产能的最佳做法:

  • 建立一个没有回复地址作为一个实际的收件箱中,然后使用POP3进入 的电子邮件帐户,并寻找反弹的消息。
  • 验证的电子邮件地址是有效的,你使用的东西 这样的电子邮件验证库发送前:

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

1

如果有人越过绊倒。这是我在使用Exchange的旧版Win 2003服务器上的体验。我的.Net应用程序使用SMTP发送电子邮件,并使用组地址作为“发件人”,因此任何回复都会发送到整个组。这是一项调度操作,我们希望小组中的任何人协助回复。我们预计任何未送达通知将发送给该​​组。它不会发生。我甚至进入了邮件追踪,看到Exchange表示它已将通知发送给该组,但他们从未得到它。接下来,我进入了SMTP虚拟服务器属性,并在“发送未送达报告副本到:”中输入了组电子邮件地址。同样的结果,消息跟踪表示它将它发送给组,但它从未交付。显然,未送达通知只会发送给个人而不是群组的电子邮件地址。我将其更改为个人地址并且可以正常工作。

相关问题