C# System.Net.Mail.SmtpException:SMTP命令超时-关闭连接

C# System.Net.Mail.SmtpException:SMTP命令超时-关闭连接,c#,email,structuremap,smtpclient,system.net.mail,C#,Email,Structuremap,Smtpclient,System.net.mail,我有一个偶尔发生的错误。当我遇到此错误时,如果我重试,电子邮件将发送。我无法可靠地再现错误,但它的出现频率足以成为一个问题 System.Net.Mail.SmtpException:服务不可用,正在关闭传输通道。服务器响应为:[Servername]:SMTP命令超时-关闭连接 堆栈跟踪: 在System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode,String response)在System.Net.Mail.S

我有一个偶尔发生的错误。当我遇到此错误时,如果我重试,电子邮件将发送。我无法可靠地再现错误,但它的出现频率足以成为一个问题

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

堆栈跟踪:

在System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode,String response)在System.Net.Mail.SmtpTransport.SendMail(MailAddress发件人,MailAddressCollection收件人,String deliveryNotify,SmtpFailedRecipientException&exception)在System.Net.Mail.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode,String response)在System.Net.Mail.Mail.Mail在System.Net.Mail.SmtpClient.Send(邮件消息)上

这是有问题的代码。它使用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);
}
public void AccountActivationEmail(Common.Request.Email.AccountActivation请求)
{
var profile=profileRepository.GetOne(新ProfileByUsername(request.Username,request.SiteId));
var options=siteService.GetOptions(新网关选项请求()
{
SiteId=request.SiteId
});
var site=options.site;
ExpiringHMAC=new ExpiringHMAC(request.ExpireOn,新字符串[]{request.AccountId.ToString(),request.AccountKey.ToString(),request.Username});
字典数据=新字典();
data.Add(“{logourl}}”,String.IsNullOrEmpty(options.FullyHostedGateway.logourl)?UrlHelper.ConvertRelativeToAbsolute(“/content/images/spacer.png”):options.FullyHostedGateway.logourl);
添加(“{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模板=新建MailDefinition();
MailMessage=null;
var emailTemplate=options.GetEmailTemplate(EmailTemplateType.ActivateAccount);
字符串defaultSubject=“激活帐户”;
bool-hasTemplate=false;
如果(emailTemplate!=null)
{
hasTemplate=!String.IsNullOrEmpty(emailTemplate.Template);
}
如果(!hasTemplate)
{
template.BodyFileName=activationDefaultTemplateUrl;
message=template.CreateMailMessage(request.EmailAddress,data,new System.Web.UI.LiteralControl());
message.IsBodyHtml=true;
message.Subject=defaultSubject;
}
其他的
{
message=template.CreateMailMessage(request.EmailAddress,data,emailTemplate.template,new System.Web.UI.LiteralControl());
message.IsBodyHtml=emailTemplate.IsHtml;
如果(!String.IsNullOrEmpty(emailTemplate.Subject))
message.Subject=emailTemplate.Subject;
其他的
message.Subject=defaultSubject;
}
如果(options.ContactDetails!=null)
{
如果(!String.IsNullOrEmpty(options.ContactDetails.EmailAddress))
message.From=新邮件地址(options.ContactDetails.EmailAddress);
}
SmtpClient=新的SmtpClient();
客户端。发送(消息);
}
此代码是使用Structuremap作为单例生成的类的一部分。我认为这可能是问题的原因,但每次调用该方法时,都会创建一个新的SmtpClient对象,这应该可以消除我所看到的使用同一连接发送多封电子邮件的问题

我们没有阻止或限制连接,这是我们的电子邮件主机在这个问题上的官方立场。我想看看是否有办法做得更好,这样我就不会出现这些错误

编辑:

我的web.config中确实定义了邮件服务器。我已通过电子邮件主机确认我的设置正确

  <system.net>
      <mailSettings>
        <smtp deliveryMethod="Network" from="no-reply@mydomain.com">
          <network host="smtp.emailhost.com" userName="someaddress@mydomain.com" 
              password="myPassword1" port="2500" />
        </smtp>
      </mailSettings>
  </system.net>

发送后是否处理Smtp客户端对象?从中可以看出,“…即使您每次都在创建SmtpClient的新实例,它仍然使用相同的非递归会话。”

所以也许

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

我们面临相同的问题,我们使用AWS SMTP,但使用此解决方案后仍然存在相同的问题。不知道该怎么办。有没有其他方法可以摆脱…?@sbmandav我也遇到了AWS SMTP的问题,我还可以验证此解决方案没有帮助。我也遇到了AWS SMTP的相同问题。有人看到过专门针对AWS的解决方案吗?