2012-05-15 5 views
1

У меня возникла ошибка, возникающая спорадически. Когда я столкнулся с этой ошибкой, если я попробую еще раз, отправит электронное письмо. Я не могу достоверно воспроизвести ошибку, но она достаточно часто бывает достаточно, чтобы быть проблемой.System.Net.Mail.SmtpException: таймаут команды SMTP - закрытие соединения

System.Net.Mail.SmtpException: обслуживание недоступно, закрытие канала передачи. Ответ сервера был: [Servername]: Команда SMTP таймаут - закрытие соединения

Трассировка стека:

на System.Net.Mail.MailCommand.CheckResponse (SmtpStatusCode StatusCode, ответ строки) в System.Net.Mail.MailCommand.Send (SmtpConnection conn, Byte [] command, String from) в System.Net.Mail.SmtpTransport.SendMail (отправитель MailAddress, получатели MailAddressCollection, исключение String deliveryNotify, исключение SmtpFailedRecipientException &) в System.Net. Mail.SmtpClient.Send (сообщение MailMessage)

Вот код, о котором идет речь. Он использует шаблон HTML (база данных, управляемая резервной копией по умолчанию для веб-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, который должен устранить проблемы, которые я видел о том, как использовать одно и то же соединение для отправки нескольких сообщений электронной почты.

У нас нет ничего, что блокировало бы или ограничивало бы соединение, что является официальной позицией, на которой наш хостинг электронной почты принимает эту проблему. Я хочу посмотреть, есть ли способ сделать это лучше, поэтому я не получаю эти ошибки.

EDIT:

У меня есть мой почтовый сервер определен в моем 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 после отправки? От 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

Смежные вопросы