@nocobase/plugin-workflow-mailer 2.3.0-beta.9 → 2.4.0-alpha.10
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/dist/joi-browser.min.js +1 -1
- package/dist/node_modules/joi/lib/index.js +1 -1
- package/dist/node_modules/joi/lib/messages.js +35 -6
- package/dist/node_modules/joi/lib/types/keys.js +18 -1
- package/dist/node_modules/joi/lib/types/link.js +18 -2
- package/dist/node_modules/joi/lib/types/string.js +2 -2
- 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 +63 -112
- 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/dist/esm/addressparser/index.js +786 -0
- package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +39 -68
- package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +62 -92
- package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
- package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.js +176 -0
- 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/dist/esm/dkim/sign.js +125 -0
- package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
- package/dist/node_modules/nodemailer/dist/esm/errors.js +67 -0
- 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/dist/esm/fetch/index.js +344 -0
- package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
- package/dist/node_modules/nodemailer/dist/esm/json-transport/index.js +62 -0
- 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 +283 -275
- package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +151 -205
- 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 +111 -125
- 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 +43 -49
- 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 +576 -437
- 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 +7 -15
- 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 -16
- 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 +59 -77
- package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
- package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.js +170 -0
- 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/dist/esm/shared/index.js +631 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/objects.js +38 -0
- 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/dist/esm/smtp-connection/http-proxy-client.js +149 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.js +1797 -0
- 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 +195 -314
- 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 +70 -107
- package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.js +331 -0
- package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.js +106 -0
- 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 +12 -23
- 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/dist/esm/xoauth2/index.js +386 -0
- package/dist/node_modules/nodemailer/dist/well-known/services.json +640 -0
- package/dist/node_modules/nodemailer/package.json +1 -1
- package/package.json +4 -4
- package/dist/node_modules/nodemailer/.gitattributes +0 -6
- package/dist/node_modules/nodemailer/.ncurc.js +0 -7
- package/dist/node_modules/nodemailer/.prettierrc.js +0 -8
- package/dist/node_modules/nodemailer/lib/addressparser/index.js +0 -313
- package/dist/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
- package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/dist/node_modules/nodemailer/lib/dkim/sign.js +0 -117
- package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
- package/dist/node_modules/nodemailer/lib/fetch/index.js +0 -274
- package/dist/node_modules/nodemailer/lib/json-transport/index.js +0 -82
- package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
- package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
- package/dist/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
- package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -349
- package/dist/node_modules/nodemailer/lib/shared/index.js +0 -688
- package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
- package/dist/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
- package/dist/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1825
- package/dist/node_modules/nodemailer/lib/smtp-transport/index.js +0 -416
- package/dist/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
- package/dist/node_modules/nodemailer/lib/well-known/services.json +0 -343
- package/dist/node_modules/nodemailer/lib/xoauth2/index.js +0 -376
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import * as packageData from '../package-info.js';
|
|
3
|
+
import * as shared from '../shared/index.js';
|
|
4
|
+
import * as errors from '../errors.js';
|
|
5
|
+
import LeWindows from '../mime-node/le-windows.js';
|
|
6
|
+
import MimeNode from '../mime-node/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Tags AWS SDK rejections that carry no `code` property (SDK v3 errors only
|
|
9
|
+
* have a `name`) with the generic SES transport error code, keeping the
|
|
10
|
+
* original error object intact
|
|
11
|
+
*/
|
|
12
|
+
function tagSesError(err) {
|
|
13
|
+
if (err && typeof err === 'object' && !err.code) {
|
|
14
|
+
err.code = errors.ESES;
|
|
15
|
+
}
|
|
16
|
+
return err;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generates a Transport object for AWS SES
|
|
20
|
+
*
|
|
21
|
+
* @constructor
|
|
22
|
+
* @param optional config parameter
|
|
23
|
+
*/
|
|
24
|
+
class SESTransport extends EventEmitter {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super();
|
|
27
|
+
if (!options || !options.SES || !options.SES.sesClient) {
|
|
28
|
+
const error = new Error('Missing SES configuration, expecting { sesClient, SendEmailCommand } from @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/');
|
|
29
|
+
error.code = errors.ECONFIG;
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.ses = this.options.SES;
|
|
34
|
+
this.name = 'SESTransport';
|
|
35
|
+
this.version = packageData.version;
|
|
36
|
+
this.logger = shared.getLogger(this.options, {
|
|
37
|
+
component: this.options.component || 'ses-transport'
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
getRegion(cb) {
|
|
41
|
+
if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {
|
|
42
|
+
// Resolve the region provider. Use the two-argument form of then() so that a
|
|
43
|
+
// synchronous throw from cb is not recaught here and used to invoke cb a second time.
|
|
44
|
+
this.ses.sesClient.config.region().then(region => cb(null, region), err => cb(err));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
return cb(null, false);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compiles a mailcomposer message and forwards it to SES
|
|
51
|
+
*
|
|
52
|
+
* @param mail MailComposer object
|
|
53
|
+
* @param callback Callback function to run when the sending is completed
|
|
54
|
+
*/
|
|
55
|
+
send(mail, callback) {
|
|
56
|
+
// send() runs after the message was compiled, so mail.message is set
|
|
57
|
+
let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));
|
|
58
|
+
if (fromHeader) {
|
|
59
|
+
const mimeNode = new MimeNode('text/plain');
|
|
60
|
+
fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));
|
|
61
|
+
}
|
|
62
|
+
const envelope = mail.message.getEnvelope();
|
|
63
|
+
const messageId = mail.message.messageId();
|
|
64
|
+
const recipients = [].concat(envelope.to || []);
|
|
65
|
+
if (recipients.length > 3) {
|
|
66
|
+
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
67
|
+
}
|
|
68
|
+
this.logger.info({
|
|
69
|
+
tnx: 'send',
|
|
70
|
+
messageId
|
|
71
|
+
}, 'Sending message %s to <%s>', messageId, recipients.join(', '));
|
|
72
|
+
const getRawMessage = (next) => {
|
|
73
|
+
// do not use Message-ID and Date in DKIM signature
|
|
74
|
+
if (!mail.data._dkim) {
|
|
75
|
+
mail.data._dkim = {};
|
|
76
|
+
}
|
|
77
|
+
if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {
|
|
78
|
+
mail.data._dkim.skipFields += ':date:message-id';
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
mail.data._dkim.skipFields = 'date:message-id';
|
|
82
|
+
}
|
|
83
|
+
const sourceStream = mail.message.createReadStream();
|
|
84
|
+
const stream = sourceStream.pipe(new LeWindows());
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let chunklen = 0;
|
|
87
|
+
stream.on('readable', () => {
|
|
88
|
+
let chunk;
|
|
89
|
+
while ((chunk = stream.read()) !== null) {
|
|
90
|
+
chunks.push(chunk);
|
|
91
|
+
chunklen += chunk.length;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
sourceStream.once('error', err => stream.emit('error', err));
|
|
95
|
+
stream.once('error', err => next(err));
|
|
96
|
+
stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));
|
|
97
|
+
};
|
|
98
|
+
setImmediate(() => getRawMessage((err, raw) => {
|
|
99
|
+
if (err) {
|
|
100
|
+
this.logger.error({
|
|
101
|
+
err,
|
|
102
|
+
tnx: 'send',
|
|
103
|
+
messageId
|
|
104
|
+
}, 'Failed creating message for %s. %s', messageId, err.message);
|
|
105
|
+
return callback(err);
|
|
106
|
+
}
|
|
107
|
+
// mail.data.ses is caller supplied message data, so copy its own keys only
|
|
108
|
+
const sesMessage = shared.copyOwnKeys({
|
|
109
|
+
Content: {
|
|
110
|
+
Raw: {
|
|
111
|
+
// required
|
|
112
|
+
Data: raw // required
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
FromEmailAddress: fromHeader || envelope.from,
|
|
116
|
+
Destination: {
|
|
117
|
+
ToAddresses: envelope.to
|
|
118
|
+
}
|
|
119
|
+
}, mail.data.ses);
|
|
120
|
+
this.getRegion((err, region) => {
|
|
121
|
+
if (err || !region) {
|
|
122
|
+
region = 'us-east-1';
|
|
123
|
+
}
|
|
124
|
+
let sendPromise;
|
|
125
|
+
try {
|
|
126
|
+
// command construction or dispatch can throw synchronously on a
|
|
127
|
+
// misconfigured SDK; surface it as a single error callback instead
|
|
128
|
+
// of letting it escape into getRegion's promise chain
|
|
129
|
+
const command = new this.ses.SendEmailCommand(sesMessage);
|
|
130
|
+
sendPromise = this.ses.sesClient.send(command);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
tagSesError(err);
|
|
134
|
+
this.logger.error({
|
|
135
|
+
err,
|
|
136
|
+
tnx: 'send'
|
|
137
|
+
}, 'Send error for %s: %s', messageId, err.message);
|
|
138
|
+
setImmediate(() => callback(err));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
sendPromise
|
|
142
|
+
.then(data => {
|
|
143
|
+
if (region === 'us-east-1') {
|
|
144
|
+
region = 'email';
|
|
145
|
+
}
|
|
146
|
+
const info = {
|
|
147
|
+
envelope: {
|
|
148
|
+
from: envelope.from,
|
|
149
|
+
to: envelope.to
|
|
150
|
+
},
|
|
151
|
+
messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',
|
|
152
|
+
response: data.MessageId,
|
|
153
|
+
raw: raw
|
|
154
|
+
};
|
|
155
|
+
// invoke the callback outside the promise chain so a throw from it
|
|
156
|
+
// is not recaught by .catch() and used to call it a second time
|
|
157
|
+
setImmediate(() => callback(null, info));
|
|
158
|
+
})
|
|
159
|
+
.catch(err => {
|
|
160
|
+
tagSesError(err);
|
|
161
|
+
this.logger.error({
|
|
162
|
+
err,
|
|
163
|
+
tnx: 'send'
|
|
164
|
+
}, 'Send error for %s: %s', messageId, err.message);
|
|
165
|
+
setImmediate(() => callback(err));
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
verify(callback) {
|
|
171
|
+
let promise;
|
|
172
|
+
if (!callback) {
|
|
173
|
+
promise = new Promise((resolve, reject) => {
|
|
174
|
+
callback = shared.callbackPromise(resolve, reject);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
const done = callback;
|
|
178
|
+
const cb = (err) => {
|
|
179
|
+
if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {
|
|
180
|
+
return done(tagSesError(err));
|
|
181
|
+
}
|
|
182
|
+
return done(null, true);
|
|
183
|
+
};
|
|
184
|
+
const sesMessage = {
|
|
185
|
+
Content: {
|
|
186
|
+
Raw: {
|
|
187
|
+
Data: Buffer.from('From: <invalid@invalid>\r\nTo: <invalid@invalid>\r\n Subject: Invalid\r\n\r\nInvalid')
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
FromEmailAddress: 'invalid@invalid',
|
|
191
|
+
Destination: {
|
|
192
|
+
ToAddresses: ['invalid@invalid']
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
// the region value is not used for anything when verifying, but the lookup
|
|
196
|
+
// exercises the client configuration the same way as send() does
|
|
197
|
+
this.getRegion(() => {
|
|
198
|
+
let sendPromise;
|
|
199
|
+
try {
|
|
200
|
+
const command = new this.ses.SendEmailCommand(sesMessage);
|
|
201
|
+
sendPromise = this.ses.sesClient.send(command);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
setImmediate(() => cb(err));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
sendPromise.then(() => setImmediate(() => cb(null))).catch(err => setImmediate(() => cb(err)));
|
|
208
|
+
});
|
|
209
|
+
return promise;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export default SESTransport;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { isProtoKey, copyOwnKeys } from './objects.js';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import type { Readable } from 'node:stream';
|
|
4
|
+
import type { OutgoingHttpHeaders } from 'node:http';
|
|
5
|
+
export { isProtoKey, copyOwnKeys };
|
|
6
|
+
/**
|
|
7
|
+
* Options for resolveHostname. The object is also handed to dns.Resolver, so its
|
|
8
|
+
* `timeout` and `tries` settings apply to the lookups
|
|
9
|
+
*/
|
|
10
|
+
export interface ResolveHostnameOptions {
|
|
11
|
+
/** Hostname or IP address to resolve */
|
|
12
|
+
host?: string | undefined;
|
|
13
|
+
/** Server name for TLS, used as the host when no host is set */
|
|
14
|
+
servername?: string | undefined;
|
|
15
|
+
/** Count loopback interfaces when checking which address families are usable */
|
|
16
|
+
allowInternalNetworkInterfaces?: boolean | undefined;
|
|
17
|
+
/** How long a resolved value stays cached, in milliseconds (default 5 minutes) */
|
|
18
|
+
dnsTtl?: number | undefined;
|
|
19
|
+
/** Query timeout in milliseconds, passed to dns.Resolver */
|
|
20
|
+
timeout?: number | undefined;
|
|
21
|
+
/** Number of query attempts, passed to dns.Resolver */
|
|
22
|
+
tries?: number | undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolved value handed to the resolveHostname callback
|
|
26
|
+
*/
|
|
27
|
+
export interface ResolvedHostname {
|
|
28
|
+
/** Server name to use for TLS, false when an IP literal was given without one */
|
|
29
|
+
servername?: string | false | undefined;
|
|
30
|
+
/** Address to connect to, picked at random from the resolved addresses */
|
|
31
|
+
host?: string | null | undefined;
|
|
32
|
+
/** Whether the value came from the DNS cache */
|
|
33
|
+
cached?: boolean | undefined;
|
|
34
|
+
/** The resolver error when a cached value was used because of it */
|
|
35
|
+
error?: Error | undefined;
|
|
36
|
+
}
|
|
37
|
+
/** The name @types/nodemailer used for ResolvedHostname */
|
|
38
|
+
export type ResolveHostnameValue = ResolvedHostname;
|
|
39
|
+
/**
|
|
40
|
+
* Resolved addresses as stored in the DNS cache
|
|
41
|
+
*/
|
|
42
|
+
export interface DnsCacheValue {
|
|
43
|
+
addresses: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A DNS cache entry
|
|
47
|
+
*/
|
|
48
|
+
export interface DnsCacheEntry {
|
|
49
|
+
value: DnsCacheValue;
|
|
50
|
+
/** Expiration time as a timestamp, entries without one never expire */
|
|
51
|
+
expires?: number | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Configuration object parsed from a connection url. Query parameters become
|
|
55
|
+
* top level keys, `tls.*` parameters go into `tls`
|
|
56
|
+
*/
|
|
57
|
+
export interface ConnectionUrlOptions {
|
|
58
|
+
secure?: boolean | undefined;
|
|
59
|
+
direct?: boolean | undefined;
|
|
60
|
+
port?: number | undefined;
|
|
61
|
+
host?: string | undefined;
|
|
62
|
+
/** Well-known service name from the ?service= query parameter */
|
|
63
|
+
service?: string | undefined;
|
|
64
|
+
auth?: {
|
|
65
|
+
user: string;
|
|
66
|
+
pass: string;
|
|
67
|
+
} | undefined;
|
|
68
|
+
tls?: {
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
} | undefined;
|
|
71
|
+
[key: string]: unknown;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Structured data attached to a log line. tnx, sid and cid drive the line prefix
|
|
75
|
+
* of the default console logger
|
|
76
|
+
*/
|
|
77
|
+
export interface LogEntry {
|
|
78
|
+
/** 'server' or 'client' for SMTP transaction lines */
|
|
79
|
+
tnx?: string | undefined;
|
|
80
|
+
/** Session id */
|
|
81
|
+
sid?: string | undefined;
|
|
82
|
+
/** Connection id */
|
|
83
|
+
cid?: string | number | undefined;
|
|
84
|
+
level?: string | undefined;
|
|
85
|
+
[key: string]: any;
|
|
86
|
+
}
|
|
87
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
88
|
+
/** The name @types/nodemailer used for LogLevel */
|
|
89
|
+
export type LoggerLevel = LogLevel;
|
|
90
|
+
/**
|
|
91
|
+
* A logger supplied by the caller, bunyan style. Any object works, a level it does not
|
|
92
|
+
* implement is routed to one it does, see _logFunc
|
|
93
|
+
*/
|
|
94
|
+
export interface ExternalLogger {
|
|
95
|
+
trace?(...args: any[]): any;
|
|
96
|
+
debug?(...args: any[]): any;
|
|
97
|
+
info?(...args: any[]): any;
|
|
98
|
+
warn?(...args: any[]): any;
|
|
99
|
+
error?(...args: any[]): any;
|
|
100
|
+
fatal?(...args: any[]): any;
|
|
101
|
+
log?(...args: any[]): any;
|
|
102
|
+
[level: string]: any;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Options for getLogger
|
|
106
|
+
*/
|
|
107
|
+
export interface GetLoggerOptions {
|
|
108
|
+
/** A bunyan compatible logger, true for the default console logger, false or unset for no logging */
|
|
109
|
+
logger?: ExternalLogger | boolean | undefined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A bunyan style log method: a data object followed by a printf style message, or the
|
|
113
|
+
* message alone
|
|
114
|
+
*/
|
|
115
|
+
export interface LogMethod {
|
|
116
|
+
(data: LogEntry | undefined, message?: string, ...args: any[]): void;
|
|
117
|
+
(message?: string, ...args: any[]): void;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The bunyan compatible logger interface returned by getLogger
|
|
121
|
+
*/
|
|
122
|
+
export interface Logger {
|
|
123
|
+
trace: LogMethod;
|
|
124
|
+
debug: LogMethod;
|
|
125
|
+
info: LogMethod;
|
|
126
|
+
warn: LogMethod;
|
|
127
|
+
error: LogMethod;
|
|
128
|
+
fatal: LogMethod;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A parsed data URI
|
|
132
|
+
*/
|
|
133
|
+
export interface ParsedDataURI {
|
|
134
|
+
/** Decoded payload */
|
|
135
|
+
data: Buffer;
|
|
136
|
+
/** 'base64', 'utf8' or 'utf-8' when the URI declared one, null otherwise */
|
|
137
|
+
encoding: string | null;
|
|
138
|
+
contentType: string;
|
|
139
|
+
/** Further `key=value` parameters from the metadata section */
|
|
140
|
+
params: {
|
|
141
|
+
[key: string]: string;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Access policy for resolveContent
|
|
146
|
+
*/
|
|
147
|
+
export interface ResolveContentOptions {
|
|
148
|
+
/** Reject content that points to a file path */
|
|
149
|
+
disableFileAccess?: boolean | undefined;
|
|
150
|
+
/** Reject content that points to a URL */
|
|
151
|
+
disableUrlAccess?: boolean | undefined;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* An object value resolveContent understands. A plain string or Buffer value is returned as
|
|
155
|
+
* is and a readable stream is read into a Buffer, an object carries the content in `content`
|
|
156
|
+
* or points to it with `path` or `href`
|
|
157
|
+
*/
|
|
158
|
+
export interface ContentDescriptor {
|
|
159
|
+
/** The content itself, a string, a Buffer or a readable stream */
|
|
160
|
+
content?: string | Buffer | Readable | undefined;
|
|
161
|
+
/** Encoding of a string `content`, it is decoded into a Buffer unless it is utf8 or ascii */
|
|
162
|
+
encoding?: string | undefined;
|
|
163
|
+
/** File path, http(s) URL or data URI to read the content from */
|
|
164
|
+
path?: string | undefined;
|
|
165
|
+
/** URL to fetch the content from */
|
|
166
|
+
href?: string | undefined;
|
|
167
|
+
/** Request headers for a URL fetch */
|
|
168
|
+
httpHeaders?: OutgoingHttpHeaders | undefined;
|
|
169
|
+
/** TLS settings for a URL fetch, see nmfetch */
|
|
170
|
+
tls?: {
|
|
171
|
+
[key: string]: any;
|
|
172
|
+
} | undefined;
|
|
173
|
+
}
|
|
174
|
+
export type ResolveContentCallback = (err: Error | null, value?: any) => void;
|
|
175
|
+
export declare let networkInterfaces: NodeJS.Dict<os.NetworkInterfaceInfo[]> | undefined;
|
|
176
|
+
export declare const dnsCache: Map<string, DnsCacheEntry>;
|
|
177
|
+
export declare const resolveHostname: (options: ResolveHostnameOptions | undefined, callback: (err: Error | null, result?: ResolvedHostname) => void) => void;
|
|
178
|
+
/**
|
|
179
|
+
* Parses connection url to a structured configuration object
|
|
180
|
+
*
|
|
181
|
+
* @param str Connection url
|
|
182
|
+
* @return Configuration object
|
|
183
|
+
*/
|
|
184
|
+
export declare const parseConnectionUrl: (str?: string | null) => ConnectionUrlOptions;
|
|
185
|
+
/**
|
|
186
|
+
* Returns a bunyan-compatible logger interface. Uses either provided logger or
|
|
187
|
+
* creates a default console logger
|
|
188
|
+
*
|
|
189
|
+
* @param [options] Options object that might include 'logger' value
|
|
190
|
+
* @param [defaults] Fields merged into every log entry, overridden by the fields of the entry itself
|
|
191
|
+
* @return bunyan compatible logger
|
|
192
|
+
*/
|
|
193
|
+
export declare const getLogger: (options?: GetLoggerOptions, defaults?: LogEntry) => Logger;
|
|
194
|
+
/**
|
|
195
|
+
* Wrapper for creating a callback that either resolves or rejects a promise
|
|
196
|
+
* based on input
|
|
197
|
+
*
|
|
198
|
+
* @param resolve Function to run if callback is called
|
|
199
|
+
* @param reject Function to run if callback ends with an error
|
|
200
|
+
*/
|
|
201
|
+
export declare const callbackPromise: (resolve: (...args: any[]) => void, reject: (reason?: any) => void) => (...args: any[]) => void;
|
|
202
|
+
export declare const parseDataURI: (uri: unknown) => ParsedDataURI | null;
|
|
203
|
+
/**
|
|
204
|
+
* Resolves a String or a Buffer value for content value. Useful if the value
|
|
205
|
+
* is a Stream or a file or an URL. If the value is a Stream, overwrites
|
|
206
|
+
* the stream object with the resolved value (you can't stream a value twice).
|
|
207
|
+
*
|
|
208
|
+
* This is useful when you want to create a plugin that needs a content value,
|
|
209
|
+
* for example the `html` or `text` value as a String or a Buffer but not as
|
|
210
|
+
* a file path or an URL.
|
|
211
|
+
*
|
|
212
|
+
* @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
|
|
213
|
+
* @param key Property name or an Array index
|
|
214
|
+
* @param callback Callback function with (err, value)
|
|
215
|
+
*/
|
|
216
|
+
export declare function resolveContent(data: {
|
|
217
|
+
[key: string]: any;
|
|
218
|
+
}, key: string | number, callback: ResolveContentCallback): void;
|
|
219
|
+
/**
|
|
220
|
+
* Resolves a String or a Buffer value for content value
|
|
221
|
+
*
|
|
222
|
+
* @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
|
|
223
|
+
* @param key Property name or an Array index
|
|
224
|
+
* @param options Access policy: { disableFileAccess, disableUrlAccess }
|
|
225
|
+
* @param callback Callback function with (err, value)
|
|
226
|
+
*/
|
|
227
|
+
export declare function resolveContent(data: {
|
|
228
|
+
[key: string]: any;
|
|
229
|
+
}, key: string | number, options: ResolveContentOptions | false | undefined, callback: ResolveContentCallback): void;
|
|
230
|
+
/**
|
|
231
|
+
* Resolves a String or a Buffer value for content value
|
|
232
|
+
*
|
|
233
|
+
* @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
|
|
234
|
+
* @param key Property name or an Array index
|
|
235
|
+
* @param [options] Optional access policy: { disableFileAccess, disableUrlAccess }
|
|
236
|
+
* @returns Promise that resolves with the value
|
|
237
|
+
*/
|
|
238
|
+
export declare function resolveContent(data: {
|
|
239
|
+
[key: string]: any;
|
|
240
|
+
}, key: string | number, options?: ResolveContentOptions | false): Promise<any>;
|
|
241
|
+
/**
|
|
242
|
+
* Resolves a String or a Buffer value for content value
|
|
243
|
+
*
|
|
244
|
+
* @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
|
|
245
|
+
* @param key Property name or an Array index
|
|
246
|
+
* @param options Access policy: { disableFileAccess, disableUrlAccess }
|
|
247
|
+
* @param callback Callback function with (err, value), a Promise is returned if not set
|
|
248
|
+
*/
|
|
249
|
+
export declare function resolveContent(data: {
|
|
250
|
+
[key: string]: any;
|
|
251
|
+
}, key: string | number, options: ResolveContentOptions | false | undefined, callback: ResolveContentCallback | undefined): Promise<any> | void;
|
|
252
|
+
/**
|
|
253
|
+
* Copies properties from source objects to target objects
|
|
254
|
+
*/
|
|
255
|
+
export declare const assign: (...args: ({
|
|
256
|
+
[key: string]: any;
|
|
257
|
+
} | false | null | undefined)[]) => {
|
|
258
|
+
[key: string]: any;
|
|
259
|
+
};
|
|
260
|
+
export declare const encodeXText: (str: string) => string;
|