【问题标题】:meteor send email by date and time流星按日期和时间发送电子邮件
【发布时间】:2013-10-17 16:28:33
【问题描述】:

我认为这是我在我的应用程序中处理的最困难的问题之一, 我已经安装了 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 重复执行此功能?

【问题讨论】:

    标签: javascript date meteor setinterval momentjs


    【解决方案1】:

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

    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 时间,而不会对您的数据库施加过多的负载。

    顺便说一句,如果您在操作或比较时刻对象时遇到任何问题,您可能需要在它们与数据库交互之前调用 toDate()。

    【讨论】:

    • 谢谢,我会检查一下并尝试使用它,我一定会告诉你我是否解决了这个问题以及如何处理。谢谢你 agian David Weldon
    • 嘿,大卫,我想知道你为什么选择预成型 $lte?考虑到您需要发送数百封电子邮件,为什么不只接收那些今天匹配的邮件:var d = new Date(); var d = d.getDay(); //需要是一个数字 (0,1,2 ...) var pendingEmails = Groups.find({emailAt: d}).fetch();该操作将减少数据库的负载。
    • 在我们的例子中,我们会在发送后从电子邮件集合中删除项目,因此$lte 将始终返回我们想要的集合。在您的实施中,如果您需要保留电子邮件,那么您应该按照您的建议在查询中添加一个过滤器。
    猜你喜欢
    • 2016-05-10
    • 2016-11-04
    • 2019-03-04
    • 1970-01-01
    • 2015-08-28
    • 2014-12-19
    • 1970-01-01
    • 2016-11-23
    • 2017-06-11
    相关资源
    最近更新 更多