Отправка запланированной электронной почты с помощью планировщика Azure / Почтовая / MVC

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

У меня есть электронная почта (отправка по почте). Если я запускаю саму функцию, письма отправляются как положено.

Я настроил планировщик Azure для запуска действия HTTP, get, метод [ https://www.example.com/Email/EmailReminder]. Запланированный отчет о работе как успешный, но никакие электронные письма не выходят.

Я не должен был делать это раньше, поэтому я подозреваю, что у меня отсутствует связь между моей функцией> заданием планировщика. Я искал примеры кода о том, как это настроить, но пока не нашел решения. Что планировщик ожидает, что я не даю это?

public void EmailReminder()
{
     var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
                string Full = i.Full;
                string FirstName = i.FirstName;
                var CheckOutCt = i.CheckOutCt;                   

                dynamic email = new Email("emReminder");
                email.FromAdd = "test@test.com";
                email.To = "test2@test2.com";
                email.NPFirstName = NPFirstName;
                email.CheckOutCt = CheckOutCt;
                email.Send();
      } 
}

2 ответа

Решение

Я думаю, что ваша лучшая ставка - это Webjob. Я предполагаю, что у вас уже есть веб-приложение, поэтому, если вы добавите веб-работу, использующую Webjob SDK, вы можете создать функцию с подписью:

public class Functions
{
    public static void ProcessTimer([TimerTrigger("0 0 9 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
                string Full = i.Full;
                string FirstName = i.FirstName;
                var CheckOutCt = i.CheckOutCt;                   

                dynamic email = new Email("emReminder");
                email.FromAdd = "test@test.com";
                email.To = "test2@test2.com";
                email.NPFirstName = NPFirstName;
                email.CheckOutCt = CheckOutCt;
                email.Send();
      } 
    }
}

Он использует TimerTrigger для запуска в определенный момент времени (определенный выражением CRON), это намного проще, чем подход HTTP POST (в котором вам нужно будет учитывать время ожидания HTTP).

Если у вас есть проблемы с выражениями CRON, проверьте CronMaker.

Для отправки электронной почты и следования примерам WebJobs SDK вы можете использовать расширение SendGrid в сочетании с очередью для развязки, таким образом вы можете иметь несколько функций TimerTrigger (например, утренние письма, вечерние письма для X, ночные письма для Y, Ежемесячные отчеты) и одна функция, которая отправляет все письма:

public class MailNotification{
    public string From {get;set;}
    public string To {get;set;}
    public string Subject {get;set;}
    public string Body {get;set;}
}

public class Functions
{
    public static void MorningMail([TimerTrigger("0 0 9 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info, [Queue]("mail") ICollector<MailNotification> mails)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
            mails.Add(new MailNotification(){
                To = "test2@test2.com",
                From = "test@test.com",
                Subject = "Whatever Subject you want",
                Body = "construct the body here"
            }); 

      } 
    }

    public static void EveningMail([TimerTrigger("0 0 18 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info, [Queue]("mail") ICollector<MailNotification> mails)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
            mails.Add(new MailNotification(){
                To = "test2@test2.com",
                From = "test@test.com",
                Subject = "Whatever Subject you want",
                Body = "construct the body here"
            }); 

      } 
    }

    public static void SendMails([QueueTrigger(@"mails")] MailNotification order,
        [SendGrid(
            To = "{To}",
            From = "{From}",
            Subject = "{Subject}",
            Text = "{Body}")]
        SendGridMessage message)
    {
        ;
    }
}

Что касается моего вопроса о том, почему планировщик Azure не отправлял мои электронные письма, это была проблема с аутентификацией, которая была решена на портале Azure.

Ответ Матиаса тоже был верным, и в каком направлении я буду двигаться в будущем.

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