2016-01-19 5 views
1

Мой проект размещен на Azure, и я хотел бы каждый день отправлять по электронной почте пользователям, забывшим выполнить определенные задачи в моем приложении.Отправлять по электронной почте по расписанию с помощью Azure Scheduler/Postal/MVC

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

Я настроил планировщик Azure для запуска действия HTTPs, get method, [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 = "[email protected]"; 
       email.To = "[email protected]"; 
       email.NPFirstName = NPFirstName; 
       email.CheckOutCt = CheckOutCt; 
       email.Send(); 
     } 
} 
+0

Вы правильно настроили исходящий SMTP-порт в вашем web.config [как описано здесь] (http://aboutcode.net/postal/smtp-config.html)? Подсказка. Azure не предоставляет для вас чистый SMTP-сервер. Вам понадобится сторонний, такой как [SendGrid] (https://azure.microsoft.com/en-us/documentation/articles/sendgrid-dotnet-how -to-send-email /), или вы можете развернуть виртуальную машину, если хотите перевернуть ее. –

+0

Да. Письма отправляются правильно, если только доступ выполняется выше. Однако планировщик, созданный для доступа к этой странице, работает успешно, но ничего не отправляет. Я знаю, что в моем коде отсутствует что-то, что ищет планировщик. Если он создает задание cron из вышеперечисленного, я не знаю, как это сделать. – Daniela

+1

Как вы определяете, что письмо не вышло? Вы сказали, что работа показывает, что она работала в истории заданий, и когда вы нажимаете на ссылку вручную, электронная почта гаснет. Возможно, проблема аутентификации? Если это так, возможно, [эти документы] (https://azure.microsoft.com/en-us/documentation/articles/scheduler-outbound-authentication/) помогут. –

ответ

4

Я думаю, что ваш лучший выбор - это Webjob. Я предполагаю, что у вас уже есть веб-приложения, так что если вы добавляете 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 = "[email protected]"; 
       email.To = "[email protected]"; 
       email.NPFirstName = NPFirstName; 
       email.CheckOutCt = CheckOutCt; 
       email.Send(); 
     } 
    } 
} 

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

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

Для отправки электронной почты и после образцы WebJobs SDK, вы можете использовать SendGrid extension в паре с очередью для развязку, таким образом, вы можете иметь несколько функций TimerTrigger (например, Утренняя почта, вечерняя Mails для X цели, Night электронная почта для 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 = "[email protected]", 
       From = "[email protected]", 
       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 = "[email protected]", 
       From = "[email protected]", 
       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) 
    { 
     ; 
    } 
} 
+0

Недостатком такого подхода является то, что веб-задание должно быть «всегда включено», тогда как планировщик может выполнять задание только в запланированное время. Перед выбором следует провести анализ затрат и выгод. См. Также: https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/#CreateScheduledCRON –

+1

Это правда, если веб-приложение уже всегда включено, у него нет дополнительных затрат , Однако у Планировщика есть техническая проблема обработки HTTP-тайм-аута, он попытается повторно запустить Job, если вы не измените стратегию повторного запуска, которая не является простым подвигом и может быть достигнута только с помощью API управления. –

+0

Интересно. Любая ссылка с более подробной информацией? Также я думаю, что вопрос OP не столько о планировщике, сколько о используемой библиотеке электронной почты. –

1

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

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