如何检查MailMessage是否在.NET中提供?

时间:2011-02-11 20:31:35

标签: asp.net smtpclient

有没有办法检查SmtpClient是否成功发送了电子邮件? SmtpClient.Send()似乎不返回异常以外的任何内容。因此,如果方法完成,可以安全地假设电子邮件将成功发送到相应的电子邮箱吗?我的代码如下:

MailMessage emailMessage = new MailMessage();
emailMessage.Subject = SubjectText;
emailMessage.IsBodyHtml = IsBodyHtml;
emailMessage.Body = BodyText;
emailMessage.From = new MailAddress(Settings.Default.FromEmail,Settings.Default.FromDisplayName);

//add recipients
foreach (string recipientAddress in RecipientAddresses.Split(new char[{','},StringSplitOptions.RemoveEmptyEntries))

emailMessage.To.Add(recipientAddress);

using (SmtpClient smtpClient = new SmtpClient())
{
smtpClient.Send(emailMessage);
}

4 个答案:

答案 0 :(得分:4)

不,没有可靠的方法来确定是否确实传递了消息。

这样做需要访问您发送电子邮件的每个人的最终SMTP服务器。

如果没有例外,您可以假设SMTP服务器尽力发送电子邮件。

答案 1 :(得分:0)

由于电子邮件的工作方式, 100%无法确保在SmtpClient发送邮件时收到邮件。 SmtpClient不会引发异常的事实本质上意味着你已经做好了所有事情,但是失败可能发生在下一行,例如:

  • 接收邮件服务器可以拒绝邮件
  • 中间邮件服务器可以拒绝邮件
  • SmtpClient正在传输邮件的服务器可能决定拒绝传输邮件

答案 2 :(得分:0)

您可以使用的一种解决方案是为您的网站图像创建一个httphandler。如果您发送包含至少1个图像的HTML消息,则可以将查询字符串数据嵌入到该图像的末尾。这甚至可能像1x1透明图像。当用户阅读电子邮件时,会将请求发送到服务器以获取图像数据,反过来,您可以捕获该请求并表示该消息已被读取。

但这并非防弹,因为大多数电子邮件客户端默认阻止图像,除非用户指定他们想要查看电子邮件中的图像。

答案 3 :(得分:0)

如果收件人的电子邮件地址有效,则无法立即获得有关成功传递邮件的返回值;看签名:

public void Send(MailMessage message)

只要收件人电子邮件地址无效/伪造,SMTP服务器就会立即通过“无法送达”通知通知发件人(或您为通知指定的任何人)。

SMTP服务器需要定期重试传递。当收件人电子邮件地址是有效地址但由于某种原因SMTP服务器无法传递邮件时,如果SMTP服务器在一段时间后无法传递邮件,则会向发件人返回失败邮件。

RFC 2821包含更多详细信息。

从2.1基本结构

开始
  

换句话说,消息传输可以在单个连接中进行   原始SMTP发件人和最终SMTP收件人之间,或者可以   通过中间系统发生在一系列跳跃中。在任何一个   在这种情况下,对消息负责的正式移交:   协议要求服务器接受的任何一项责任   发送消息或正确报告未能执行此操作。

见4.5.4和4.5.5节

从6.1节可靠传递和电子邮件回复

  

如果在接受消息后发送失败,则   receiver-SMTP必须制定并邮寄通知消息。这个   必须使用null(“<>”)反向路径发送通知   信封。此通知的收件人必须是来自的地址   信封返回路径(或返回路径:行)。