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

Send email on certain dates found in Mongo db using MailGun on MEAN Stack

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

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

这是我在 node 中的第一个应用程序,到目前为止我很喜欢它:) NPM FTW!

更新:完整教程here

您可以使用服务器控制器和一些 npm 包在您的 mean 应用程序中正确执行此操作。

我知道将计划邮件集成到节点应用程序中的两个最佳软件包是 node-schedule and mailgun-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
    }); 
};

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

现在您想查找过生日(或其他活动)的用户。最好是使用 mongoose 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;
  });

使用 node-scheduler 包调度也很简单。你传入一个规则,只要你的应用程序是 运行,它就会触发。规则如下所示:

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

此处您的规则是每天在 12:30PM 触发。 然后将规则传递给 scheduleJob 方法:

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

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

专业提示:

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

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

并将其传递到您的 mailSender 函数中。