流星按日期和时间发送电子邮件

meteor send email by date and time

本文关键字:电子邮件 时间 日期 流星      更新时间:2023-09-26

我认为这是我在我的应用程序中处理的最困难的问题之一,我已经安装了时刻.js(使用地铁)。我想做的是让用户选择一个日期和时间,服务器将向该用户朋友发送电子邮件。例如:现在是星期四晚上 9:13,用户希望在星期一上午 6:47 发送消息。在用户设置了时间之后,我希望每周在用户设置的日期和时间重复发送电子邮件。所以我想使用 MOMENT.js就像那样(客户端):

var now = moment(); (the current date and time).

然后使用像jqueryui这样的日期选择器或一个常见的选择器,以及一个时间选择器,来设置用户选择的时间和日期,就像这样(客户端):

var day = user selection using datepicker;
var time = user selection using timepicker;
var result = moment.set(day,time);

将结果插入数据库:

DateToSendEmail.insert({date:result});

最后有代码真正执行 Email.send 函数(在服务器端):

var DateToSend = DateToSendEmail.findOne({});
var thisMoment = moment();
if(DateToSend === thisMoment){
Email.send({
to:[friends]
from:"myApplication@xxx.com"
Subject:"auto email send"
html:"auto email send"
});
}

我不知道的一件事是,如果用户没有进入应用程序一段时间(比如一个月),它是否会起作用,或者我应该使用 Meteor.setInterval 重复执行此功能?

我们在应用程序中做了一些非常相似的事情:

  1. 将待处理的电子邮件插入具有emailAt日期的Emails集合中。
  2. 使用服务器上的setInterval定期轮询要发送的电子邮件。

轮询代码可能如下所示:

Meteor.startup(function() {
  if (process.env.METEOR_ENV === 'production') {
    Meteor.setInterval(sendPendingEmails, ONE_HOUR);
  }
});

幸运的是,Date对象都是用 UTC 编写的,因此您对它们执行的任何数学运算都应独立于用户或服务器的时区。此外,从Emails集合中提取时可以使用$lte,如下所示:

var sendPendingEmails = function() {
  var currentDate = new Date();
  var pendingEmails = Emails.find({emailAt: {$lte: currentDate}}).fetch();
  ...
};

重要的是要记住,您的服务器可能会被重置/挂起/等,因此您需要设置一个足够小的轮询间隔来补偿这一点,并在不对数据库施加太多负载的情况下接近emailAt时间。

顺便说一句,如果您在操作或比较 moment 对象时遇到任何问题,您可能希望在它们与 DB 交互之前对它们调用toDate()