使用Azure Scheduler/Postal/MVC发送预定电子邮件

Dan*_*ela 2 c# asp.net-mvc azure postal

我的项目托管在Azure上,我想每天早上向忘记在我的应用程序中完成某些任务的用户发送电子邮件.

我建立了电子邮件(使用Postal发送).如果我自己运行该功能,电子邮件将按预期发送.

我已将Azure调度程序配置为运行HTTPs操作,获取方法,[ 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();
      } 
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*nta 6

我认为你最好的选择是Webjob.我假设你已经有了一个Web应用程序,所以如果添加一个使用Webjob SDKWebjob,你可以使用签名创建一个函数:

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();
      } 
    }
}
Run Code Online (Sandbox Code Playgroud)

它使用TimerTrigger在给定时间触发(由CRON表达式定义),它比HTTP POST方法(在其中需要考虑HTTP超时)要简单得多.

如果您在使用CRON表达式时遇到问题,请检查CronMaker.

对于发送和关注WebJobs SDK示例的电子邮件,您可以使用与Queue配对的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)
    {
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)