2012-05-15 142 views
1

我有一个零星发生的错误。当我遇到这个错误时,如果我再试一次,电子邮件会发送。我无法可靠地重现错误,但经常发生问题。System.Net.Mail.SmtpException:SMTP命令超时 - 关闭连接

System.Net.Mail.SmtpException:服务不可用,关闭传输通道。服务器响应为:[服务器]:SMTP命令超时 - 关闭连接

堆栈跟踪:

在System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode的StatusCode,字符串响应)在在System.Net System.Net.Mail.SmtpTransport.SendMail(MailAddress发件人,MailAddressCollection收件人,字符串deliveryNotify,SmtpFailedRecipientException异常)System.Net.Mail.MailCommand.Send(SmtpConnection conn,字节[]命令,字符串从)。 Mail.SmtpClient.Send(MailMessage消息)

下面是有问题的代码。它使用一个HTML模板(数据库由一个web url默认备份驱动)来注入值并创建一个html电子邮件。

public void AccountActivationEmail(Common.Request.Email.AccountActivation request) 
{ 
    var profile = profileRepository.GetOne(new ProfileByUsername(request.Username, request.SiteId)); 
    var options = siteService.GetOptions(new GatewayOptionsRequest() 
    { 
     SiteId = request.SiteId 
    }); 
    var site = options.Site; 

    ExpiringHMAC hmac = new ExpiringHMAC(request.ExpireOn, new string[] { request.AccountId.ToString(), request.AccountKey.ToString(), request.Username }); 

    Dictionary<string, string> data = new Dictionary<string, string>(); 

    data.Add("{{logourl}}", String.IsNullOrEmpty(options.FullyHostedGateway.LogoUrl) ? UrlHelper.ConvertRelativeToAbsolute("/content/images/spacer.png") : options.FullyHostedGateway.LogoUrl); 
    data.Add("{{name}}", profile.Name.DisplayName); 
    data.Add("{{sitename}}", site.Name.DisplayName); 
    data.Add("{{activationlink}}", String.Format(ActivationUrlFormat, options.UrlFriendlyName, Encryption.EncryptQueryString(request.Username), hmac.ToString())); 

    MailDefinition template = new MailDefinition(); 
    MailMessage message = null; 
    var emailTemplate = options.GetEmailTemplate(EmailTemplateType.ActivateAccount); 
    string defaultSubject = "Activate Account"; 

    bool hasTemplate = false; 

    if (emailTemplate != null) 
    { 
     hasTemplate = !String.IsNullOrEmpty(emailTemplate.Template); 
    } 

    if (!hasTemplate) 
    { 
     template.BodyFileName = activationDefaultTemplateUrl; 
     message = template.CreateMailMessage(request.EmailAddress, data, new System.Web.UI.LiteralControl()); 
     message.IsBodyHtml = true; 
     message.Subject = defaultSubject; 
    } 
    else 
    { 
     message = template.CreateMailMessage(request.EmailAddress, data, emailTemplate.Template, new System.Web.UI.LiteralControl()); 
     message.IsBodyHtml = emailTemplate.IsHtml; 

     if (!String.IsNullOrEmpty(emailTemplate.Subject)) 
      message.Subject = emailTemplate.Subject; 
     else 
      message.Subject = defaultSubject; 
    } 

    if (options.ContactDetails != null) 
    { 
     if (!String.IsNullOrEmpty(options.ContactDetails.EmailAddress)) 
      message.From = new MailAddress(options.ContactDetails.EmailAddress); 
    } 

    SmtpClient client = new SmtpClient(); 

    client.Send(message); 
} 

此代码是使用Structuremap生成为单例的类的一部分。我想也许这可能会导致这个问题,但每次调用该方法时,都会创建一个新的SmtpClient对象,这将消除我看到的有关使用同一个连接发送多个电子邮件的问题。

我们没有阻止或限制连接,这是我们的电子邮件托管就此问题采取的官方立场。我想看看是否有任何方法可以做得更好,所以我不会收到这些错误。

编辑:

我有我的邮件服务器在我的web.config中定义。我已通过电子邮件托管确认我的设置是正确的。

<system.net> 
     <mailSettings> 
     <smtp deliveryMethod="Network" from="[email protected]"> 
      <network host="smtp.emailhost.com" userName="[email protected]" 
       password="myPassword1" port="2500" /> 
     </smtp> 
     </mailSettings> 
    </system.net> 

回答

2

您是否在发送后丢弃了Smtp Client对象?从http://connect.microsoft.com/VisualStudio/feedback/details/337557/smtpclient-does-not-close-session-after-sending-message看来,“......即使你每次创建一个SmtpClient的新实例,它仍然使用相同的会话。”

因此,也许

using (SmtpClient client = new SmtpClient()) 
{ 
    client.Send(message); 
} 
+0

我们都面临着同样的问题,我们使用AWS SMTP,但仍是同样的问题,使用此解决方案后。不知道这是什么待办事项。有没有其他方法可以摆脱...? – sbmandav

+0

@sbmandav我也遇到了AWS SMTP的这个问题,我也可以验证这个解决方案没有帮助。 – Mike

+0

我也遇到了与AWS SMTP相同的问题。有没有人看到过专门针对AWS的解决方案? – agarcian