我尝试使用我的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);
}
答案 0 :(得分:0)
根据SendGrid的建议,我重新编写了电子邮件代码,因此它不使用WebMail.Send,而是显式使用SmtpClient和MailMessage对象。 SendGrid说,ASP.NET如何自动从配置文件加载凭据可能存在某种时间问题。这正是他们所说的:
您是否偶然将SendGrid凭据存储在配置文件中,与连接到SMTP服务器的代码分开?我问的原因是因为我看到rails和这样的C#配置由于未在正确的时间传递凭据而收到未经身份验证的错误。通常,这可以通过使用代码而不是单独的配置文件直接移动凭证来解决。尝试一下,看看你是否注意到了差异。&lt;&lt;
我没有完全遵循他们的建议 - 即我仍在使用配置文件,但我在SmtpClient和MailMessage的子类中加载配置值,所以我避免在我的应用程序中硬编码信用卡。无论如何,它运作良好,一切都很好。