在 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
函数中。
我需要在生日和某些其他事件(例如即将到来的事件或列表即将过期)时发送一些电子邮件,但我不确定在 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
函数中。