【问题标题】:Can't send email through SendGrid无法通过 SendGrid 发送电子邮件
【发布时间】:2014-06-08 21:25:53
【问题描述】:

我正在遵循 SendGrid's site 中的示例,并将其粘贴到 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);

【问题讨论】:

  • 您是否尝试发送到有效的电子邮件地址?也许邮件服务正在尝试连接到“example.com”——显然没有这样的地址。
  • 是的,看看你在sendgrid.com/logs/index是否有任何日志条目
  • @chuex 我有一个有效的地址,是的。
  • @bwest 当我在 Azure 帐户上执行应用程序时,邮件似乎已发送出去。但是,当我尝试从控制台应用程序中使用它时,同一台服务器似乎对我吠叫。这是预期的行为吗?!
  • 据我所知应该没有区别!

标签: c# azure sendgrid


【解决方案1】:

这是否恰好是一个控制台应用程序?我一直在测试 SendGrid,发现当我尝试从控制台应用程序发送电子邮件时,电子邮件永远不会发送。但是,当我从 Web 应用程序(使用相同的发送代码)尝试它时,会发送电子邮件。我无法解释为什么控制台应用程序不起作用。

【讨论】:

  • 嗯,我想。当应用程序从控制台运行时,它不算作云驱动,因此不包含在安全架构中。有一些防火墙或类似的东西只是阻止它。需要从云中执行它或支付更高的金额才能从控制台传递邮件。我猜这是某种欺诈保护。 +1 检查旧问题。
  • 它确实在控制台应用程序中工作,但由于某种原因你需要这样调用它:transportWeb.DeliverAsync(msg).Wait()。更多信息:github.com/sendgrid/sendgrid-csharp/issues/154
  • 如果您像我一样想知道“transportWeb”到底是什么,它似乎引用了这个例子:sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/csharp.html# 但是,我无法让这个例子工作;安装 SendGrid C# NuGet 包(“Install-Package SendGrid”)后,它似乎没有包含示例中使用的对象 SendGrid.SendGridMessage 的定义。
【解决方案2】:

我能够使用 SendGrid v3 C# API 从控制台应用程序成功发送 SendGrid 电子邮件。

我首先需要使用 Visual Studio 中的包管理器控制台通过 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());
}

【讨论】:

    【解决方案3】:
    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 网站执行时,我可以立即使用它,但不是其他明智的。但是,随着时间的推移,情况可能会发生变化。
    【解决方案4】:

    我知道这是一篇旧帖子,但我发现了为什么电子邮件不是从控制台应用程序发送的。当我添加 Console.Read();在 program.cs 类的末尾,它发送电子邮件,但如果我删除 Console.Read();从代码中,电子邮件不发送。所以我的假设是,如果我让程序在关闭前稍等片刻,电子邮件应该会发送。

    【讨论】:

    • 如果 this 是这种情况,我会判断它非常错误......非常错误......我的程序执行,建立与云API的连接,推出一些邮件,然后可以死。看在上帝的份上,让云中的软件完成它的工作吧!为什么它需要与我的控制台程序保持连接?无论如何,+1 提出一个有趣的建议。我试试看。
    • 它对我有用,如果有帮助,您可以尝试在代码末尾使用 Thread.Sleep(60000),这是我使用的并且有效。没有它,我的电子邮件根本不会发送。
    【解决方案5】:

    不确定是否每个人都是这种情况,但我必须创建一个发件人。 https://app.sendgrid.com/settings/sender_auth/senders。那将匹配mailMsg.From

    【讨论】:

      【解决方案6】:

      好的,我想我有答案了。上面的代码很好。在 SendGrid 上,您必须批准发送电子邮件地址。登录您的 SendGrid 门户并参加以下活动:

      1. 设置 -> 发件人身份验证
      2. 在“单一发件人验证”下添加所需的电子邮件地址
      3. 点击收件箱中的授权链接和您鲍勃的侄子。

      希望以上帮助

      【讨论】:

      • 这个问题已有 6 年历史,很久以前就得到了公认的答案。问题是它在本地桌面应用程序中不起作用。必须将应用程序上传到云端并从那里运行。 (就是那个时候的状态,不知道今天怎么样了。)
      • 是的,我有很长一段时间的错误,只有上述工作。所以也许有同样问题的其他人可能只是错过了上述步骤。
      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多