@nocobase/plugin-workflow-mailer 2.3.0-beta.13 → 2.3.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/externalVersion.js +6 -6
- package/dist/node_modules/joi/package.json +1 -1
- package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
- package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
- package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
- package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
- package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
- package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
- package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
- package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
- package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
- package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
- package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
- package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
- package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
- package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
- package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
- package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +62 -111
- package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
- package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
- package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
- package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
- package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
- package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
- package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
- package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
- package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
- package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/addressparser/index.js +361 -131
- package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +31 -56
- package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +49 -78
- package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/message-parser.js +64 -42
- package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
- package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/sign.js +50 -46
- package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/errors.js +26 -18
- package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
- package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
- package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/fetch/index.js +80 -147
- package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/json-transport/index.js +19 -39
- package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +199 -265
- package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +128 -234
- package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +62 -114
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +29 -42
- package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +259 -372
- package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
- package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +6 -11
- package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -13
- package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
- package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
- package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
- package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
- package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
- package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
- package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
- package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +38 -67
- package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/sendmail-transport/index.js +51 -101
- package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
- package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/index.js +156 -272
- package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/objects.js +13 -17
- package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/http-proxy-client.js +49 -74
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/index.js +574 -794
- package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +172 -284
- package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +57 -97
- package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-transport/index.js +81 -179
- package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/stream-transport/index.js +36 -74
- package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +5 -16
- package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
- package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/xoauth2/index.js +125 -187
- package/dist/node_modules/nodemailer/{lib → dist}/well-known/services.json +9 -2
- package/dist/node_modules/nodemailer/package.json +1 -1
- package/package.json +3 -3
- package/dist/node_modules/nodemailer/.gitattributes +0 -6
- package/dist/node_modules/nodemailer/.ncurc.js +0 -9
- package/dist/node_modules/nodemailer/.prettierignore +0 -8
- package/dist/node_modules/nodemailer/.prettierrc +0 -12
- package/dist/node_modules/nodemailer/.prettierrc.js +0 -10
- package/dist/node_modules/nodemailer/.release-please-config.json +0 -9
- package/dist/node_modules/nodemailer/eslint.config.js +0 -88
- package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -276
- package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -671
- package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
- package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -266
- package/dist/node_modules/nodemailer/lib/shared/url.js +0 -151
- package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -105
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const EventEmitter = require('events');
|
|
4
|
-
const packageData = require('../../package.json');
|
|
5
|
-
const shared = require('../shared');
|
|
6
|
-
const errors = require('../errors');
|
|
7
|
-
const LeWindows = require('../mime-node/le-windows');
|
|
8
|
-
const MimeNode = require('../mime-node');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Tags AWS SDK rejections that carry no `code` property (SDK v3 errors only
|
|
12
|
-
* have a `name`) with the generic SES transport error code, keeping the
|
|
13
|
-
* original error object intact
|
|
14
|
-
*/
|
|
15
|
-
function tagSesError(err) {
|
|
16
|
-
if (err && typeof err === 'object' && !err.code) {
|
|
17
|
-
err.code = errors.ESES;
|
|
18
|
-
}
|
|
19
|
-
return err;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Generates a Transport object for AWS SES
|
|
24
|
-
*
|
|
25
|
-
* @constructor
|
|
26
|
-
* @param {Object} optional config parameter
|
|
27
|
-
*/
|
|
28
|
-
class SESTransport extends EventEmitter {
|
|
29
|
-
constructor(options) {
|
|
30
|
-
super();
|
|
31
|
-
options = options || {};
|
|
32
|
-
|
|
33
|
-
this.options = options;
|
|
34
|
-
this.ses = this.options.SES;
|
|
35
|
-
|
|
36
|
-
this.name = 'SESTransport';
|
|
37
|
-
this.version = packageData.version;
|
|
38
|
-
|
|
39
|
-
this.logger = shared.getLogger(this.options, {
|
|
40
|
-
component: this.options.component || 'ses-transport'
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
getRegion(cb) {
|
|
45
|
-
if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {
|
|
46
|
-
// Resolve the region provider. Use the two-argument form of then() so that a
|
|
47
|
-
// synchronous throw from cb is not recaught here and used to invoke cb a second time.
|
|
48
|
-
return this.ses.sesClient.config.region().then(
|
|
49
|
-
region => cb(null, region),
|
|
50
|
-
err => cb(err)
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
return cb(null, false);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Compiles a mailcomposer message and forwards it to SES
|
|
58
|
-
*
|
|
59
|
-
* @param {Object} emailMessage MailComposer object
|
|
60
|
-
* @param {Function} callback Callback function to run when the sending is completed
|
|
61
|
-
*/
|
|
62
|
-
send(mail, callback) {
|
|
63
|
-
let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));
|
|
64
|
-
if (fromHeader) {
|
|
65
|
-
const mimeNode = new MimeNode('text/plain');
|
|
66
|
-
fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const envelope = mail.message.getEnvelope();
|
|
70
|
-
const messageId = mail.message.messageId();
|
|
71
|
-
|
|
72
|
-
const recipients = [].concat(envelope.to || []);
|
|
73
|
-
if (recipients.length > 3) {
|
|
74
|
-
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
75
|
-
}
|
|
76
|
-
this.logger.info(
|
|
77
|
-
{
|
|
78
|
-
tnx: 'send',
|
|
79
|
-
messageId
|
|
80
|
-
},
|
|
81
|
-
'Sending message %s to <%s>',
|
|
82
|
-
messageId,
|
|
83
|
-
recipients.join(', ')
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const getRawMessage = next => {
|
|
87
|
-
// do not use Message-ID and Date in DKIM signature
|
|
88
|
-
if (!mail.data._dkim) {
|
|
89
|
-
mail.data._dkim = {};
|
|
90
|
-
}
|
|
91
|
-
if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {
|
|
92
|
-
mail.data._dkim.skipFields += ':date:message-id';
|
|
93
|
-
} else {
|
|
94
|
-
mail.data._dkim.skipFields = 'date:message-id';
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const sourceStream = mail.message.createReadStream();
|
|
98
|
-
const stream = sourceStream.pipe(new LeWindows());
|
|
99
|
-
const chunks = [];
|
|
100
|
-
let chunklen = 0;
|
|
101
|
-
|
|
102
|
-
stream.on('readable', () => {
|
|
103
|
-
let chunk;
|
|
104
|
-
while ((chunk = stream.read()) !== null) {
|
|
105
|
-
chunks.push(chunk);
|
|
106
|
-
chunklen += chunk.length;
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
sourceStream.once('error', err => stream.emit('error', err));
|
|
111
|
-
|
|
112
|
-
stream.once('error', err => next(err));
|
|
113
|
-
|
|
114
|
-
stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
setImmediate(() =>
|
|
118
|
-
getRawMessage((err, raw) => {
|
|
119
|
-
if (err) {
|
|
120
|
-
this.logger.error(
|
|
121
|
-
{
|
|
122
|
-
err,
|
|
123
|
-
tnx: 'send',
|
|
124
|
-
messageId
|
|
125
|
-
},
|
|
126
|
-
'Failed creating message for %s. %s',
|
|
127
|
-
messageId,
|
|
128
|
-
err.message
|
|
129
|
-
);
|
|
130
|
-
return callback(err);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// mail.data.ses is caller supplied message data, so copy its own keys only
|
|
134
|
-
const sesMessage = shared.copyOwnKeys(
|
|
135
|
-
{
|
|
136
|
-
Content: {
|
|
137
|
-
Raw: {
|
|
138
|
-
// required
|
|
139
|
-
Data: raw // required
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
FromEmailAddress: fromHeader || envelope.from,
|
|
143
|
-
Destination: {
|
|
144
|
-
ToAddresses: envelope.to
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
mail.data.ses
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
this.getRegion((err, region) => {
|
|
151
|
-
if (err || !region) {
|
|
152
|
-
region = 'us-east-1';
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
let sendPromise;
|
|
156
|
-
try {
|
|
157
|
-
// command construction or dispatch can throw synchronously on a
|
|
158
|
-
// misconfigured SDK; surface it as a single error callback instead
|
|
159
|
-
// of letting it escape into getRegion's promise chain
|
|
160
|
-
const command = new this.ses.SendEmailCommand(sesMessage);
|
|
161
|
-
sendPromise = this.ses.sesClient.send(command);
|
|
162
|
-
} catch (err) {
|
|
163
|
-
tagSesError(err);
|
|
164
|
-
this.logger.error(
|
|
165
|
-
{
|
|
166
|
-
err,
|
|
167
|
-
tnx: 'send'
|
|
168
|
-
},
|
|
169
|
-
'Send error for %s: %s',
|
|
170
|
-
messageId,
|
|
171
|
-
err.message
|
|
172
|
-
);
|
|
173
|
-
setImmediate(() => callback(err));
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
sendPromise
|
|
178
|
-
.then(data => {
|
|
179
|
-
if (region === 'us-east-1') {
|
|
180
|
-
region = 'email';
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const info = {
|
|
184
|
-
envelope: {
|
|
185
|
-
from: envelope.from,
|
|
186
|
-
to: envelope.to
|
|
187
|
-
},
|
|
188
|
-
messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',
|
|
189
|
-
response: data.MessageId,
|
|
190
|
-
raw
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
// invoke the callback outside the promise chain so a throw from it
|
|
194
|
-
// is not recaught by .catch() and used to call it a second time
|
|
195
|
-
setImmediate(() => callback(null, info));
|
|
196
|
-
})
|
|
197
|
-
.catch(err => {
|
|
198
|
-
tagSesError(err);
|
|
199
|
-
this.logger.error(
|
|
200
|
-
{
|
|
201
|
-
err,
|
|
202
|
-
tnx: 'send'
|
|
203
|
-
},
|
|
204
|
-
'Send error for %s: %s',
|
|
205
|
-
messageId,
|
|
206
|
-
err.message
|
|
207
|
-
);
|
|
208
|
-
setImmediate(() => callback(err));
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
})
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Verifies SES configuration
|
|
217
|
-
*
|
|
218
|
-
* @param {Function} callback Callback function
|
|
219
|
-
*/
|
|
220
|
-
verify(callback) {
|
|
221
|
-
let promise;
|
|
222
|
-
if (!callback) {
|
|
223
|
-
promise = new Promise((resolve, reject) => {
|
|
224
|
-
callback = shared.callbackPromise(resolve, reject);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const cb = err => {
|
|
229
|
-
if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {
|
|
230
|
-
return callback(tagSesError(err));
|
|
231
|
-
}
|
|
232
|
-
return callback(null, true);
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
const sesMessage = {
|
|
236
|
-
Content: {
|
|
237
|
-
Raw: {
|
|
238
|
-
Data: Buffer.from('From: <invalid@invalid>\r\nTo: <invalid@invalid>\r\n Subject: Invalid\r\n\r\nInvalid')
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
FromEmailAddress: 'invalid@invalid',
|
|
242
|
-
Destination: {
|
|
243
|
-
ToAddresses: ['invalid@invalid']
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
// the region value is not used for anything when verifying, but the lookup
|
|
248
|
-
// exercises the client configuration the same way as send() does
|
|
249
|
-
this.getRegion(() => {
|
|
250
|
-
let sendPromise;
|
|
251
|
-
try {
|
|
252
|
-
const command = new this.ses.SendEmailCommand(sesMessage);
|
|
253
|
-
sendPromise = this.ses.sesClient.send(command);
|
|
254
|
-
} catch (err) {
|
|
255
|
-
setImmediate(() => cb(err));
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
sendPromise.then(() => setImmediate(() => cb(null))).catch(err => setImmediate(() => cb(err)));
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
return promise;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
module.exports = SESTransport;
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// URL parsing wrapper. Prefers the WHATWG `URL` (a global on Node 10+, and
|
|
4
|
-
// available as `require('url').URL` since Node 6.13+) and only falls back to the
|
|
5
|
-
// legacy, deprecation-warning-emitting `url.parse()` / `url.resolve()` on ancient
|
|
6
|
-
// Node versions that predate the WHATWG implementation.
|
|
7
|
-
//
|
|
8
|
-
// The WHATWG `URL` exposes a different shape than the legacy parser, so results
|
|
9
|
-
// are normalized back into the legacy field names the rest of the codebase reads
|
|
10
|
-
// (`protocol`, `hostname`, `port`, `pathname`, `path`, `search`, `auth`, `query`,
|
|
11
|
-
// `href`). This keeps every existing call site unchanged.
|
|
12
|
-
//
|
|
13
|
-
// Known, accepted divergences from the legacy parser:
|
|
14
|
-
// - non-special schemes (smtp:/smtps:/direct:) are not host-lowercased by
|
|
15
|
-
// WHATWG; cosmetic only, SMTP/DNS hosts are case-insensitive. (IDNA mapping
|
|
16
|
-
// and IPv6 brackets are normalized back by normalizeHostname below.)
|
|
17
|
-
// - a literal unescaped ':' inside a password is percent-encoded by WHATWG;
|
|
18
|
-
// such passwords should be percent-encoded by the caller anyway.
|
|
19
|
-
|
|
20
|
-
const urllib = require('url');
|
|
21
|
-
const punycode = require('../punycode');
|
|
22
|
-
|
|
23
|
-
// WHATWG URL constructor if available, otherwise undefined (Node < 6.13).
|
|
24
|
-
const URLImpl = (typeof URL !== 'undefined' && URL) || urllib.URL;
|
|
25
|
-
|
|
26
|
-
// Matches a "scheme:" not followed by "//" (and with something after it), used
|
|
27
|
-
// to re-insert the authority separator the legacy parser did not require.
|
|
28
|
-
const SLASHLESS_AUTHORITY = /^([a-zA-Z][a-zA-Z0-9+.-]*:)(?!\/\/)(.+)$/;
|
|
29
|
-
|
|
30
|
-
// decodeURIComponent that never throws. Legacy url.parse() decodes the auth
|
|
31
|
-
// component but tolerates malformed percent sequences, so mirror that.
|
|
32
|
-
function safeDecode(str) {
|
|
33
|
-
try {
|
|
34
|
-
return decodeURIComponent(str);
|
|
35
|
-
} catch (_err) {
|
|
36
|
-
return str;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Derives the legacy-shaped bare hostname from a WHATWG URL. WHATWG keeps IPv6
|
|
41
|
-
// literals bracketed ('[::1]') and, for non-special schemes (smtp:/smtps:/socks:),
|
|
42
|
-
// percent-encodes a non-ASCII host instead of IDNA-mapping it. Both forms are
|
|
43
|
-
// un-resolvable when handed to net/dns/http.request — which is what every call
|
|
44
|
-
// site does — so map them back to what legacy url.parse() returned: the bare
|
|
45
|
-
// address and the punycode form. Idempotent on plain ASCII and already-punycode
|
|
46
|
-
// hosts, so special-scheme hosts (already IDNA-mapped by WHATWG) pass through.
|
|
47
|
-
function normalizeHostname(raw) {
|
|
48
|
-
let hostname = raw || '';
|
|
49
|
-
if (!hostname) {
|
|
50
|
-
// Host-less URL (e.g. 'direct:'): legacy returned '' here, not null;
|
|
51
|
-
// consumers do `hostname.length` / `'.' + hostname`, so keep it a string.
|
|
52
|
-
return '';
|
|
53
|
-
}
|
|
54
|
-
if (hostname.charAt(0) === '[' && hostname.charAt(hostname.length - 1) === ']') {
|
|
55
|
-
return hostname.slice(1, -1);
|
|
56
|
-
}
|
|
57
|
-
return punycode.toASCII(safeDecode(hostname));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
module.exports.parse = (input, parseQueryString) => {
|
|
61
|
-
input = input || '';
|
|
62
|
-
|
|
63
|
-
if (!URLImpl) {
|
|
64
|
-
// Node < 6.13: no WHATWG URL available, use the legacy parser.
|
|
65
|
-
return urllib.parse(input, parseQueryString);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Legacy url.parse() parses a "user:pass@host:port" authority that follows
|
|
69
|
-
// the scheme even without the "//" separator, for schemes outside its
|
|
70
|
-
// built-in slashed-protocol list (smtp:/smtps:/socks:/...). The WHATWG
|
|
71
|
-
// parser instead treats a scheme not followed by "//" as an opaque path.
|
|
72
|
-
// Re-insert the "//" so slash-less connection/proxy URLs keep resolving to
|
|
73
|
-
// an authority, as they did before. This assumes a slash-authority scheme,
|
|
74
|
-
// which every consumer here uses (http/https/smtp/smtps/socks/direct); an
|
|
75
|
-
// opaque scheme like mailto:/data:/tel: would be mis-split, but none reach
|
|
76
|
-
// this module.
|
|
77
|
-
const slashless = SLASHLESS_AUTHORITY.exec(input);
|
|
78
|
-
const normalized = slashless ? slashless[1] + '//' + slashless[2] : input;
|
|
79
|
-
|
|
80
|
-
let u;
|
|
81
|
-
try {
|
|
82
|
-
u = new URLImpl(normalized);
|
|
83
|
-
} catch (_err) {
|
|
84
|
-
// WHATWG rejects some input the legacy parser tolerated (empty/relative
|
|
85
|
-
// strings, scheme-relative '//host/path', out-of-range ports, ...). Fall
|
|
86
|
-
// back to the legacy parser so behavior — including the downstream errors
|
|
87
|
-
// callers rely on — is preserved. This is the only path that can still
|
|
88
|
-
// emit a deprecation warning; it fires for anything WHATWG cannot
|
|
89
|
-
// represent, including legitimate relative URLs, not just malformed input.
|
|
90
|
-
return urllib.parse(input, parseQueryString);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const hostname = normalizeHostname(u.hostname);
|
|
94
|
-
const port = u.port || null;
|
|
95
|
-
const pathname = u.pathname || null;
|
|
96
|
-
const search = u.search || null;
|
|
97
|
-
|
|
98
|
-
// Legacy `.auth` is the decoded "user[:pass]" string; WHATWG keeps the
|
|
99
|
-
// username/password percent-encoded, so decode to stay byte-compatible with
|
|
100
|
-
// existing consumers (parseConnectionUrl, Basic/Proxy-Authorization headers).
|
|
101
|
-
let auth = null;
|
|
102
|
-
if (u.username || u.password) {
|
|
103
|
-
// Gate on password too: legacy url.parse('smtps://:pass@host').auth was
|
|
104
|
-
// ':pass'. Dropping it would silently connect unauthenticated.
|
|
105
|
-
auth = safeDecode(u.username) + (u.password ? ':' + safeDecode(u.password) : '');
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
let query;
|
|
109
|
-
if (parseQueryString) {
|
|
110
|
-
// Mirror querystring.parse(): null-prototype object, repeated keys → array.
|
|
111
|
-
query = Object.create(null);
|
|
112
|
-
u.searchParams.forEach((value, key) => {
|
|
113
|
-
if (Object.prototype.hasOwnProperty.call(query, key)) {
|
|
114
|
-
if (Array.isArray(query[key])) {
|
|
115
|
-
query[key].push(value);
|
|
116
|
-
} else {
|
|
117
|
-
query[key] = [query[key], value];
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
query[key] = value;
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
} else {
|
|
124
|
-
query = search ? search.slice(1) : null;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
protocol: u.protocol || null,
|
|
129
|
-
host: u.host || null,
|
|
130
|
-
hostname,
|
|
131
|
-
port,
|
|
132
|
-
pathname,
|
|
133
|
-
search,
|
|
134
|
-
path: (pathname || '') + (search || '') || null,
|
|
135
|
-
href: u.href,
|
|
136
|
-
auth,
|
|
137
|
-
query
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
module.exports.resolve = (from, to) => {
|
|
142
|
-
if (!URLImpl) {
|
|
143
|
-
return urllib.resolve(from, to);
|
|
144
|
-
}
|
|
145
|
-
try {
|
|
146
|
-
return new URLImpl(to, from).href;
|
|
147
|
-
} catch (_err) {
|
|
148
|
-
// Malformed target — fall back to the legacy resolver.
|
|
149
|
-
return urllib.resolve(from, to);
|
|
150
|
-
}
|
|
151
|
-
};
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { Transform } = require('stream');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>
|
|
7
|
-
* Also makes sure that only <CR><LF> sequences are used for linebreaks
|
|
8
|
-
*
|
|
9
|
-
* @param {Object} options Stream options
|
|
10
|
-
*/
|
|
11
|
-
class DataStream extends Transform {
|
|
12
|
-
constructor(options) {
|
|
13
|
-
super(options);
|
|
14
|
-
this.options = options || {};
|
|
15
|
-
|
|
16
|
-
this.inByteCount = 0;
|
|
17
|
-
this.outByteCount = 0;
|
|
18
|
-
this.lastByte = false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Escapes dots
|
|
23
|
-
*/
|
|
24
|
-
_transform(chunk, encoding, done) {
|
|
25
|
-
const chunks = [];
|
|
26
|
-
let chunklen = 0;
|
|
27
|
-
let i,
|
|
28
|
-
len,
|
|
29
|
-
lastPos = 0;
|
|
30
|
-
let buf;
|
|
31
|
-
|
|
32
|
-
if (!chunk || !chunk.length) {
|
|
33
|
-
return done();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (typeof chunk === 'string') {
|
|
37
|
-
chunk = Buffer.from(chunk);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this.inByteCount += chunk.length;
|
|
41
|
-
|
|
42
|
-
for (i = 0, len = chunk.length; i < len; i++) {
|
|
43
|
-
if (chunk[i] === 0x2e) {
|
|
44
|
-
// .
|
|
45
|
-
if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {
|
|
46
|
-
buf = chunk.slice(lastPos, i + 1);
|
|
47
|
-
chunks.push(buf);
|
|
48
|
-
chunks.push(Buffer.from('.'));
|
|
49
|
-
chunklen += buf.length + 1;
|
|
50
|
-
lastPos = i + 1;
|
|
51
|
-
}
|
|
52
|
-
} else if (chunk[i] === 0x0a) {
|
|
53
|
-
// \n
|
|
54
|
-
if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {
|
|
55
|
-
if (i > lastPos) {
|
|
56
|
-
buf = chunk.slice(lastPos, i);
|
|
57
|
-
chunks.push(buf);
|
|
58
|
-
chunklen += buf.length + 2;
|
|
59
|
-
} else {
|
|
60
|
-
chunklen += 2;
|
|
61
|
-
}
|
|
62
|
-
chunks.push(Buffer.from('\r\n'));
|
|
63
|
-
lastPos = i + 1;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (chunklen) {
|
|
69
|
-
// add last piece
|
|
70
|
-
if (lastPos < chunk.length) {
|
|
71
|
-
buf = chunk.slice(lastPos);
|
|
72
|
-
chunks.push(buf);
|
|
73
|
-
chunklen += buf.length;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
this.outByteCount += chunklen;
|
|
77
|
-
this.push(Buffer.concat(chunks, chunklen));
|
|
78
|
-
} else {
|
|
79
|
-
this.outByteCount += chunk.length;
|
|
80
|
-
this.push(chunk);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
this.lastByte = chunk[chunk.length - 1];
|
|
84
|
-
done();
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Finalizes the stream with a dot on a single line
|
|
89
|
-
*/
|
|
90
|
-
_flush(done) {
|
|
91
|
-
let buf;
|
|
92
|
-
if (this.lastByte === 0x0a) {
|
|
93
|
-
buf = Buffer.from('.\r\n');
|
|
94
|
-
} else if (this.lastByte === 0x0d) {
|
|
95
|
-
buf = Buffer.from('\n.\r\n');
|
|
96
|
-
} else {
|
|
97
|
-
buf = Buffer.from('\r\n.\r\n');
|
|
98
|
-
}
|
|
99
|
-
this.outByteCount += buf.length;
|
|
100
|
-
this.push(buf);
|
|
101
|
-
done();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
module.exports = DataStream;
|