使用MEAN Stack上的MailGun在Mongo数据库中找到的特定日期发送电子邮件

Kri*_*ris 0 cron mean mongodb express

我需要在生日和某些其他事件(例如即将发生的事件或列表即将到期)上发送一些电子邮件,但是我不确定在MEAN堆栈中执行此操作的最佳方法。

我应该创建另一个应用程序并永久使用它来每天浏览数据库还是实现Cron Job之类的东西?

这是我迄今为止在节点上的第一个应用程序,到目前为止很喜欢它:) NPM FTW!

tim*_*ice 5

更新:完整教程在这里

您可以使用服务器控制器和一些npm软件包在普通应用中立即执行此操作。

我知道的将调度邮件集成到节点应用程序中的两个最佳软件包是node-schedulemailgun-js

您将需要3个功能:一个mailSender功能,一个userSearch功能和一个scheduler功能。

您的mailgun电子邮件功能非常简单:

var mailSender = function (user, subject, html, callback) {
    var mailgun = new Mailgun({apiKey: mailgun_api, domain: mailgun_domain});

    var data = {
      from: 'mail@yourdomain.com',
      to: user.email,
      subject:  subject,
      html: html,
      // nifty test mode flag
      // 'o:testmode': true
    };

    mailgun.messages().send(data, function (err, body) {
      //handle errors and body
    }); 
};
Run Code Online (Sandbox Code Playgroud)

这将向user.email您传递给该功能的电子邮件发送一封电子邮件。该html可以是内联模板或文件的路径。

现在,您要查找有生日(或其他事件)的用户。最好的方法是使用猫鼬find()查询,并从用户模型中传递一个参数,并将变量设置为等于今天的日期。您的userSearch函数应包含以下内容(请记住它是asnyc,因此您将需要回调或保证将数据传递给另一个函数):

  User.find().where('birthday').equals(today).exec(    
    function(err, user){        
    var users = [];
    // handle error
    if (err) return console.log(err);
    for (var i = user.length - 1; i >= 0; i--) {        
        users.push(user[i]);
      } 
    return users;
  });
Run Code Online (Sandbox Code Playgroud)

使用node-scheduler包计划也很简单。您通过了一条规则,只要您的应用程序正在运行,它就会启动。规则如下所示:

  var rule = new schedule.RecurrenceRule();
      rule.dayOfWeek = [new schedule.Range(0, 6)];
      rule.hour = 12;
      rule.minute = 30;
Run Code Online (Sandbox Code Playgroud)

您的规则是每天下午12:30触发。然后,您将规则传递给scheduleJob方法:

  // fire your scheduled task given the rules above
  var j = schedule.scheduleJob(rule, function(){
      // whatever function  you want the job to trigger
  }
Run Code Online (Sandbox Code Playgroud)

您上面的userSearch函数可能会结合您的函数和您的mailSender函数。请记住,您userSearch是异步的,因此您将需要使用回调或Promise将用户数据传递到sendMailer函数中。

专家提示:

MEAN附带Swig来解析html模板,因此可以使用它来格式化电子邮件。像这样:

var email = swig.renderFile('app/views/templates/email.inlined.template.html', {
        //pass in your template variables
});
Run Code Online (Sandbox Code Playgroud)

并将其传递给您的mailSender函数。