我如何使用MailMessage通过SendGrid发送邮件?

问题描述 投票:0回答:2

我正在尝试使用SendGrid发送邮件,但不能。它总是抛出一个我无法解决的异常。

如何解决此问题?

SendMail

public static Boolean isSend(IList<String> emailTo, String mensagem, String assunto, String emailFrom, String emailFromName){        
        try{            
            MailMessage mail = new MailMessage();
            mail.BodyEncoding = System.Text.Encoding.UTF8;
            mail.SubjectEncoding = System.Text.Encoding.UTF8;
            //to
            foreach (String e in emailTo) {
                mail.To.Add(e);
            }             
            mail.From = new MailAddress(emailFrom);
            mail.Subject = assunto;            
            mail.Body = mensagem;
            mail.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = CustomEmail.SENDGRID_SMTP_SERVER;
            smtp.Port = CustomEmail.SENDGRID_PORT_587;            
            smtp.Credentials = new System.Net.NetworkCredential(CustomEmail.SENDGRID_API_KEY_USERNAME, CustomEmail.SENDGRID_API_KEY_PASSWORD);
            smtp.UseDefaultCredentials = false;
            smtp.EnableSsl = false;
            smtp.Timeout = 20000;
            smtp.Send(mail);
            return true;
        }catch (SmtpException e){
            Debug.WriteLine(e.Message);
            return false;
        }        
    }

CustomMail

//SendGrid Configs   
    public const String SENDGRID_SMTP_SERVER = "smtp.sendgrid.net";
    public const int SENDGRID_PORT_587 = 587;
    public const String SENDGRID_API_KEY_USERNAME = "apikey"; //myself
    public const String SENDGRID_API_KEY_PASSWORD = "SG.xx-xxxxxxxxxxxxxxxxxxxxxxxxx-E";

Exception

Exception thrown: 'System.Net.Mail.SmtpException' in System.dll
Server Answer: Unauthenticated senders not allowed
c# asp.net-mvc sendgrid
2个回答
0
投票

对于使用SendGrid发送电子邮件,有v3 API。 NuGet的名称为SendGrid,链接为here

此库使用API​​密钥进行授权。

var client = new SendGridClient(apiKey);
var msg = MailHelper.CreateSingleTemplateEmail(from, new EmailAddress(to), templateId, dynamicTemplateData);

try
{
    var response = client.SendEmailAsync(msg).Result;
    if (response.StatusCode != HttpStatusCode.OK
        && response.StatusCode != HttpStatusCode.Accepted)
    {
        var errorMessage = response.Body.ReadAsStringAsync().Result;
        throw new Exception($"Failed to send mail to {to}, status code {response.StatusCode}, {errorMessage}");
    }
}
catch (WebException exc)
{
    throw new WebException(new StreamReader(exc.Response.GetResponseStream()).ReadToEnd(), exc);
}

0
投票

我认为您的问题源于未在构造函数中使用服务器实例化SMTP客户端的情况。另外,您还应该将smtpclient包裹在using语句中,以便正确处理它,或者在完成后调用dispose。

尝试一下:

    public static Boolean isSend(IList<String> emailTo, String mensagem, String assunto, String emailFrom, String emailFromName)
    {
        try
        {
            MailMessage mail = new MailMessage();
            mail.BodyEncoding = System.Text.Encoding.UTF8;
            mail.SubjectEncoding = System.Text.Encoding.UTF8;
            //to
            foreach (String e in emailTo)
            {
                mail.To.Add(e);
            }
            mail.From = new MailAddress(emailFrom);
            mail.Subject = assunto;
            mail.Body = mensagem;
            mail.IsBodyHtml = true;
            using(SmtpClient smtp = new SmtpClient(CustomEmail.SENDGRID_SMTP_SERVER)){
                smtp.Port = CustomEmail.SENDGRID_PORT_587;
                smtp.Credentials = new System.Net.NetworkCredential(CustomEmail.SENDGRID_API_KEY_USERNAME, CustomEmail.SENDGRID_API_KEY_PASSWORD);
                smtp.UseDefaultCredentials = false;
                smtp.EnableSsl = false;
                smtp.Timeout = 20000;
                smtp.Send(mail)
            }
        }
        catch (SmtpException e)
        {
            Debug.WriteLine(e.Message);
            return false;
        }
    }

如果不起作用,您可以尝试删除端口,为smtp客户端启用enablesl并使用defaultcredentials参数。我一直在使用sendgrid,并且不使用这些选项。


0
投票

为了更明确地回答您的原始问题和导致异常的原因,SendGrid SMTP服务器可能不是在寻找您帐户的用户名和密码,而是在寻找您的API密钥。该错误似乎表明您的身份验证不成功。

https://sendgrid.com/docs/for-developers/sending-email/v3-csharp-code-example/

与SendGrids SMTP API集成:

  • 创建至少具有“邮件”权限的API密钥。
  • 将电子邮件客户端或应用程序中的服务器主机设置为smtp.sendgrid.net。
    • 有时将此设置称为外部SMTP服务器或SMTP中继。
  • 将用户名设置为apikey。
  • 将密码设置为步骤1中生成的API密钥。
  • 将端口设置为587。

使用SendGrid C#库还将简化此过程:

https://sendgrid.com/docs/for-developers/sending-email/v3-csharp-code-example/

// using SendGrid's C# Library
// https://github.com/sendgrid/sendgrid-csharp
using SendGrid;
using SendGrid.Helpers.Mail;
using System;
using System.Threading.Tasks;

namespace Example
{
    internal class Example
    {
        private static void Main()
        {
            Execute().Wait();
        }

        static async Task Execute()
        {
            var apiKey = Environment.GetEnvironmentVariable("NAME_OF_THE_ENVIRONMENT_VARIABLE_FOR_YOUR_SENDGRID_KEY");
            var client = new SendGridClient(apiKey);
            var from = new EmailAddress("[email protected]", "Example User");
            var subject = "Sending with SendGrid is Fun";
            var to = new EmailAddress("[email protected]", "Example User");
            var plainTextContent = "and easy to do anywhere, even with C#";
            var htmlContent = "<strong>and easy to do anywhere, even with C#</strong>";
            var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
            var response = await client.SendEmailAsync(msg);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.