有没有办法检查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);
}
答案 0 :(得分:4)
不,没有可靠的方法来确定是否确实传递了消息。
这样做需要访问您发送电子邮件的每个人的最终SMTP服务器。
如果没有例外,您可以假设SMTP服务器尽力发送电子邮件。
答案 1 :(得分:0)
由于电子邮件的工作方式, 100%无法确保在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(“<>”)反向路径发送通知 信封。此通知的收件人必须是来自的地址 信封返回路径(或返回路径:行)。