如何确认邮件已经发送或没有?

下面是我的编码,只是看看它

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%可靠的。 这只是一个select。

以下是确保电子邮件传送能力的一些最佳实践:

  • 将单个无回复地址设置为实际收件箱,然后使用pop3进入电子邮件帐户并查找退回邮件。
  • validation电子邮件地址是否有效,然后使用类似此电子邮件validation库的方式发送:

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

如果有人绊倒。 这是我在旧的Win 2003服务器上使用Exchange的经验。 我的.Net应用程序使用SMTP发送电子邮件,并使用组地址作为“发件人”,因此任何回复都将发送到整个组。 这是一个调度操作,我们希望小组中的任何人协助任何答复。 我们预计任何未交付的通知将被发送给该组。 这不会发生。 我甚至进入了邮件追踪,看到交换所说它把通知发给了这个组织,但他们从来没有收到过。 接下来,我进入了SMTP虚拟服务器属性,并在“发送未送达报告的副本到:”中input了组电子邮件地址。 同样的结果,消息跟踪表示它将它发送到组,但它从来没有交付。 显然,未送达通知只会传送给个人的电子邮件地址,而不是群组。 我把它改成了一个单独的地址,它的工作原理。

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

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

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

另一个select是创build一个捕获所有“noreply”电子邮件地址,并发送您的电子邮件与包含在发件人电子邮件ID,即noreply-bounces-32432@bounces.mydomain.com和使用POP3阅读器来检查收件箱返回电子邮件。 使用“发件人”中的电子邮件ID可以确定哪个电子邮件未能发送。 你也可以做一些过滤,确定它是否“无法提供”或者只是一个“不在办公室”types的答复。

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