15

下面的代码工作正常。但是,我需要将失败或成功通知发送到特定地址 (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);
4

3 回答 3

14

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

这仅在某些条件下有效。最容易描述的是,如果您用于发送邮件的 SMTP 服务器与托管收件人电子邮件消息的域的服务器相同(您在设置 smtpClient 的 .HOST 属性时引用的服务器)。因此,如果您只向本地 SMTP 邮件服务器上的收件人发送邮件,那么这可能会非常可靠。但这取决于正在使用的特定 SMTP 服务器软件,并且可能还取决于它的配置方式。

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

因此,许多发往外部域的邮件将必须至少到达一个单独的 SMTP 服务器,并且取决于该服务器如何回答或转发邮件,它将确定任何特定接收域的结果。事实上,监控 FROM 地址以查找退回的消息也不是万无一失的,正如我之前关于某些主机将一些看起来无效的消息放入黑洞的评论一样。

于 2012-10-09T22:26:27.083 回答
2

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

public void Send(MailMessage message)

每当收件人电子邮件地址无效/伪造时,SMTP 服务器将几乎立即通过“无法投递”通知通知发件人(或您为通知指定的任何人)。

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

RFC 2821 包含更多细节。

从第 2.1 节基本结构

换句话说,邮件传输可以发生在原始 SMTP 发件人和最终 SMTP 收件人之间的单个连接中,也可以发生在通过中间系统的一系列跃点中。在任何一种情况下,都会发生对消息的正式责任移交:协议要求服务器承担传递消息或正确报告失败的责任。

请参阅第 4.5.4 和 4.5.5 节

来自第 6.1 节的可靠交付和电子邮件回复

如果在接受消息后出现传递失败,接收方 SMTP 必须制定并发送通知消息。此通知必须使用信封中的空(“<>”)反向路径发送。此通知的接收者必须是信封返回路径(或 Return-Path: 行)中的地址。

于 2014-04-14T20:28:36.203 回答
0

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

于 2012-10-09T21:48:16.650 回答