问题 SMTP中的传递通知


下面的代码工作正常。但是我需要将失败或成功通知发送到特定地址(b@technospine.com)。但是我收到了送货通知邮件到FromMail地址(A@technospine.com)。你能帮我解决这个问题吗?

SmtpClient smtpClient = new SmtpClient();

MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("A@technospine.com", "BALA");
MailAddress adminAddress = new MailAddress("b@technospine.com");

smtpClient.Host = "Mail Server Name";
smtpClient.Port = 25;
smtpClient.UseDefaultCredentials = true; 

message.From = fromAddress;
message.To.Add(_sendTo); //Recipent email
message.Subject = _subject;
message.Body = _details;
message.IsBodyHtml = true;


message.Headers.Add("Disposition-Notification-To", "b@technospine.com");

message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;

message.ReplyTo = adminAddress;

smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Send(message);

1915
2017-10-09 06:09


起源

要获取失败或成功通知,请尝试按位组合:message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure;要获取特定地址的通知,请尝试使用message.ReplyToList属性来指示除用于回复消息的From地址之外的地址列表。 - Only You


答案:


简短的回答是你所要求的不能以你所假设的直接方式完成。

这只适用于某些条件。最容易描述的是,如果您用来发送邮件的SMTP服务器与承载收件人电子邮件域的服务器(设置smtpClient的.HOST属性时引用的服务器)相同。因此,如果您只是发送给本地SMTP邮件服务器上的收件人,那么这可能非常可靠。但这取决于所使用的特定SMTP服务器软件,也可能取决于它的配置方式。

要解释原因,您必须意识到只有最后一个接收实际托管所需电子邮件地址的邮件的SMTP邮件服务器才能权威地回答问题,这是一个有效的电子邮件地址。如果消息必须通过任何其他电子邮件服务器来获取此最终权威服务器,则必须将消息从一个服务器顺序切换到链中的下一个服务器,直到它到达最终的权威服务器。这意味着没有可靠的方法来验证特定地址。再加上一些域被配置为充当黑洞并吞下非法处理邮件的事实,您可以看到有很多原因导致您无法依赖该方法。

因此,许多到外部域的邮件必须至少打到一个单独的SMTP服务器,并且根据服务器如何回复或转发邮件,它将确定任何特定接收域的结果。事实上,监视退回邮件的FROM地址并不是万无一失的,因为我之前关于某些主机将某些消息放入黑洞的评论如果看起来没有效果。


11
2017-10-09 22:26





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

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(“<>”)反向路径发送通知   信封。此通知的收件人必须是来自的地址   包络返回路径(或返回路径:行)。


1
2018-04-14 20:28





根据 MSDN .Send会抛出一个 SmtpFailedRecipientsException 编辑:如果MESSAGE无法发送给一个或多个收件人。您可以在异常中找到有关失败收件人属性中的哪一个的信息。 因此,如果您尝试捕获该异常并验证您在异常中寻找的地址,那可能会有所帮助。


-1
2017-10-09 21:48



请重读文档:MSDN不是在谈论“发现与否”。该 Send 方法不检查地址是否存在。它只是检查地址是否有效(语法上讲)。该 Send 方法不能保证分发,因此使用SmtpFailedRecipientsException并不代表所有分发成功或失败。 - JYL