Как использовать MailMessage для отправки почты с использованием SendGrid? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь отправить почту, используя 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 thrown: 'System.Net.Mail.SmtpException' in System.dll
Server Answer: Unauthenticated senders not allowed

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Для отправки электронных писем с помощью SendGrid существует v3 API . Имя NuGet - SendGrid, а ссылка здесь .

Эта библиотека не работает с System.Net.Mail.MailMessage, она использует SendGrid.Helpers.Mail.SendGridMessage.

Эта библиотека использует API ключ для авторизации. Вы можете создать его, войдя в веб-приложение SendGrid и перейдя в «Email API» -> «Руководство по интеграции» -> «Web API» -> C#.

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 голосов
/ 30 апреля 2020

Чтобы более конкретно ответить на исходный вопрос и причину исключения, SMTP-сервер SendGrid, вероятно, ищет не имя пользователя и пароль вашей учетной записи, а скорее ключ API. Кажется, ошибка указывает на то, что ваша аутентификация не удалась.

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

Для интеграции с SMTP API SendGrids:

  • Создайте ключ API по крайней мере с правами «Mail».
  • Установите хост сервера в вашем почтовом клиенте или приложении на smtp.sendgrid. net.
    • Этот параметр иногда называют внешним SMTP-сервером или ретранслятором SMTP.
  • Установите в качестве имени пользователя apikey.
  • Установите пароль в ключ API, сгенерированный на шаге 1.
  • Установите порт на 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("test@example.com", "Example User");
            var subject = "Sending with SendGrid is Fun";
            var to = new EmailAddress("test@example.com", "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);
        }
    }
}
0 голосов
/ 30 апреля 2020

Я думаю, что ваша проблема связана с не инстанцированием 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;
        }
    }

Если это не сработает Вы можете попробовать удалить параметры порта, enablessl и usedefaultcredentials для клиента smtp. Я все время использую sendgrid и не использую эти опции.

...