如何处理SMTP超时

如何处理SMTP超时

问题描述:

我正在使用用C#编写的客户端应用程序向群集交换服务器发送批量电子邮件。如何处理SMTP超时

它可以发生,它做到了,客户端应用程序超时(而不是服务器)。 由于无法知道服务器是否完成了请求,因此如何处理这种情况下的重试?

没有参与IDS,可能是使用,以避免重复。 设置长时间超时甚至无限超时并不是一个好策略。

我使用重试指数退避算法。在这种情况下,它应该只发送一个副本,因为它将在下次等待更长时间。

我认为没有子弹教授解决方案。无论如何,因为这是第一个这样的项目,我需要检查是否有人有我想念的解决方案。

更新: 交换机正在进行中继。我正在使用SmtpClient发送电子邮件。 问题是服务器可以发送250 Ok消息,但接收方永远不会获取它,然后再试一次。这是我在这篇文章中试图解决的唯一问题。

在REST服务推荐的方法是使用并发错误。如果客户端发布内容并获得“409 - 冲突”状态,这意味着该消息已存储在服务器上。但是为了实现这个目标,必须有一个由客户端创建的消息的关键字,并且是消息的一部分。 SMTP似乎没有可以防止这种情况的机制。

通常SMTP服务器会给你一个信息,如果他接受电子邮件或不使用标准的SMTP时。这是通过telnet一个例子:

enter image description here enter image description here

所以,你的应用程序只需要在这里跟踪响应,如果一个timesout发生,你并不需要所有的电子邮件来进行,需要拿起停止的地方。顺便说一句,你的应用程序应该检查每次响应,因为它可能是发送者或接收者isn't接受...

RFC 5321提到(您可以在文档中滚动):

当接收SMTP接受片邮件(通过发送响应于数据A“250 OK”消息),则接受用于递送或中继该消息的责任 。它必须认真对待这个责任。绝不能失去,因为可预测的资源短缺的 轻浮的原因,比如因为主机后崩溃或 消息。 [...]当文本结束被成功接收并存储时,SMTP接收器发送一个“250 OK”回复。

当你发送电子邮件,我认为部分4.5.4.1。如果你没有使用某种处理外发电子邮件符合RFC的框架,这可能很重要。

例如:您的客户端生成的电子邮件,但该从身体提交(最后一部分从电子邮件传输)期间连接中断。然后,服务器不能继续发送电子邮件。从技术上讲,他可能会得到所有的信息,但RFC不允许他在客户端暂停时发送出去,并且没有完成整个过程。

更新: 最好的方法是使用C# SmtpClient method然后检查smtpStatusCode OK(=“电子邮件成功发送到SMTP服务。”),你可以在远程登录的例子看,以及。方法在这里没有做任何事情(技术上)。该方法也符合RFC 5321,因此您不需要重新创建smtp发送轮。如果你没有得到确定,同时可能会发生一些事情,你需要检查结果,然后执行重新发送(或者如果错误信息说电子邮件地址不是有效的,或者需要放弃,类似的东西,以避免无限循环)。

+0

我不明白。如果客户端超时,这意味着客户端放弃等待服务器响应,所以他不知道请求的结果是什么,因为他不会听。 例如:如果通信被切断,服务器将进行到最后,但客户端将不会收到答案。另外一个例子,服务器很忙,因此它在31秒后处理了请求,但客户端在30之后放弃了。 – ByteArtisan

+0

它很简单:每个SMTP服务器那些日子都必须遵循[RFC 5321](https://tools.ietf。 org/html/rfc5321#section-4.5.4。)_keep指出你可以滚动该URL_你的应用程序必须符合RFC 5321,否则你会发送多封邮件。这意味着如果中间进程被切断,服务器将无法继续处理电子邮件,它将无法正常工作,并且会违反RFC 5321.这意味着如果您的应用程序在RFC中提到了250 OK,那么电子邮件被远程服务器接受。如果不是,则必须重新发送。 – BastianW

+0

我不确定我们是否在同一页面上。 Microsoft交换服务器配置为我执行中继消息,因此RFC 5321应由此服务器确保。我需要以任何方式遵守RFC 5321吗? 我一次发送一条消息,在提前之前检查结果。如果出现错误,我会重试5次,这是我最初遇到的问题。如果我超时,如何继续。 – ByteArtisan

另一种可能的选择可能是涉及Microsoft Exchange Webservices。您也可以使用它们发送电子邮件。从here例如:

// Create an email message and identify the Exchange service. 
EmailMessage message = new EmailMessage(service); 

// Add properties to the email message. 
message.Subject = "Interesting"; 
message.Body = "The merger is finalized."; 
message.ToRecipients.Add("[email protected]"); 

// Send the email message and save a copy. 
message.SendAndSaveCopy(); 

他们给你以及回一个响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <h:ServerVersionInfo MajorVersion="14" 
       MinorVersion="0" 
       MajorBuildNumber="639" 
       MinorBuildNumber="20" 
       Version="Exchange2010" 
       xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xm=""lns:xsd="http://www.w3.org/2001/XMLSchema" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
     <m:CreateItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items /> 
     </m:CreateItemResponseMessage> 
     </m:ResponseMessages> 
    </m:CreateItemResponse> 
    </s:Body> 
</s:Envelope>