%PDF- %PDF-
| Direktori : /home/opti/workflow/node_modules/express-mailer/node_modules/nodemailer/lib/engines/ |
| Current File : /home/opti/workflow/node_modules/express-mailer/node_modules/nodemailer/lib/engines/ses.js |
"use strict";
/*
* This file is based on the original SES module for Nodemailer by dfellis
* https://github.com/andris9/Nodemailer/blob/11fb3ef560b87e1c25e8bc15c2179df5647ea6f5/lib/engines/SES.js
* and on the rewrite by andris9
* https://github.com/andris9/Nodemailer/blob/3ac11ae9a9faf95aabd9bffb37ca702fe33105e4/lib/engines/ses.js
*/
// NB! Amazon SES does not allow unicode filenames on attachments!
var AWS = require('aws-sdk');
// Expose to the world
module.exports = SESTransport;
/**
* <p>Generates a Transport object for Amazon SES with aws-sdk</p>
*
* <p>Possible options can be the following:</p>
*
* <ul>
* <li><b>accessKeyId</b> - AWS access key (optional)</li>
* <li><b>secretAccessKey</b> - AWS secret (optional)</li>
* <li><b>region</b> - optional region (defaults to <code>"us-east-1"</code>)
* </ul>
*
* @constructor
* @param {Object} optional config parameter for the AWS SES service
*/
function SESTransport(options) {
var pattern = /(.*)email(.*)\.(.*).amazonaws.com/i,
result = pattern.exec(options.ServiceUrl);
this.options = options || {};
this.options.accessKeyId = options.accessKeyId || options.AWSAccessKeyID;
this.options.secretAccessKey = options.secretAccessKey || options.AWSSecretKey;
this.options.sessionToken = options.sessionToken || options.AWSSecurityToken;
this.options.apiVersion = '2010-12-01';
this.options.region = options.region || (result && result[3]) || 'us-east-1';
this.ses = new AWS.SES(this.options);
}
/**
* <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
*
* @param {Object} emailMessage MailComposer object
* @param {Function} callback Callback function to run when the sending is completed
*/
SESTransport.prototype.sendMail = function (emailMessage, callback) {
// SES strips this header line by itself
emailMessage.options.keepBcc = true;
this.generateMessage(emailMessage, (function (err, email) {
if (err) {
return typeof callback === "function" && callback(err);
}
this.handleMessage(email, callback);
}).bind(this));
};
/**
* <p>Compiles and sends the request to SES with e-mail data</p>
*
* @param {String} email Compiled raw e-mail as a string
* @param {Function} callback Callback function to run once the message has been sent
*/
SESTransport.prototype.handleMessage = function (email, callback) {
var params = {
RawMessage: { // required
Data: new Buffer(email, "utf-8") // required
}
};
this.ses.sendRawEmail(params, this.responseHandler.bind(this, callback));
};
/**
* <p>Handles the response for the HTTP request to SES</p>
*
* @param {Function} callback Callback function to run on end (binded)
* @param {Object} err Error object returned from the request
* @param {Object} data De-serialized data returned from the request
*/
SESTransport.prototype.responseHandler = function (callback, err, data) {
if (err) {
if (!(err instanceof Error)) {
err = new Error('Email failed: ' + err);
}
return typeof callback === "function" && callback(err, null);
}
return typeof callback === "function" && callback(null, {
messageId: data && data.MessageId && data.MessageId + "@email.amazonses.com"
});
};
/**
* <p>Compiles the messagecomposer object to a string.</p>
*
* <p>SES requires strings as parameter so the message needs to be fully composed as a string.</p>
*
* @param {Object} emailMessage MailComposer object
* @param {Function} callback Callback function to run once the message has been compiled
*/
SESTransport.prototype.generateMessage = function (emailMessage, callback) {
var email = "";
emailMessage.on("data", function (chunk) {
email += (chunk || "").toString("utf-8");
});
emailMessage.on("end", function (chunk) {
email += (chunk || "").toString("utf-8");
callback(null, email);
});
emailMessage.streamMessage();
};