无法通过SendGrid发送电子邮件

3
我正在按照SendGrid网站的示例操作,并且作为凭据,我将粘贴他们在Azure门户中给我的内容。然而,我收到了以下错误信息。

Message = {"邮件发送失败。"}
InnerException = {"无法连接到远程服务器"}

我不确定该如何处理此问题,也不知道应该如何进行调试。我正在桌面上运行代码(在将其放入网站之前),所以我可以自行断点调试。然而,并没有什么帮助...
有什么建议吗?
以下是完整的代码。
MailMessage mailMsg = new MailMessage();
mailMsg.To.Add(new MailAddress("to@example.com", "To Name"));
mailMsg.From = new MailAddress("from@example.com", "From Name");
mailMsg.Subject = "subject";
string text = "text body";
string html = @"<p>html body</p>";
mailMsg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(
  text, null, MediaTypeNames.Text.Plain));
mailMsg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(
  html, null, MediaTypeNames.Text.Html));
SmtpClient client = new SmtpClient("smtp.sendgrid.net", Convert.ToInt32(587));
System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(
  "azure_...@azure.com",
  "LubX........pQc");
client.Credentials = credentials;
client.Send(mailMsg);

1
你尝试发送到有效的电子邮件地址了吗?也许邮件服务正在尝试连接到“example.com” - 显然没有这样的地址。 - chue x
1
是的,请查看 https://sendgrid.com/logs/index 是否有任何日志条目。 - bwest
@chuex,是的,我的地址是有效的。 - Konrad Viltersten
@bwest 看起来当我在我的Azure账户上执行应用程序时,邮件会被发送出去。然而,当我尝试从控制台应用程序中使用相同的服务器时,它似乎对我发出警告。这是预期的行为吗?! - Konrad Viltersten
据我所知,这应该没有任何区别! - bwest
显示剩余7条评论
6个回答

4

这是否是控制台应用程序?我一直在测试SendGrid,但发现当我尝试从控制台应用程序发送电子邮件时,电子邮件从未被发送。然而,当我使用完全相同的发送代码从Web应用程序中尝试发送时,电子邮件会被发送。我无法解释为什么控制台应用程序不起作用。


1
我认为应该是这样。当应用程序从控制台运行时,它不被视为云驱动,因此不包括在安全模式中。可能是有一些防火墙之类的简单地阻止了它。需要从云端执行它或支付更高的费用才能从控制台发送邮件。我猜这是某种欺诈保护机制。感谢您检查旧问题,点赞加1。 - Konrad Viltersten
2
它在控制台应用程序中可以工作,但由于某种原因,您需要像这样调用它:transportWeb.DeliverAsync(msg).Wait()。更多信息请参见:https://github.com/sendgrid/sendgrid-csharp/issues/154 - user1843640
如果你和我一样,现在想知道什么是"transportWeb",它似乎是参考了这个例子:https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/csharp.html#。然而,我无法让那个例子工作;在安装SendGrid C# NuGet包("Install-Package SendGrid")之后,它似乎没有包含对象SendGrid.SendGridMessage的定义,就像例子中使用的那样。 - Jon Schneider

2
我能成功地使用SendGrid v3 C# API从控制台应用程序发送了一封邮件。
首先,我需要在Visual Studio的Package Manager Console中通过NuGet导入SendGrid C#库。
PM> Install-Package SendGrid

然后,我的代码:
using SendGrid;
using SendGrid.Helpers.Mail;
using System.Threading.Tasks;

// ...

public static async Task SendEmailViaSendGrid(string to, string from, string subject, string body)
{
    // Generated from https://app.sendgrid.com/settings/api_keys
    // TODO: Store this somewhere secure -- not in version control.
    string apiKey = "YOUR_PRIVATE_SENDGRID_API_KEY_GOES_HERE";

    dynamic sendGridClient = new SendGridAPIClient(apiKey);

    Email fromEmail = new Email(from);
    Email toEmail = new Email(to);
    Content content = new Content("text/plain", body);
    Mail mail = new Mail(fromEmail, subject, toEmail, content);

    dynamic response = await sendGridClient.client.mail.send.post(requestBody: mail.Get());
}

2
public static bool SendMailBySendGrid(string offMail, string mailFormatDetails,string subject,string ccMail=null,string bccMail=null)
{
  string mailFromId = System.Configuration.ConfigurationManager.AppSettings["Sender"];
  SendGridMessage sndmsg = new SendGridMessage();
  sndmsg.From = new MailAddress(mailFromId);
  sndmsg.To = new MailAddress[] { new MailAddress(offMail) };
  if (!string.IsNullOrEmpty(ccMail))
    sndmsg.Cc = new MailAddress[] { new MailAddress(ccMail) };
  if(!string.IsNullOrEmpty(bccMail))
    sndmsg.Bcc = new MailAddress[] { new MailAddress(bccMail) };
  sndmsg.Subject = subject;         
  sndmsg.Html = "<div>" + mailFormatDetails + "</div>";
  bool result= SendEmail(sndmsg);
  return result;
}

在你的项目中加入使用SendGrid;

请问您是在控制台应用程序还是网站上执行了上述代码(如果是后者,请说明它是如何托管的)?我之所以问这个问题,是因为当我从Azure网站上执行时,它可以立即正常工作,但在其他情况下则不行。然而,随着时间的推移,情况可能已经发生了变化。 - Konrad Viltersten

2

我知道这是一个旧帖子,但我发现为什么控制台应用程序无法发送电子邮件。当我在program.cs类的结尾添加Console.Read();时,它可以发送电子邮件,但如果我从代码中删除Console.Read();,则电子邮件将无法发送。因此,我的假设是,如果让程序在关闭之前等待一会儿,那么电子邮件应该会发送。


如果是这种情况,我会认为它非常错误...非常错误...我的程序执行了,建立了与云API的连接,推送了一些邮件,然后就可以退出了。让云端的软件去完成它的工作,求求上帝了!它为什么需要保持与我的控制台程序的连接呢?不管怎样,对于这个有趣的建议我会点赞并尝试一下。 - Konrad Viltersten
它对我起作用了,如果有帮助的话,你可以尝试在代码末尾使用Thread.Sleep(60000),这就是我使用的方法,它有效了。如果没有这个,我的邮件根本无法发送。 - Morné Lombard

1

0

好的,我想我有答案了。上面的代码没问题。在SendGrid上,您必须批准发送电子邮件地址。登录到您的SendGrid门户并执行以下操作:

  1. 设置 -> 发件人身份验证
  2. 在“单个发件人验证”下添加您想要的电子邮件地址
  3. 点击收件箱中的授权链接,以及您的Bob的侄子。

希望以上内容能够帮助到您。


这个问题已经6年了,很久以前就有一个被接受的答案。问题是它不能从本地桌面应用程序中工作。必须将应用程序上传到云端并从那里运行。(那时的情况是这样的。我不知道今天它是如何工作的。) - Konrad Viltersten
是的,我长时间以来一直遇到这个错误,只有上述方法起作用。所以也许其他遇到同样问题的人可能只是忽略了这个步骤。 - Jukes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接