首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Amazon SES和Node js的邮件平台

使用Amazon SES和Node js的邮件平台
EN

Stack Overflow用户
提问于 2013-06-08 17:38:15
回答 3查看 696关注 0票数 0

我有一个案例,我需要使用amazon SES实现一个邮件平台。我决定使用Node.js来实现所需的并发性。

在node js应用程序中,我将从redis存储中获取所有联系人。我特别要求的是,我需要限制应用程序以特定的速率调用Amazon的api,例如每秒x封电子邮件,否则我将被Amazon扼杀。有没有人可以建议我如何使用Node.js实现这个速率限制?我已经尝试了limiter软件包,但不能遵循确切的工作原理。也没有足够的文档可用。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2013-06-09 01:06:41

我有一个使用mongodb的类似设置。消息由不同的应用程序排队到集合中,并由单独的节点应用程序处理。

代码语言:javascript
运行
复制
var mongoose = require('mongoose'),
    _ = require('underscore') ;

var BATCH_SIZE = 50;
var INTERVAL = 60000;

mongoose.connect('mongodb://localhost/outbox');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

var MessageSchema = new Schema({
    to: {type:String},
    subject: {type:String},
    body: {type:String},
    queued: {type:Date}

});
var Message = mongoose.model('Message',MessageSchema);

function processQueue(){
    var query = Message.find({}).sort({queued: -1}).limit(BATCH_SIZE);
    query.exec(function(err,messages){
        if (err) return handleError(err);
        if (!messages.length){
            console.log('Queue is empty');
        }else{
            _.each(messages,function(msg){
                 sendTheSESMessage(msg, function(success){
                     if (success){
                         //remove from queue
                         msg.remove();
                     }else{
                         //handle it
                     }
                 })
            });
        }
    });

}

setInterval(processQueue, INTERVAL);
票数 0
EN

Stack Overflow用户

发布于 2013-06-09 14:00:18

EDIT 2: Underscore已经实现了类似的东西,看看throttle function

编辑:我已经用下面的代码制作了一个模块,请访问:https://github.com/gammasoft/rate-limited

这是一个非常简单的实现,可能会对您有所帮助。

参数:

包含要通过SES

  • fn:函数发送的电子邮件地址的
  1. params:数组,该函数将在每次调用fn之间的time
  2. timeout:最短时间(以毫秒为单位)发送一封电子邮件,例如:对于100封电子邮件/秒,则传递1000/100 (1秒除以100 emails)
  3. callback:函数,当一切都结束时将调用该函数

代码

代码语言:javascript
运行
复制
// rate-limit.js
var async = require("async");

module.exports = function(params, fn, timeout, callback){
    var length = params.length;
    var wait = function(cb){
        if(--length === 0) return cb();
        else setTimeout(function(){
            cb();
        }, timeout);
    };

    async.eachSeries(params, async.compose(wait, fn), function(err){
        callback(err);
    });
};

module.exports.timesPerSecond = function(times){
    if(times === 0) throw new Error("Should not be zero");
    return 1000/times;
};

module.exports.timesPerMinute = function(times){
    if(times === 0) throw new Error("Should not be zero");
    return (60 * 1000)/times;
};

使用

代码语言:javascript
运行
复制
//test.js
var rateLimited = require("./rate-limit.js");
var timesPerMinute = rateLimited.timesPerMinute; 
console.time("time");

rateLimited([1, 2, 3, 4, 5, 6], function(name, cb){
    console.log(name);
    cb();
}, timesPerMinute(5), function(err){
    if(err) throw err;
    console.timeEnd("time");
});
票数 0
EN

Stack Overflow用户

发布于 2015-12-25 14:41:15

据称,nodemailer允许您将速率限制设置为选项参数。

nodemailer-ses-transport doc中所述

代码语言:javascript
运行
复制
var transport = nodemailer.createTransport(sesTransport({
    accessKeyId: "AWSACCESSKEY",
    secretAccessKey: "AWS/Secret/key",
    rateLimit: 5 // do not send more than 5 messages in a second
}));

一旦设置了传输对象,您就可以像这样使用它,只需添加邮件选项来构建电子邮件(不必发送html,请参阅nodemailer文档中的其他选项):

代码语言:javascript
运行
复制
  var mailOptions = {
    from: 'CompanyName <info@mycompany.com>',
    to: 'email@email.net',
    subject: 'This is a subject',
    html: '<h1>Some html here</h1>',
  };

然后发送:

代码语言:javascript
运行
复制
transporter.sendMail(mailOptions, function(error, info){
    if(error){
        // handle error
    } else {
      // handle success
    } 
});

正如您所看到的,它非常简单-很容易设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16998148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档