【问题标题】:Send bulk email using Parse.com Cloud Code使用 Parse.com 云代码发送批量电子邮件
【发布时间】:2016-03-16 12:47:20
【问题描述】:

在我正在创建的应用程序中,用户将能够将对象的描述发送给多个收件人(从 1 到 200)。使用 Parse Cloud Code 我将不得不使用 promise 来等待电子邮件服务器对每封电子邮件的响应(Mailgun)。

有没有其他方法可以将所有这些创建的电子邮件存储在某种数组中,然后一次性发送到电子邮件服务器?否则我会达到一个函数可以运行的最大 15 秒。

现在我用这个:

Parse.Cloud.define("emailobject", function(request, response) {

// ... some company info parameters
var theTraders = request.params.traders;

var objectQ = new Parse.Query("objects");
objectQ.equalTo("objectId", theObjectId);
objectQ.first({
    success:function(theObject) {
        // ... more code
        searchObjectPictures(theObject, {
            success:function(pictureObjects) {
                for (var a = 0; a < theTraders.length; a++) {
                    // create the parameters to create the email
                    var mailingParameters = {};
                    // ... create the parameters

                    // when the email html has been compiled
                    mailgun.sendWelcomeEmail({
                        to: traderEmail,
                        from: toString,
                        subject: subjectString,
                        html: mailing.getMailingHTML(mailingParameters)
                    }, {    
                        success:function(httpResponse) {
                            console.log(httpResponse);
                        }, 
                        error:function(httpResponse) {
                            console.log(httpResponse);
                        }
                    });
                }
                 // emailedObjectsToSave is an array of analytics objects
                Parse.Object.saveAll(emailedObjectsToSave, {
                    success:function(list) {
                        response.success(true);
                    }, 
                    error:function(error) {
                        response.error(error);
                    }
                });
            },
            error:function(error) {
                response.error(error);
            }
        });
    },
    error:function(error){
        response.error(error);
    }
});
});

我知道对于嵌套查询来说,promise 会更好,但我还在纠结这个问题。

谢谢

【问题讨论】:

  • 键是Parse.Promise.when(),它接受一个promise数组并返回一个promise,当所有传递的promise都被履行时,这个promise就会被履行。让您的 maligun 函数回答一个承诺(不提供完成处理程序),在循环中调用它并用这些承诺填充一个数组。
  • @danh 我会试试的。谢谢!对超时有任何想法吗?
  • 唯一的选择是以短频率运行并执行较小批次的计划作业,从上次运行停止的地方开始。

标签: javascript parse-platform


【解决方案1】:

经过大量的搜索、反复试验,我终于找到了解决方案。正如@danh 所说,最好将这些请求添加到作业队列中。这些对象现在被保存到一个“通知”类中,该类有一个布尔“通知”来检查这个对象是否已经被发送。 我会将代码发布在这里,供可能也搜索它的人使用。

首先将对象添加到新的“通知”类(队列)中。

Parse.Cloud.define("addToNotificationsQueue", function(request, response) {

    var roleName = request.params.role;
    var objects = request.params.objects;

    var newEmailObjectsToSave = [];
    var EmailedObjectClass = Parse.Object.extend("notifications");

    var emailObjectACL = new Parse.ACL();
    emailObjectACL.setPublicReadAccess(false);
    emailObjectACL.setRoleReadAccess(roleName, true);
    emailObjectACL.setRoleWriteAccess(roleName, true);

    for (var i = 0; i < objects.length; i++) {
        // define the parameters for the new objects based on the request params

        var emailObject = new EmailedObjectClass();
        // set all the details to your new emailObject
        emailObject.setACL(emailObjectACL);
        newEmailObjectsToSave.push(emailObject);
    }

    Parse.Object.saveAll(newEmailObjectsToSave, {
        success:function(list) {
            response.success(true);
        }, 
        error:function(error) {
            response.error(error);
        }
    });
});

然后定义你的工作。我现在每 15 分钟运行一次以进行测试。当邮件服务器开始更快地行动时,我会将限制和频率设置得更高。

Parse.Cloud.job("sendNotifications", function(request, status) {
    Parse.Cloud.useMasterKey();
    var numberOfNotificationsHandled;
    var query = new Parse.Query("notifications");
    query.limit(10); // limit because max 15 minutes, slow email server...
    query.notEqualTo("notified", true);
    query.find().then(function(notifications) {

        numberOfNotificationsHandled = notifications.length;

        var promise = Parse.Promise.as();

        _.each(notifications, function(notification) {

            var parameterDict = {};
            // add all parameters the emailObject function needs

            promise = promise.then(function(){
                return Parse.Cloud.run("emailObject", parameterDict).then(function(result) {
                    notification.set("notified", true);
                    notification.save();
                }, function(error) {
                    notification.set("notified", false);
                    notification.save();
                });
            });
        });

        return promise;

    }).then(function() {
        console.log("JOB COMPLETED");
        status.success("Sent " + numberOfNotificationsHandled + " emails");
    }, function(error) {
        console.log("JOB ERROR " + error);
        status.error("Job error " + error);
    });
});

emailObject 方法与其他方法一样只是一个 httpRequest。此方法等待这些 httpRequest 的响应。

【讨论】:

    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2010-12-11
    • 2023-03-28
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多