未能通过 Mandril & Parse-Cloud-Code 发送超过 9 封电子邮件

Posted

技术标签:

【中文标题】未能通过 Mandril & Parse-Cloud-Code 发送超过 9 封电子邮件【英文标题】:Failure to send more than 9 emails through Mandril & Parse-Cloud-Code 【发布时间】:2015-06-12 08:22:23 【问题描述】:

我在使用 mandrill 发送电子邮件模板时遇到问题。我现在的设置是解析服务器上的 javascript,该服务器设置有后台作业,每天使用 mandrill 的 api 向每个用户发送一次电子邮件。 我在发送大量电子邮件时遇到了一个问题,由于某种原因,我无法让 mandrill 一次发送超过 9 个电子邮件模板,需要发送超过 400 个。这应该不是问题,因为我通过此帐户发送电子邮件已有一段时间并且声誉良好。 我尝试在电子邮件中设置延迟,并更改模板发送中的选项,例如使它们异步发送。但无济于事,最多只能发送 9 个。

exports.FunctionSentDripEmailTemplateFour = function (user,TempateNum,isLastEmail,status,testing)
    var mandrillKey = 'my-key';
    var Mandrill = require('mandrill');

    if(testing) // send the email to me if testing
        EmailParams.message.to[0].email = 'test@email.com'; 
        EmailParams.message.merge_vars[0].rcpt = 'test@email.com';
    else
        EmailParams.message.to[0].email = user.get('email'); 
        EmailParams.message.merge_vars[0].rcpt = user.get('email');
    

    EmailParams.message.subject="Subject";
    EmailParams.template_name = "Template name";
    EmailParams.template_content[0].name = "Template content name";

    //console.log("T: " + TempateNum + " M: " + EmailParams.message.to[0].email);
    Mandrill.initialize(mandrillKey);
    Mandrill.sendTemplate(EmailParams, function(res) 
        console.log(res);
    , function(err) 
        console.log(err);
    );

    if(isLastEmail == true)
        //(finishes the parse job function)
        if(testing)
            status.success("Test Email Job completed successfully.");
        else
            status.success("Email Job completed successfully.");
        
    
    return new Parse.Promise(); 

另外,我只希望个人发送这些电子邮件,我不想使用复本,因为我在其他地方使用它来更改每封电子邮件。 你有什么想法?这对我来说意义重大。

【问题讨论】:

我也有同样的问题。我正在从 Parse Cloud Code 调用 Mailgun API。你知道如何解决这个问题吗? 【参考方案1】:

您的函数正在执行异步网络请求 (Mandrill.sendTemplate()),但它会立即返回,而无需等待此调用完成。

看起来您已经完成了使该功能按预期执行的一半。您应该首先初始化 Parse.Promise,并在函数末尾返回该 promise 对象。反过来,这个承诺应该在 Mandrill 代码完成时得到解决。

exports.FunctionSentDripEmailTemplateFour = function (user,TempateNum,isLastEmail,status,testing)
var mandrillKey = 'my-key';
var Mandrill = require('mandrill');

if(testing) // send the email to me if testing
    EmailParams.message.to[0].email = 'test@email.com'; 
    EmailParams.message.merge_vars[0].rcpt = 'test@email.com';
else
    EmailParams.message.to[0].email = user.get('email'); 
    EmailParams.message.merge_vars[0].rcpt = user.get('email');


EmailParams.message.subject="Subject";
EmailParams.template_name = "Template name";
EmailParams.template_content[0].name = "Template content name";

var promise = new Parse.Promise()
//console.log("T: " + TempateNum + " M: " + EmailParams.message.to[0].email);
Mandrill.initialize(mandrillKey);
Mandrill.sendTemplate(EmailParams, function(res) 
    console.log(res);
    promise.resolve(res);
, function(err) 
    console.log(err);
    promise.reject(err);
);

// commented out isLastEmail block - I am not sure this is the right place for that functionality

return promise; 

您现在可以执行以下操作:

FunctionSentDripEmailTemplateFour(user,templateNum,isLastEmail,status,testing).then(function(result) 
    status.success("One email sent successfully");
, function(err) 
    status.error("Failed to send email");
);

重写此代码以发送多封电子邮件作为练习留给读者。您应该能够按照 Parse 的 Promises 指南将其重写为一组并行的 Promise。

【讨论】:

以上是关于未能通过 Mandril & Parse-Cloud-Code 发送超过 9 封电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

mandril 拒绝原因:未签名

mandril 拒绝原因:未签名

Swift & Parse - 空 PFFile

QGraphicsView Scale & QGraphicsRectItem 绘画未能调用

"未能载入文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件"的解决方式

iOS Swift & Parse - getDataInBackground 不工作?