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

时间:2013-10-17 16:28:34

标签: javascript date meteor setinterval momentjs

我认为这是我在我的应用中遇到的最难的问题之一, 我已经安装了moment.js(使用mrt)。 我想做的是让用户选择服务器向该用户朋友发送电子邮件的日期和时间。 例如:现在是星期四晚上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 个答案:

答案 0 :(得分:3)

我们在应用程序中做了类似的事情:

  1. 将待处理的电子邮件插入Emails日期为emailAt的集合中。
  2. 使用服务器上的setInterval定期轮询要发送的电子邮件。
  3. 您的轮询代码可能类似于:

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

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

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

    重要的是要记住您的服务器可以重置/挂起/等。因此,您需要将轮询间隔设置得足够小,以便对此进行补偿并接近emailAt时间,而不会对数据库施加太大负担。

    BTW如果您遇到任何操纵或与时刻对象进行比较的问题,您可能需要在它们与数据库交互之前调用toDate()