aboutsummaryrefslogtreecommitdiffstats
path: root/tools/node_modules/nodemailer/lib/nodemailer.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/nodemailer/lib/nodemailer.js')
-rw-r--r--tools/node_modules/nodemailer/lib/nodemailer.js285
1 files changed, 285 insertions, 0 deletions
diff --git a/tools/node_modules/nodemailer/lib/nodemailer.js b/tools/node_modules/nodemailer/lib/nodemailer.js
new file mode 100644
index 0000000..6b5b6d5
--- /dev/null
+++ b/tools/node_modules/nodemailer/lib/nodemailer.js
@@ -0,0 +1,285 @@
+var Transport = require("./transport").Transport,
+ MailComposer = require("mailcomposer").MailComposer,
+ XOAuthGenerator = require("./xoauth").XOAuthGenerator,
+ helpers = require("./helpers"),
+ packageData;
+
+try{
+ packageData = require("../package.json");
+}catch(E){
+ // probably node 0.4 which doesn't support loading json files as objects
+ packageData = JSON.parse(
+ require("fs").
+ readFileSync(
+ require("path").
+ join(
+ __dirname,
+ "..",
+ "package.json"
+ )
+ )
+ );
+}
+
+
+/*
+ * Version constants
+ */
+var X_MAILER_NAME = "Nodemailer",
+ X_MAILER_HOMEPAGE = "http://andris9.github.com/Nodemailer/";
+
+module.exports.X_MAILER_NAME = X_MAILER_NAME;
+module.exports.X_MAILER_HOMEPAGE = X_MAILER_HOMEPAGE;
+
+// Export createTransport method
+module.exports.createTransport = function(type, options){
+ var transport = new Transport(type, options);
+ transport.sendMail = function(options, callback){
+ options = options || {};
+ options.transport = options.transport || transport;
+ sendMail(options, callback);
+ };
+ return transport;
+};
+
+//Export createXOAuthGenerator function
+module.exports.createXOAuthGenerator = function(options){
+ return new XOAuthGenerator(options);
+};
+
+
+// Export Transport constructor
+module.exports.Transport = Transport;
+
+// Export Nodemailer constructor
+module.exports.Nodemailer = Nodemailer;
+
+// Export sendMail function (and the alias send_mail for legacy)
+module.exports.sendMail = module.exports.send_mail = sendMail;
+
+function sendMail(options, callback){
+ var mailer = new Nodemailer(options);
+
+ mailer.validateSettings(function(err){
+ if(err){
+ // report validation error back to the client
+ return callback(err);
+ }else{
+ // try to send the e-mail message
+ mailer.sendMail(callback);
+ }
+ });
+
+ return mailer;
+}
+
+
+/**
+ * <p>Generates a Nodemailer object which is the main 'hub' for managing the
+ * send process</p>
+ *
+ * @constructor
+ * @param {Object} options Message options object, see README for the complete list of possible options
+ */
+function Nodemailer(options){
+ this.options = options || {};
+
+ this.transport = this.options.transport;
+
+ if( this.options.encoding ){
+ this.mailcomposer = new MailComposer({encoding: this.options.encoding});
+ } else {
+ this.mailcomposer = new MailComposer();
+ }
+
+ if(!this.transport){
+ this.transport = this.getGlobalTransport();
+ }
+}
+
+/**
+ * <p>Generates an user agent string for Nodemailer with homepage, version etc.</p>
+ *
+ * @return {String} user agent string for X-Mailer value
+ */
+Nodemailer.prototype.generateUserAgentString = function(){
+ var details = [];
+
+ if(packageData.version){
+ details.push(packageData.version);
+ }
+
+ if(X_MAILER_HOMEPAGE){
+ details.push("+"+X_MAILER_HOMEPAGE);
+ }
+
+ return X_MAILER_NAME+ (details.length?" ("+details.join("; ")+")":"");
+};
+
+/**
+ * <p>Add support for legacy transport settings by checking for global
+ * variables SMTP, sendmail and SES</p>
+ *
+ * @return {Object} {@link Transport} object
+ */
+Nodemailer.prototype.getGlobalTransport = function(){
+ if(this.options.SMTP){
+ // cache the transport for SMTP as it is actually a connection pool
+ if(!this.options.SMTP._smtp_transport){
+ this.options.SMTP._smtp_transport = new Transport("SMTP", this.options.SMTP);
+ }
+ return this.options.SMTP._smtp_transport;
+ }else if(this.options.sendmail){
+ return new Transport("sendmail", this.options.sendmail);
+ }else if(this.options.SES){
+ return new Transport("SES", this.options.SES);
+ }else if(module.exports.SMTP){
+ // cache the transport for SMTP as it is actually a connection pool
+ if(!module.exports._smtp_transport){
+ module.exports._smtp_transport = new Transport("SMTP", module.exports.SMTP);
+ }
+ return module.exports._smtp_transport;
+ }else if(module.exports.sendmail){
+ return new Transport("sendmail", module.exports.sendmail);
+ }else if(module.exports.SES){
+ return new Transport("SES", module.exports.SES);
+ }
+ return false;
+};
+
+/**
+ * <p>Doesn't do much currently, if the future should link to transport
+ * validation methods. For example in case of SES should check that AWS
+ * keys are set up etc.</p>
+ *
+ * @param {Function} callback Callback function to run after validation
+ */
+Nodemailer.prototype.validateSettings = function(callback){
+ if(!this.transport || !this.transport.transport){
+ return callback(new Error("No transport method defined"));
+ }
+ callback(null);
+};
+
+/**
+ * <p>Send the e-mail message by using data from the original options object
+ * and selected transport</p>
+ *
+ * @param {Function} callback Callback function to run when the e-mail has been sent (or it failed)
+ */
+Nodemailer.prototype.sendMail = function(callback){
+ // compose the e-mail
+ this.generateMailObject();
+ // send the message using preselected transport method
+ this.transport.sendMailWithTransport(this.mailcomposer, callback);
+};
+
+/**
+ * <p>Uses the data from the original options object to compose a mailcomposer
+ * e-mail message that can be later streamed to the selected transport</p>
+ */
+Nodemailer.prototype.generateMailObject = function(){
+
+ // set envelope data, subject etc.
+ this.setGeneralOptions();
+
+ // set module defined headers (date, message-id, etc.)
+ this.setModuleHeaders();
+
+ // set user defined headers (if any)
+ this.setUserHeaders();
+
+ // set attachments (if any)
+ this.setAttachments();
+};
+
+/**
+ * <p>Uses the general options (message sender and receiver, subject body, etc.)
+ * to set mailcomposer properties. Includes support for legacy properties.</p>
+ */
+Nodemailer.prototype.setGeneralOptions = function(){
+
+ // generate plaintext if only HTML exists and generateTextFromHTML is true
+ if(!(this.options.text || this.options.body) && (this.options.html) &&
+ this.options.generateTextFromHTML){
+ this.options.text = helpers.stripHTML(this.options.html);
+ }
+
+ var acceptedFields = ["from", "sender", "to", "subject", "replyTo", "debug",
+ "reply_to", "cc", "bcc", "body", "text", "html",
+ "envelope", "inReplyTo", "references"],
+ mailOptions = {},
+ keys = Object.keys(this.options),
+ key;
+
+
+
+ for(var i=0, len=keys.length; i<len; i++){
+ key = keys[i];
+ if(acceptedFields.indexOf(key) >=0 && this.options[key]){
+ mailOptions[key] = this.options[key];
+ }
+ }
+
+ if(this.options.debug){
+ console.log(mailOptions);
+ }
+
+ this.mailcomposer.setMessageOption(mailOptions);
+};
+
+/**
+ * <p>If the 'headers' property was set on the options, add the values to the
+ * header of the e-mail message</p>
+ */
+Nodemailer.prototype.setUserHeaders = function(){
+ if(typeof this.options.headers != "object"){
+ return;
+ }
+ var keys = Object.keys(this.options.headers),
+ key;
+
+ for(var i=0, len=keys.length; i<len; i++){
+ key = keys[i];
+ if(this.options.headers[key]){
+ this.mailcomposer.addHeader(key, this.options.headers[key]);
+ }
+ }
+};
+
+/**
+ * <p>Add some required headers to the message, such as Date: and Message-Id:</p>
+ */
+Nodemailer.prototype.setModuleHeaders = function(){
+
+ // Mailer name + version
+ this.mailcomposer.addHeader("X-Mailer", this.generateUserAgentString());
+
+ // Date
+ this.mailcomposer.addHeader("Date", new Date().toUTCString());
+
+ // Message ID
+ if(this.options.messageId){
+ this.mailcomposer.addHeader("Message-Id", "<"+this.options.messageId+">");
+ }else if(this.options.messageId !== false){
+ this.mailcomposer.addHeader("Message-Id", "<"+
+ Date.now()+Math.random().toString(16).substr(1)+"@"+
+ X_MAILER_NAME+">");
+ }
+};
+
+/**
+ * <p>If attachment array is set on the options object, add these attachments
+ * to the mailcomposer object</p>
+ */
+Nodemailer.prototype.setAttachments = function(){
+ if(!Array.isArray(this.options.attachments)){
+ return;
+ }
+ var attachment;
+ for(var i=0, len=this.options.attachments.length; i<len; i++){
+ attachment = this.options.attachments[i];
+ attachment.userAgent = attachment.userAgent || this.generateUserAgentString();
+ this.mailcomposer.addAttachment(attachment);
+ }
+};