smtp连接在telnet中工作但在ASP中不起作用 - 相同的服务器,相同的凭据

时间:2014-06-09 19:00:33

标签: asp.net telnet sendgrid

我尝试使用我的SendGrid帐户从ASP.NET发送电子邮件。它适用于我的开发机器,但不在生产中,即使凭据是相同的。同样,在生产中我可以通过telnet连接到SMTP服务器(使用base64编码的凭据),但ASP站点无法连接 - 我收到错误"不允许未经身份验证的发件人。"

我尝试过混合端口号码(25,587,465 - 我的网站是SSL)。使用端口465次。 25和587立即返回响应 - 但是登录错误。这真是令人费解,因为就像我说的那样,它在开发机器和生产方面具有相同的凭据。

我非常简短地看了一下微软网络监视器3.4,但无法做出正面或反面。我希望它会告诉我发送的详细命令,因为我怀疑该网站正在做一些与telnet连接有点不同的事情,但我不知道是什么。

注意我还询问了我的网络主机,这些端口上的传出流量是否在生产防火墙上被阻止,但它们不是。

这里是实际代码 - 就像我说在localhost上工作正常,但生产中的SMTP连接失败

[AllowAnonymous]
[HttpPost]              
public ActionResult ResetPasswordSend(string email)
{
    List<string> userList = new List<string>();

    try
    {
        string[] invalidChars = new string[] { ";", "," };
        foreach (var invalidChar in invalidChars) if (email.Contains(invalidChar)) throw new Exception("Email contains invalid character.");

        int count = 0;
        // since emails are not unique, I must launch resets for all of them
        var users = _db.HsProfile.Query("[Email]=@0", SqlDb.Params(email));
        foreach (var profile in users)
        {
            count++;
            userList.Add(profile.UserName);

    var token = WebSecurity.GeneratePasswordResetToken(profile.UserName, 15);

    WebMail.Send(profile.Email, "HumaneSolution.com Password Reset for user " + profile.UserName, 
                "You received this email because you or someone with your email address requested a password reset on HumaneSolution.com. " +
                "If you didn't do this, then you don't need to take any action, and nothing will happen.\n\n" +
                "To proceed with the password reset, click the link below within 15 minutes:\n\n" +
                Url.BaseUrl("Account/EnterNewPassword/" + token) + "\n\n" +                         
                     "Sent to: " + email + " at " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + "\n" +
                      "User name: " + profile.UserName);
         }

         if (count == 0) throw new Exception("Email " + email + " is not registered at HumaneSolution.com.");
     }
     catch (Exception exc)
     {
         ViewBag.Error = exc.Message;
     }
 return View(userList);
}

1 个答案:

答案 0 :(得分:0)

根据SendGrid的建议,我重新编写了电子邮件代码,因此它不使用WebMail.Send,而是显式使用SmtpClient和MailMessage对象。 SendGrid说,ASP.NET如何自动从配置文件加载凭据可能存在某种时间问题。这正是他们所说的:

  
    

您是否偶然将SendGrid凭据存储在配置文件中,与连接到SMTP服务器的代码分开?我问的原因是因为我看到rails和这样的C#配置由于未在正确的时间传递凭据而收到未经身份验证的错误。通常,这可以通过使用代码而不是单独的配置文件直接移动凭证来解决。尝试一下,看看你是否注意到了差异。&lt;&lt;

  

我没有完全遵循他们的建议 - 即我仍在使用配置文件,但我在SmtpClient和MailMessage的子类中加载配置值,所以我避免在我的应用程序中硬编码信用卡。无论如何,它运作良好,一切都很好。