如果这是一个欺骗性问题,我道歉,但我在本网站或其他网站上未发现有关此问题的任何可靠信息。
话虽如此,我正在研究MVC 5 Web应用程序。我在ASP.net上关注this tutorial。
public async Task SendAsync(IdentityMessage message)
{
await configSendGridasync(message);
}
private async Task configSendGridasync(IdentityMessage message)
{
var myMessage = new SendGridMessage();
myMessage.AddTo(message.Destination);
myMessage.From = new System.Net.Mail.MailAddress(
"info@ycc.com", "Your Contractor Connection");
myMessage.Subject = message.Subject;
myMessage.Text = message.Body;
myMessage.Html = message.Body;
var credentials = new NetworkCredential(
Properties.Resources.SendGridUser,
Properties.Resources.SendGridPassword,
Properties.Resources.SendGridURL // necessary?
);
// Create a Web transport for sending email.
var transportWeb = new Web(credentials);
// Send the email.
if (transportWeb != null)
{
await transportWeb.DeliverAsync(myMessage);
}
else
{
Trace.TraceError("Failed to create Web transport.");
await Task.FromResult(0);
}
}
每次进入上述方法的await transportWeb.SendAsync(myMessage)
行时,此错误都会显示在浏览器中:
异常详细信息: System.Exception:错误请求
Line 54: if (transportWeb != null)
Line 55: {
Line 56: await transportWeb.DeliverAsync(myMessage);
Line 57: }
Line 58: else
Line 59: {
Line 60: Trace.TraceError("Failed to create Web transport.");
Line 61: await Task.FromResult(0);
Line 62: }
我使用"免费套餐Google"在https://sendgrid.com/注册了一个免费帐户,每月为我提供25,000个学分。该帐户已经配置。
到目前为止,我尝试了很多方法,包括:禁用SSL,将用户名/密码直接放在代码中,而不是从Resources.resx
文件中提取它们,在NetworkCredential
对象中指定SMTP服务器,并尝试将DeliverAsync(...)
更改为Deliver()
。
我尝试明确设置subject
,而不是使用message.Subject
,因为this post建议。我还在HttpUtility.UrlEncode
方法中生成的callbackUrl
上Account/Register
尝试{{1}} suggested here。不幸的是,结果相同。
是否有人对可能导致其无法正常运作的原因有所了解?
答案 0 :(得分:6)
您的凭据可能存在问题。
如果您通过Windows Azure注册了SendGrid,则需要执行以下操作:
Azure Portal
Marketplace
SendGrid
应用Connection Info
Username
和Password
。我最初的印象是我要使用我的Azure帐户密码,直到找到这个。希望这能够像对待我一样纠正你的问题。
答案 1 :(得分:6)
我最终使用内置SmtpClient
来实现此功能。这是我正在使用的代码:
private async Task configSendGridasync(IdentityMessage message)
{
var smtp = new SmtpClient(Properties.Resources.SendGridURL,587);
var creds = new NetworkCredential(Properties.Resources.SendGridUser, Properties.Resources.SendGridPassword);
smtp.UseDefaultCredentials = false;
smtp.Credentials = creds;
smtp.EnableSsl = false;
var to = new MailAddress(message.Destination);
var from = new MailAddress("info@ycc.com", "Your Contractor Connection");
var msg = new MailMessage();
msg.To.Add(to);
msg.From = from;
msg.IsBodyHtml = true;
msg.Subject = message.Subject;
msg.Body = message.Body;
await smtp.SendMailAsync(msg);
}
即使它没有使用SendGrid的C#API,这些消息仍会显示在我的SendGrid信息中心上。
答案 2 :(得分:2)
检查您是否使用了正确的"用户名"作为" mailAccount"设置。
这应该是您的sendgrid用户名,不您尝试发送的帐户的电子邮件地址。
答案 3 :(得分:1)
我得到了同样的错误。我所要做的就是在webconfig中复制appsettings(见下文)并将其粘贴到OTHER webconfig文件中(asp.net项目中有2个)。
<add key="webpages:Version" value="3.0.0.0" />
<add key="mailAccount" value="xxUsernamexx" />
<add key="mailPassword" value="Password" />
答案 4 :(得分:1)
我通过Azure创建了一个SendGrid帐户, 我通过在Web.Config文件中设置这些值来修复此问题:
<add key="mailAccount" value="azure_************@azure.com" />
<add key="mailPassword" value="[My Azure Password]" />
到我的azure用户名和密码。我从Azure仪表板找到的用户名,我导航到SendGrid帐户&gt;&gt; [点击我创建的资源]&gt;&gt;配置。密码与我设置Azure帐户的密码相同。
答案 5 :(得分:0)
我也遇到过这个问题。通过添加textcontent和htmlcontent来解决。在我发送空字符串之前。现在它正在工作 代码
var client = new SendGridClient(_apiKey);
var from = new EmailAddress(_fromEmailAddress, _fromName);
var to = new EmailAddress("devanathan.s@somedomain.com", "dev");
var textcontent = "This is to test the mail functionality";
var htmlcontent = "<div>Devanathan Testing mail</div>";
var subject = "testing by sending mail";
var msg = MailHelper.CreateSingleEmail(from, to, subject, textcontent, htmlcontent);
var response = await client.SendEmailAsync(msg);
答案 6 :(得分:-1)
我遇到了同样的问题,碰巧拼错了mailAccount的配置值的名称(放入mainAccount而不是mailAccount)。
NetworkCredential credential = new NetworkCredential(ConfigurationManager.AppSettings["mailAccount"], ConfigurationManager.AppSettings["mailPassword"]);
Web transportWeb = new Web(credential);
配置值返回为null但未引发异常,而是分配了空用户名。基本上,把断点放在“Web transportWeb = new Web(credential);”这一行上。并查看您实际传递的凭证中的用户名/密码,另请参阅nevada_scout的答案。
答案 7 :(得分:-1)
您在SendGrid中注册的公司域应该用于调用MailAddress API。因此,如果您在SendGrid中注册的公司网站是www.###.com
,则应使用:
var from = MailAddress("info@###.com", "Your Contractor Connection")