Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SMTP中的传递通知_C#_.net_Smtp - Fatal编程技术网

C# SMTP中的传递通知

C# SMTP中的传递通知,c#,.net,smtp,C#,.net,Smtp,下面的代码工作正常。然而,我需要得到失败或成功通知的具体地址(b@technospine.com). 但我收到的是从邮件地址发来的送货通知邮件(A@technospine.com). 你能帮我解决这个问题吗 SmtpClient smtpClient = new SmtpClient(); MailMessage message = new MailMessage(); MailAddress fromAddress = new MailAddress("A@technospine.com",

下面的代码工作正常。然而,我需要得到失败或成功通知的具体地址(b@technospine.com). 但我收到的是从邮件地址发来的送货通知邮件(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);
根据。发送将抛出一个编辑:如果邮件无法传递给一个或多个收件人。您可以在异常中的Failed Recipient属性中找到有关哪一个的信息。
因此,如果您尝试捕获该异常并验证您在该异常中查找的地址,这可能会有所帮助。

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

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

为了解释原因,您必须意识到,只有最后一个接收到实际承载所需电子邮件地址的邮件的SMTP邮件服务器才能权威性地回答以下问题:这是有效的电子邮件地址吗。如果邮件在到达最终权威服务器的过程中必须通过任何其他电子邮件服务器,则必须按顺序将邮件从链中的一个服务器传递到下一个服务器,直到到达最终权威服务器。这意味着没有一种保证对特定地址进行身份验证的方法。再加上一些域被配置成黑洞并吞下非法寻址的邮件,您可以看到有很多原因导致您无法依赖该方法


因此,许多发送到外部域的邮件将必须至少命中一个单独的SMTP服务器,并且取决于该服务器如何应答或转发邮件,它将确定任何特定接收域的结果。事实上,监视发件人地址是否有被反弹的邮件也不是万无一失的,因为我之前的评论是,如果某些主机将某些邮件放入黑洞,但这些邮件似乎无效。

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

public void Send(MailMessage message)
每当收件人电子邮件地址无效/伪造时,SMTP服务器几乎会立即以“无法送达”通知通知发件人(或您为通知指定的任何人)

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

RFC2821包含更多详细信息

来自第2.1节基本结构

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

见第4.5.4节和第4.5.5节

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

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


要获取失败或成功通知,请尝试按位组合:message.DeliveryNotificationOptions=DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure;若要获取到特定地址的通知,请尝试message.ReplyToList属性,以指示用于回复邮件的发件人地址以外的地址列表。请重新阅读文档:MSDN不是指“找到或不找到”。
Send
方法不检查地址是否存在。它只是检查地址是否有效(说syntaxicaly)。
Send
方法不能保证分发,因此使用SmtpFailedRecipientsException不能代表分发的成功或失败。