SendGrid не работает из службы приложений Azure

c# azure sendgrid asp.net-core-1.0

2483 просмотра

3 ответа

Я использую последний пакет SendGrid .NET (8.0.3) для отправки электронной почты из моего веб-приложения ASP.NET Core:

public Task SendEmailAsync(string email, string subject, string message)
{
    return Send(email, subject, message);

}

async Task Send(string email, string subject, string message)
{
    dynamic sg = new SendGridAPIClient(_apiKey);

    var from = new Email("noreply@my.domain", "My Name");
    var to = new Email(email);
    var content = new Content("text/html", message);
    var mail = new Mail(from, subject, to, content);

    await sg.client.mail.send.post(requestBody: mail.Get());
}

Он работает локально, но при работе с экземпляром службы приложений Azure письма не приходят.

Код работает нормально без каких-либо исключений, поэтому мне не с чем работать, но я думаю, что это может быть проблема с брандмауэром.

Кто-нибудь сталкивался с подобными проблемами? Как мне отладить это?

Автор: severin Источник Размещён: 08.11.2019 11:12

Ответы (3)


1 плюс

Хотя вопрос старый, я даю ответ, когда натолкнулся на похожую проблему и не смог найти каких-либо четких решений. Причина, по которой это не сработало для меня, была в том, что

  • Я не ссылался на Microsoft.Azure.WebJobs.Extensions.SendGrid. Решение этой проблемы заключается в добавлении его из Nuget
  • Я не ждал завершения асинхронной отправки. Добавьте .Wait () к асинхронной функции, которая отправляет электронную почту. Полный код, который я использовал для program.cs, приведен ниже:

    static void Main()
    {
        var config = new JobHostConfiguration();
    
        if (config.IsDevelopment)
        {
            config.UseDevelopmentSettings();
        }
        config.UseSendGrid();
    
    //The function below has to wait in order for the email to be sent
        SendEmail(*Your SendGrid API key*).Wait();
    
    
    }
    
    public static async Task SendEmail(string key)
    {
    
        dynamic sg = new SendGridAPIClient(key);
    
        Email from = new Email("from@domain.com");
        string subject = "Test";
        Email to = new Email("to@domain.com");
    
        Content content = new Content("text/html", "CONTENT HERE");
        Mail mail = new Mail(from, subject, to, content);
    
    
    
        dynamic s = await sg.client.mail.send.post(requestBody: mail.Get());
    
    }
    

Поэтому я бы предложил вам добавить .Wait () к вашему вызову функции:

public Task SendEmailAsync(string email, string subject, string message)
{
    //Added .Wait()
    return Send(email, subject, message).Wait();
}
Автор: Matt Размещён: 05.11.2017 10:08

0 плюса

Я также использую SendGrid в своем веб-приложении Azure. Я могу отправить при локальной отладке И после развертывания в производство в Azure. Вот пара вещей, чтобы проверить:

  1. API Key - ключ API явно требуется; дважды проверьте, как вы его заполняете. Часто это значение устанавливается с помощью конфигурации. Ваше развернутое значение конфигурации совпадает со значением при локальном запуске? Возможно, у вас есть преобразование web.config, мешающее во время развертывания, или, возможно, у вас должен быть установлен набор переопределения (например, в настройках приложения вашего приложения, если вы используете службу Web App).
  2. Активность и подавления SendGrid - проверяли ли вы журнал активности SendGrid? Проблема может заключаться в получении вашего запроса к SendGrid или в том, что SendGrid получает ваш запрос, но не выполняет его. Проверьте ленту активности и найдите конкретное письмо, которое вы ожидаете (журналы доступны для поиска и отсортированы по времени). Если вы видите здесь журнал, соответствующий вашей электронной почте, значит, проблема на стороне SendGrid. Бывают случаи, когда электронная почта подавляется, и это может происходить по многим причинам (отклоненная доставка, помечена как спам, или даже ваш DNS-сервер был недоступен для проверки владения доменом). Журналы предоставят доказательства, если это так. Вы также можете перейти непосредственно к «Подавлениям» и найти там адрес электронной почты.
  3. Доступность сети - если вы размещаете свое приложение с помощью службы веб-приложений (как это, похоже, имеет место), вы можете предположить, что ваше веб-приложение может отправлять сетевые запросы, что, очевидно, требуется для подключения к серверу SendGrid API или SMTP-серверам. Однако если вы развернули свое приложение на виртуальной машине, размещенной в Azure, то есть некоторые препятствия, например брандмауэры. Войдите в виртуальную машину и вручную подтвердите, что вы можете отправлять сетевые запросы непосредственно в API SendGrid.
Автор: Trevor Размещён: 28.04.2017 11:01

0 плюса

У меня была та же проблема, и проблема для меня заключалась в том, что в проекте был сохранен apiKey SendGrid как переменная среды, работавшая на локальном хосте, но ни разу api не был размещен на azure.

Автор: Kevin Размещён: 23.08.2017 04:46
Вопросы из категории :
32x32