1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/rocketchat_ynh.git synced 2024-09-03 20:16:25 +02:00
rocketchat_ynh/sources/programs/server/packages/email.js
2016-04-29 16:32:48 +02:00

223 lines
22 KiB
JavaScript

(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var _ = Package.underscore._;
/* Package-scope variables */
var Email, EmailTest, EmailInternals;
(function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/email/email.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Future = Npm.require('fibers/future'); // 1
var urlModule = Npm.require('url'); // 2
// 3
Email = {}; // 4
EmailTest = {}; // 5
// 6
EmailInternals = { // 7
NpmModules: { // 8
mailcomposer: { // 9
version: Npm.require('mailcomposer/package.json').version, // 10
module: Npm.require('mailcomposer') // 11
} // 12
} // 13
}; // 14
// 15
var MailComposer = EmailInternals.NpmModules.mailcomposer.module.MailComposer; // 16
// 17
var makePool = function (mailUrlString) { // 18
var mailUrl = urlModule.parse(mailUrlString); // 19
if (mailUrl.protocol !== 'smtp:') // 20
throw new Error("Email protocol in $MAIL_URL (" + // 21
mailUrlString + ") must be 'smtp'"); // 22
// 23
var port = +(mailUrl.port); // 24
var auth = false; // 25
if (mailUrl.auth) { // 26
var parts = mailUrl.auth.split(':', 2); // 27
auth = {user: parts[0] && decodeURIComponent(parts[0]), // 28
pass: parts[1] && decodeURIComponent(parts[1])}; // 29
} // 30
// 31
var simplesmtp = Npm.require('simplesmtp'); // 32
var pool = simplesmtp.createClientPool( // 33
port, // Defaults to 25 // 34
mailUrl.hostname, // Defaults to "localhost" // 35
{ secureConnection: (port === 465), // 36
// XXX allow maxConnections to be configured? // 37
auth: auth }); // 38
// 39
pool._future_wrapped_sendMail = _.bind(Future.wrap(pool.sendMail), pool); // 40
return pool; // 41
}; // 42
// 43
var getPool = _.once(function () { // 44
// We delay this check until the first call to Email.send, in case someone // 45
// set process.env.MAIL_URL in startup code. // 46
var url = process.env.MAIL_URL; // 47
if (! url) // 48
return null; // 49
return makePool(url); // 50
}); // 51
// 52
var next_devmode_mail_id = 0; // 53
var output_stream = process.stdout; // 54
// 55
// Testing hooks // 56
EmailTest.overrideOutputStream = function (stream) { // 57
next_devmode_mail_id = 0; // 58
output_stream = stream; // 59
}; // 60
// 61
EmailTest.restoreOutputStream = function () { // 62
output_stream = process.stdout; // 63
}; // 64
// 65
var devModeSend = function (mc) { // 66
var devmode_mail_id = next_devmode_mail_id++; // 67
// 68
var stream = output_stream; // 69
// 70
// This approach does not prevent other writers to stdout from interleaving. // 71
stream.write("====== BEGIN MAIL #" + devmode_mail_id + " ======\n"); // 72
stream.write("(Mail not sent; to enable sending, set the MAIL_URL " + // 73
"environment variable.)\n"); // 74
mc.streamMessage(); // 75
mc.pipe(stream, {end: false}); // 76
var future = new Future; // 77
mc.on('end', function () { // 78
stream.write("====== END MAIL #" + devmode_mail_id + " ======\n"); // 79
future['return'](); // 80
}); // 81
future.wait(); // 82
}; // 83
// 84
var smtpSend = function (pool, mc) { // 85
pool._future_wrapped_sendMail(mc).wait(); // 86
}; // 87
// 88
/** // 89
* Mock out email sending (eg, during a test.) This is private for now. // 90
* // 91
* f receives the arguments to Email.send and should return true to go // 92
* ahead and send the email (or at least, try subsequent hooks), or // 93
* false to skip sending. // 94
*/ // 95
var sendHooks = []; // 96
EmailTest.hookSend = function (f) { // 97
sendHooks.push(f); // 98
}; // 99
// 100
// Old comment below // 101
/** // 102
* Send an email. // 103
* // 104
* Connects to the mail server configured via the MAIL_URL environment // 105
* variable. If unset, prints formatted message to stdout. The "from" option // 106
* is required, and at least one of "to", "cc", and "bcc" must be provided; // 107
* all other options are optional. // 108
* // 109
* @param options // 110
* @param options.from {String} RFC5322 "From:" address // 111
* @param options.to {String|String[]} RFC5322 "To:" address[es] // 112
* @param options.cc {String|String[]} RFC5322 "Cc:" address[es] // 113
* @param options.bcc {String|String[]} RFC5322 "Bcc:" address[es] // 114
* @param options.replyTo {String|String[]} RFC5322 "Reply-To:" address[es] // 115
* @param options.subject {String} RFC5322 "Subject:" line // 116
* @param options.text {String} RFC5322 mail body (plain text) // 117
* @param options.html {String} RFC5322 mail body (HTML) // 118
* @param options.headers {Object} custom RFC5322 headers (dictionary) // 119
*/ // 120
// 121
// New API doc comment below // 122
/** // 123
* @summary Send an email. Throws an `Error` on failure to contact mail server // 124
* or if mail server returns an error. All fields should match // 125
* [RFC5322](http://tools.ietf.org/html/rfc5322) specification. // 126
* // 127
* If the `MAIL_URL` environment variable is set, actually sends the email. // 128
* Otherwise, prints the contents of the email to standard out. // 129
* // 130
* Note that this package is based on mailcomposer version `0.1.15`, so make // 131
* sure to refer to the documentation for that version if using the // 132
* `attachments` or `mailComposer` options. // 133
* [Click here to read the mailcomposer 0.1.15 docs](https://github.com/andris9/mailcomposer/blob/7c0422b2de2dc61a60ba27cfa3353472f662aeb5/README.md).
* // 135
* @locus Server // 136
* @param {Object} options // 137
* @param {String} options.from "From:" address (required) // 138
* @param {String|String[]} options.to,cc,bcc,replyTo // 139
* "To:", "Cc:", "Bcc:", and "Reply-To:" addresses // 140
* @param {String} [options.subject] "Subject:" line // 141
* @param {String} [options.text|html] Mail body (in plain text and/or HTML) // 142
* @param {Object} [options.headers] Dictionary of custom headers // 143
* @param {Object[]} [options.attachments] Array of attachment objects, as // 144
* described in the [mailcomposer documentation](https://github.com/andris9/mailcomposer/blob/7c0422b2de2dc61a60ba27cfa3353472f662aeb5/README.md#add-attachments).
* @param {MailComposer} [options.mailComposer] A [MailComposer](https://github.com/andris9/mailcomposer)
* object representing the message to be sent. Overrides all other options. You // 147
* can access the `mailcomposer` npm module at // 148
* `EmailInternals.NpmModules.mailcomposer.module`. // 149
*/ // 150
Email.send = function (options) { // 151
for (var i = 0; i < sendHooks.length; i++) // 152
if (! sendHooks[i](options)) // 153
return; // 154
// 155
var mc; // 156
if (options.mailComposer) { // 157
mc = options.mailComposer; // 158
} else { // 159
mc = new MailComposer(); // 160
// 161
// setup message data // 162
mc.setMessageOption({ // 163
from: options.from, // 164
to: options.to, // 165
cc: options.cc, // 166
bcc: options.bcc, // 167
replyTo: options.replyTo, // 168
subject: options.subject, // 169
text: options.text, // 170
html: options.html // 171
}); // 172
// 173
_.each(options.headers, function (value, name) { // 174
mc.addHeader(name, value); // 175
}); // 176
// 177
_.each(options.attachments, function(attachment){ // 178
mc.addAttachment(attachment); // 179
}); // 180
} // 181
// 182
var pool = getPool(); // 183
if (pool) { // 184
smtpSend(pool, mc); // 185
} else { // 186
devModeSend(mc); // 187
} // 188
}; // 189
// 190
////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package.email = {
Email: Email,
EmailInternals: EmailInternals,
EmailTest: EmailTest
};
})();
//# sourceMappingURL=email.js.map