Sendgrid не отправляет электронную почту в веб-задании Azure по требованию, работающем как консольное приложение.

У меня есть Azure WebJob по требованию, работающий как консольное приложение.

Целью является отправка электронных писем клиентам.

Проблема в том, что он не отправляет электронные письма.

Мой код сильно перенесен из раздела msdn Как: отправить электронное письмо. Ниже приведен мой фрагмент кода.

class Program
{
  static void Main(string[] args)
    {
Execute(Environment.GetEnvironmentVariable("WEBJOBS_COMMAND_ARGUMENTS")).Wait();
    }

    static async Task Execute(string email)
    {
        DeserializedCustomer customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email);
        var apiKey = Environment.GetEnvironmentVariable("SENDGRID_APIKEY");
        var client = new SendGridClient(apiKey);
        SendGridMessage msg = new SendGridMessage()
        {
            From = new EmailAddress(customer.Email, "From Email"),
            Subject = $"Inquiry by - {customer.FirstName} {customer.LastName}",
            PlainTextContent = customer.Comments + Environment.NewLine + $"Phone : {customer.Phone}",
        };
        msg.AddTo(new EmailAddress(ToMail, ToMailName));

        if (!String.IsNullOrWhiteSpace(customer.Attachment))
        {
            List<Attachment> attachments = new List<Attachment>()
            {
                new Attachment()
                {
                    Content = customer.Attachment,
                    Type = customer.AttachmentType,
                    Filename = customer.AttachmentFileName,
                    Disposition = "inline",
                    ContentId = customer.AttachmentFileName + Guid.NewGuid()
                }
            };
            msg.Attachments = attachments;
        }
        await client.SendEmailAsync(msg);

    }
}

В процессе поиска я обнаружил SO сообщение, в котором указано время отправки sendgrid для отправки электронной почты в консольном приложении.

Добавление времени тоже не помогло.

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

В процессе поиска я нашел этот пост, где они успешно протестировали отправку писем в консольном приложении, поэтому я подумал, что это может помочь, но не отправлял письма.

Всем приведенным выше примерам уже более года, и ни один из них не работает в настоящее время.

Я пытался использовать более раннюю версию библиотеки SendGrid, но застрял на

var transportWeb = new Web(credentials);
transportWeb.DeliverAsync(myMessage);

как библиотека SendGrid была обновлена.

На github я нашел это, в котором четко сказано, что консольные приложения работают только с transportWeb.DeliverAsync(myMessage).Wait

поэтому я пытаюсь с transportWeb.

Существует ли объединение лазури с веб-заданием по требованию, работающим как консольное приложение?

Кто-нибудь может помочь?

Обновить

После помощи Рэнди Миндера я обновил код до следующего

       static async Task Execute(string email)
    {
        try
        {

            DeserializedCustomer customer = new DeserializedCustomer();
            customer = JsonConvert.DeserializeObject<DeserializedCustomer>(email);
            Console.WriteLine(customer);
            SendGridMessage msg = new SendGridMessage();
            msg.From = new MailAddress(customer.EmailAddress, "From Email");
            msg.Subject = $"Inquiry by - {customer.FirstName} {customer.LastName}";
            msg.Text = customer.Comments + Environment.NewLine + $"Phone : {customer.Phone}";

            msg.AddTo(ToMail);

            // Create a network credentials object
            var credentials = new NetworkCredential(Environment.GetEnvironmentVariable("UserName"), Environment.GetEnvironmentVariable("Password"));

            var transportWeb = new SendGrid.Web(credentials);
            transportWeb.DeliverAsync(msg).Wait();
        }
        catch (Exception ex)
        {
            DateTime now = DateTime.Now;
            Trace.TraceError($"{now.ToLongDateString()} {now.ToLongTimeString()}" + Environment.NewLine + new ExceptionSerializer(ex));
        }
    }

Я использую SendGrid 6.1.0

 <package id="Sendgrid" version="6.1.0" targetFramework="net47" />

Я не получаю никаких исключений, и моя веб-работа проходит успешно


[09/06/2017 17:48:42 > 1a8d37: SYS INFO] Run script 'SaSRizqTechCloudWhizEngineering.Backgr.exe' with script host - 'WindowsScriptHost'
[09/06/2017 17:48:42 > 1a8d37: SYS INFO] Status changed to Running
[09/06/2017 17:48:42 > 1a8d37: INFO] SerializedEmail - {"FirstName":"adsfkh","LastName":"adfkjladf","EmailAddress":"jamilakhtar@gmail.com","Phone":"","Comments":"lkjadf ","AttachmentType":"","AttachmentFileName":"","Attachment":null}
[09/06/2017 17:48:42 > 1a8d37: INFO] FirstName adsfkh - LastName adfkjladf - EmailAddress jamilakhtar@gmail.com - Phone  - Comments lkjadf  - Attachment  - AttachmentType -  - AttachmentFileName 
[09/06/2017 17:48:44 > 1a8d37: SYS INFO] Status changed to Success

Однако я не получаю письма

2 ответа

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

/// <summary>
/// Send the email async in a console app.
/// </summary>
public async Task SendAsync()
{
    // Create a network credentials object
    var credentials = new NetworkCredential(azureUserName, azurePassword);

    // Create an Web transport for sending the email
    var transportWeb = new Web(credentials);

    transportWeb.DeliverAsync(this._email).Wait();
}

Вот что я использую в не консольном приложении:

    /// <summary>
    /// Send the email async in backend or MVC code.
    /// </summary>
    public async Task SendAsync()
    {
        // Create a network credentials object
        var credentials = new NetworkCredential(azureUserName, azurePassword);

    // Create an Web transport for sending the email
    var transportWeb = new Web(credentials);

    await transportWeb.DeliverAsync(this._email).ConfigureAwait(false);
}

Фактический объект электронной почты содержится в this._email,

Согласно вашему описанию, я также создал тестовую демонстрацию на моей стороне, она работает хорошо. Я использовал sendgird SDK 9.90.

Коды с данными, как показано ниже:

class Program
{
    static void Main(string[] args)
    {

         string  serializedEmail = args[0];

        Console.WriteLine($"SerializedEmail - {serializedEmail}");

        Customer customer = JsonConvert.DeserializeObject<Customer>(args[0]);

        //Customer customer = new Customer() { Name = "aaaa" };
        Execute(customer).Wait();
        Console.WriteLine(customer.Name);
        Console.ReadLine();

    }


    static async Task Execute(Customer customer)
    {

        var client = new SendGridClient("apikey");
        var from = new EmailAddress("sendgird@xxxxxx.com", "Example User");
        var subject = "Sending with SendGrid is Fun";
        var to = new EmailAddress("sendgird@xxxxxxx.com", "Example User");
        var plainTextContent = $"Name : {customer.Name}";
        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);
    }


}

public class Customer
{
    public string Name { get; set; }
}

Однако я не получаю письма

Я предлагаю вам сначала получить доступ к этому URL, чтобы проверить, что sendgird уже отправил письмо на правильный адрес электронной почты.

Результат таков:

Другие вопросы по тегам