@nocobase/plugin-workflow-mailer 2.2.20 → 2.2.21
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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Logger } from '../shared/index.js';
|
|
2
|
+
import type { MimeNodeEnvelope } from '../mime-node/index.js';
|
|
3
|
+
import type MailMessage from '../mailer/mail-message.js';
|
|
4
|
+
import type { default as Mail, SentMessageInfo, SendMailOptions, TransportOptions } from '../mailer/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Options for the Sendmail transport
|
|
7
|
+
*/
|
|
8
|
+
export interface SendmailTransportOptions extends TransportOptions {
|
|
9
|
+
/** Selects this transport in createTransport, the binary itself is set with `path` */
|
|
10
|
+
sendmail?: boolean | string | undefined;
|
|
11
|
+
/** Path to the sendmail binary, defaults to 'sendmail' */
|
|
12
|
+
path?: string | undefined;
|
|
13
|
+
/** Either 'windows' or 'unix', the line ending of the message piped to sendmail */
|
|
14
|
+
newline?: string | undefined;
|
|
15
|
+
/** Arguments for the sendmail binary, replaces the default '-f <sender>' */
|
|
16
|
+
args?: string[] | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The value the Sendmail transport hands to the send callback
|
|
20
|
+
*/
|
|
21
|
+
export interface SendmailSentMessageInfo extends SentMessageInfo {
|
|
22
|
+
/** The envelope the message was sent with */
|
|
23
|
+
envelope: MimeNodeEnvelope;
|
|
24
|
+
/** Message-ID value of the message */
|
|
25
|
+
messageId: string;
|
|
26
|
+
/** Always 'Messages queued for delivery' */
|
|
27
|
+
response: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generates a Transport object for Sendmail
|
|
31
|
+
*
|
|
32
|
+
* Possible options can be the following:
|
|
33
|
+
*
|
|
34
|
+
* * **path** optional path to sendmail binary
|
|
35
|
+
* * **newline** either 'windows' or 'unix'
|
|
36
|
+
* * **args** an array of arguments for the sendmail binary
|
|
37
|
+
*
|
|
38
|
+
* @constructor
|
|
39
|
+
* @param optional config parameter for Sendmail
|
|
40
|
+
*/
|
|
41
|
+
declare class SendmailTransport {
|
|
42
|
+
mailer: Mail<SendmailSentMessageInfo>;
|
|
43
|
+
options: SendmailTransportOptions;
|
|
44
|
+
name: string;
|
|
45
|
+
version: string;
|
|
46
|
+
path: string;
|
|
47
|
+
args: string[] | false;
|
|
48
|
+
logger: Logger;
|
|
49
|
+
winbreak: boolean;
|
|
50
|
+
constructor(options?: SendmailTransportOptions | string);
|
|
51
|
+
/**
|
|
52
|
+
* <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
|
|
53
|
+
*
|
|
54
|
+
* @param mail MailComposer object
|
|
55
|
+
* @param done Callback function to run when the sending is completed
|
|
56
|
+
*/
|
|
57
|
+
send(mail: MailMessage<SendmailSentMessageInfo>, done: (err: Error | null, info?: SendmailSentMessageInfo) => void): void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Type aliases in the layout of @types/nodemailer, so `SendmailTransport.Options` style references keep working
|
|
61
|
+
*/
|
|
62
|
+
declare namespace SendmailTransport {
|
|
63
|
+
type Options = SendmailTransportOptions;
|
|
64
|
+
type MailOptions = SendMailOptions;
|
|
65
|
+
type SentMessageInfo = SendmailSentMessageInfo;
|
|
66
|
+
}
|
|
67
|
+
/** The same aliases as module level exports, for `import * as SendmailTransport` and `import SendmailTransport = require()` */
|
|
68
|
+
export type { SendmailTransportOptions as Options, SendMailOptions as MailOptions, SendmailSentMessageInfo as SentMessageInfo };
|
|
69
|
+
export default SendmailTransport;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const LeWindows = require('../mime-node/le-windows');
|
|
8
|
-
const LeUnix = require('../mime-node/le-unix');
|
|
9
|
-
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
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 LeUnix from '../mime-node/le-unix.js';
|
|
10
7
|
/**
|
|
11
8
|
* Generates a Transport object for Sendmail
|
|
12
9
|
*
|
|
@@ -17,30 +14,25 @@ const LeUnix = require('../mime-node/le-unix');
|
|
|
17
14
|
* * **args** an array of arguments for the sendmail binary
|
|
18
15
|
*
|
|
19
16
|
* @constructor
|
|
20
|
-
* @param
|
|
17
|
+
* @param optional config parameter for Sendmail
|
|
21
18
|
*/
|
|
22
19
|
class SendmailTransport {
|
|
23
20
|
constructor(options) {
|
|
24
21
|
options = options || {};
|
|
25
|
-
|
|
26
22
|
// use a reference to spawn for mocking purposes
|
|
27
23
|
this._spawn = spawn;
|
|
28
|
-
|
|
29
24
|
this.options = options;
|
|
30
|
-
|
|
31
25
|
this.name = 'Sendmail';
|
|
32
26
|
this.version = packageData.version;
|
|
33
|
-
|
|
34
27
|
this.path = 'sendmail';
|
|
35
28
|
this.args = false;
|
|
36
|
-
|
|
37
29
|
this.logger = shared.getLogger(this.options, {
|
|
38
30
|
component: this.options.component || 'sendmail'
|
|
39
31
|
});
|
|
40
|
-
|
|
41
32
|
if (typeof options === 'string') {
|
|
42
33
|
this.path = options;
|
|
43
|
-
}
|
|
34
|
+
}
|
|
35
|
+
else if (typeof options === 'object') {
|
|
44
36
|
if (options.path) {
|
|
45
37
|
this.path = options.path;
|
|
46
38
|
}
|
|
@@ -48,24 +40,21 @@ class SendmailTransport {
|
|
|
48
40
|
this.args = options.args;
|
|
49
41
|
}
|
|
50
42
|
}
|
|
51
|
-
|
|
52
43
|
this.winbreak = ['win', 'windows', 'dos', '\r\n'].includes((options.newline || '').toString().toLowerCase());
|
|
53
44
|
}
|
|
54
|
-
|
|
55
45
|
/**
|
|
56
46
|
* <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
|
|
57
47
|
*
|
|
58
|
-
* @param
|
|
59
|
-
* @param
|
|
48
|
+
* @param mail MailComposer object
|
|
49
|
+
* @param done Callback function to run when the sending is completed
|
|
60
50
|
*/
|
|
61
51
|
send(mail, done) {
|
|
62
|
-
// Sendmail strips this header line by itself
|
|
52
|
+
// Sendmail strips this header line by itself. send() runs after the message was
|
|
53
|
+
// compiled, so mail.message is set
|
|
63
54
|
mail.message.keepBcc = true;
|
|
64
|
-
|
|
65
55
|
const envelope = mail.message.getEnvelope();
|
|
66
56
|
const messageId = mail.message.messageId();
|
|
67
57
|
let returned;
|
|
68
|
-
|
|
69
58
|
const hasInvalidAddresses = []
|
|
70
59
|
.concat(envelope.from || [])
|
|
71
60
|
.concat(envelope.to || [])
|
|
@@ -78,13 +67,11 @@ class SendmailTransport {
|
|
|
78
67
|
err.code = errors.ESENDMAIL;
|
|
79
68
|
return done(err);
|
|
80
69
|
}
|
|
81
|
-
|
|
82
70
|
// force -i to keep single dots
|
|
83
71
|
const args = this.args
|
|
84
72
|
? ['-i'].concat(this.args).concat(envelope.to)
|
|
85
73
|
: ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);
|
|
86
|
-
|
|
87
|
-
const callback = err => {
|
|
74
|
+
const callback = (err) => {
|
|
88
75
|
if (returned) {
|
|
89
76
|
// ignore any additional responses, already done
|
|
90
77
|
return;
|
|
@@ -101,89 +88,59 @@ class SendmailTransport {
|
|
|
101
88
|
});
|
|
102
89
|
}
|
|
103
90
|
};
|
|
104
|
-
|
|
105
91
|
let sendmail;
|
|
106
92
|
try {
|
|
107
93
|
sendmail = this._spawn(this.path, args);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
'Error occurred while spawning sendmail. %s',
|
|
116
|
-
E.message
|
|
117
|
-
);
|
|
94
|
+
}
|
|
95
|
+
catch (E) {
|
|
96
|
+
this.logger.error({
|
|
97
|
+
err: E,
|
|
98
|
+
tnx: 'spawn',
|
|
99
|
+
messageId
|
|
100
|
+
}, 'Error occurred while spawning sendmail. %s', E.message);
|
|
118
101
|
return callback(E);
|
|
119
102
|
}
|
|
120
|
-
|
|
121
103
|
if (sendmail) {
|
|
122
104
|
sendmail.on('error', err => {
|
|
123
|
-
this.logger.error(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
},
|
|
129
|
-
'Error occurred when sending message %s. %s',
|
|
130
|
-
messageId,
|
|
131
|
-
err.message
|
|
132
|
-
);
|
|
105
|
+
this.logger.error({
|
|
106
|
+
err,
|
|
107
|
+
tnx: 'spawn',
|
|
108
|
+
messageId
|
|
109
|
+
}, 'Error occurred when sending message %s. %s', messageId, err.message);
|
|
133
110
|
callback(err);
|
|
134
111
|
});
|
|
135
|
-
|
|
136
112
|
sendmail.once('exit', code => {
|
|
137
113
|
if (!code) {
|
|
138
114
|
return callback();
|
|
139
115
|
}
|
|
140
|
-
const err = new Error(
|
|
141
|
-
code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code
|
|
142
|
-
);
|
|
116
|
+
const err = new Error(code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code);
|
|
143
117
|
err.code = errors.ESENDMAIL;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
messageId
|
|
150
|
-
},
|
|
151
|
-
'Error sending message %s to sendmail. %s',
|
|
152
|
-
messageId,
|
|
153
|
-
err.message
|
|
154
|
-
);
|
|
118
|
+
this.logger.error({
|
|
119
|
+
err,
|
|
120
|
+
tnx: 'stdin',
|
|
121
|
+
messageId
|
|
122
|
+
}, 'Error sending message %s to sendmail. %s', messageId, err.message);
|
|
155
123
|
callback(err);
|
|
156
124
|
});
|
|
125
|
+
// the close listener is handed the exit code as its first argument, so a non-zero
|
|
126
|
+
// code reaching it before the exit listener did counts as the error value
|
|
157
127
|
sendmail.once('close', callback);
|
|
158
|
-
|
|
159
128
|
sendmail.stdin.on('error', err => {
|
|
160
|
-
this.logger.error(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
},
|
|
166
|
-
'Error occurred when piping message %s to sendmail. %s',
|
|
167
|
-
messageId,
|
|
168
|
-
err.message
|
|
169
|
-
);
|
|
129
|
+
this.logger.error({
|
|
130
|
+
err,
|
|
131
|
+
tnx: 'stdin',
|
|
132
|
+
messageId
|
|
133
|
+
}, 'Error occurred when piping message %s to sendmail. %s', messageId, err.message);
|
|
170
134
|
callback(err);
|
|
171
135
|
});
|
|
172
|
-
|
|
173
136
|
const recipients = [].concat(envelope.to || []);
|
|
174
137
|
if (recipients.length > 3) {
|
|
175
138
|
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
176
139
|
}
|
|
177
|
-
this.logger.info(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
},
|
|
182
|
-
'Sending message %s to <%s>',
|
|
183
|
-
messageId,
|
|
184
|
-
recipients.join(', ')
|
|
185
|
-
);
|
|
186
|
-
|
|
140
|
+
this.logger.info({
|
|
141
|
+
tnx: 'send',
|
|
142
|
+
messageId
|
|
143
|
+
}, 'Sending message %s to <%s>', messageId, recipients.join(', '));
|
|
187
144
|
const sourceStream = mail.message.createReadStream();
|
|
188
145
|
let stream = sourceStream;
|
|
189
146
|
if (this.options.newline) {
|
|
@@ -192,29 +149,22 @@ class SendmailTransport {
|
|
|
192
149
|
stream = sourceStream.pipe(this.winbreak ? new LeWindows() : new LeUnix());
|
|
193
150
|
sourceStream.once('error', err => stream.emit('error', err));
|
|
194
151
|
}
|
|
195
|
-
|
|
196
152
|
stream.once('error', err => {
|
|
197
|
-
this.logger.error(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
},
|
|
203
|
-
'Error occurred when generating message %s. %s',
|
|
204
|
-
messageId,
|
|
205
|
-
err.message
|
|
206
|
-
);
|
|
153
|
+
this.logger.error({
|
|
154
|
+
err,
|
|
155
|
+
tnx: 'stdin',
|
|
156
|
+
messageId
|
|
157
|
+
}, 'Error occurred when generating message %s. %s', messageId, err.message);
|
|
207
158
|
sendmail.kill('SIGINT'); // do not deliver the message
|
|
208
159
|
callback(err);
|
|
209
160
|
});
|
|
210
|
-
|
|
211
161
|
stream.pipe(sendmail.stdin);
|
|
212
|
-
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
213
164
|
const err = new Error('sendmail was not found');
|
|
214
165
|
err.code = errors.ESENDMAIL;
|
|
215
166
|
return callback(err);
|
|
216
167
|
}
|
|
217
168
|
}
|
|
218
169
|
}
|
|
219
|
-
|
|
220
|
-
module.exports = SendmailTransport;
|
|
170
|
+
export default SendmailTransport;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import type { Logger } from '../shared/index.js';
|
|
3
|
+
import { type MimeNodeEnvelope } from '../mime-node/index.js';
|
|
4
|
+
import type MailMessage from '../mailer/mail-message.js';
|
|
5
|
+
import type { default as Mail, SentMessageInfo, SendMailOptions, TransportOptions, VerifyCallback } from '../mailer/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options for the SES transport
|
|
8
|
+
*/
|
|
9
|
+
export interface SESTransportOptions extends TransportOptions {
|
|
10
|
+
/** The AWS SDK v3 objects to send with, `{ sesClient, SendEmailCommand }` from @aws-sdk/client-sesv2 */
|
|
11
|
+
SES: {
|
|
12
|
+
/** SESv2Client instance. Its config.region provider is resolved for the domain of the returned Message-ID */
|
|
13
|
+
sesClient: {
|
|
14
|
+
config?: {
|
|
15
|
+
region?: (() => Promise<string>) | undefined;
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
} | undefined;
|
|
18
|
+
send(command: unknown): Promise<any>;
|
|
19
|
+
};
|
|
20
|
+
/** SendEmailCommand class, constructed with the SendEmailCommandInput of every message */
|
|
21
|
+
SendEmailCommand: new (input: any) => unknown;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** The SESv2Client shape the transport needs */
|
|
25
|
+
export type SESTransportClient = SESTransportOptions['SES']['sesClient'];
|
|
26
|
+
/** The SendEmailCommand constructor shape the transport needs */
|
|
27
|
+
export type SESTransportSendEmailCommand = SESTransportOptions['SES']['SendEmailCommand'];
|
|
28
|
+
/**
|
|
29
|
+
* SendEmailCommand parameters, the shape of the `ses` message option that is merged into
|
|
30
|
+
* the API call. Any further SendEmailCommandInput field is accepted as well
|
|
31
|
+
*/
|
|
32
|
+
export interface SESSendEmailRequest {
|
|
33
|
+
FromEmailAddress?: string | undefined;
|
|
34
|
+
Destination?: {
|
|
35
|
+
ToAddresses?: string[] | undefined;
|
|
36
|
+
CcAddresses?: string[] | undefined;
|
|
37
|
+
BccAddresses?: string[] | undefined;
|
|
38
|
+
} | undefined;
|
|
39
|
+
ReplyToAddresses?: string[] | undefined;
|
|
40
|
+
Content?: unknown;
|
|
41
|
+
EmailTags?: Array<{
|
|
42
|
+
Name?: string | undefined;
|
|
43
|
+
Value?: string | undefined;
|
|
44
|
+
}> | undefined;
|
|
45
|
+
ConfigurationSetName?: string | undefined;
|
|
46
|
+
ListManagementOptions?: unknown;
|
|
47
|
+
FeedbackForwardingEmailAddress?: string | undefined;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The value the SES transport hands to the send callback
|
|
52
|
+
*/
|
|
53
|
+
export interface SESSentMessageInfo extends SentMessageInfo {
|
|
54
|
+
/** The envelope the message was sent with */
|
|
55
|
+
envelope: MimeNodeEnvelope;
|
|
56
|
+
/** Message-ID built from the MessageId SES returned */
|
|
57
|
+
messageId: string;
|
|
58
|
+
/** The MessageId SES returned */
|
|
59
|
+
response: string;
|
|
60
|
+
/** The raw RFC822 message that was sent */
|
|
61
|
+
raw: Buffer;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generates a Transport object for AWS SES
|
|
65
|
+
*
|
|
66
|
+
* @constructor
|
|
67
|
+
* @param optional config parameter
|
|
68
|
+
*/
|
|
69
|
+
declare class SESTransport extends EventEmitter {
|
|
70
|
+
mailer: Mail<SESSentMessageInfo>;
|
|
71
|
+
options: SESTransportOptions;
|
|
72
|
+
ses: SESTransportOptions['SES'];
|
|
73
|
+
name: string;
|
|
74
|
+
version: string;
|
|
75
|
+
logger: Logger;
|
|
76
|
+
constructor(options: SESTransportOptions);
|
|
77
|
+
getRegion(cb: (err: Error | null, region?: string | false) => void): void;
|
|
78
|
+
/**
|
|
79
|
+
* Compiles a mailcomposer message and forwards it to SES
|
|
80
|
+
*
|
|
81
|
+
* @param mail MailComposer object
|
|
82
|
+
* @param callback Callback function to run when the sending is completed
|
|
83
|
+
*/
|
|
84
|
+
send(mail: MailMessage<SESSentMessageInfo>, callback: (err: Error | null, info?: SESSentMessageInfo) => void): void;
|
|
85
|
+
/**
|
|
86
|
+
* Verifies SES configuration
|
|
87
|
+
*
|
|
88
|
+
* @returns Promise that resolves to true if the configuration is usable
|
|
89
|
+
*/
|
|
90
|
+
verify(): Promise<true>;
|
|
91
|
+
/**
|
|
92
|
+
* Verifies SES configuration
|
|
93
|
+
*
|
|
94
|
+
* @param callback Callback function
|
|
95
|
+
*/
|
|
96
|
+
verify(callback: VerifyCallback): void;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Type aliases in the layout of @types/nodemailer, so `SESTransport.Options` style references keep working
|
|
100
|
+
*/
|
|
101
|
+
declare namespace SESTransport {
|
|
102
|
+
type Options = SESTransportOptions;
|
|
103
|
+
type MailOptions = SendMailOptions;
|
|
104
|
+
type SentMessageInfo = SESSentMessageInfo;
|
|
105
|
+
type SESv2ClientLike = SESTransportClient;
|
|
106
|
+
type SendEmailCommandConstructorLike = SESTransportSendEmailCommand;
|
|
107
|
+
type SendEmailRequestLike = SESSendEmailRequest;
|
|
108
|
+
type MailSesOptions = SESSendEmailRequest;
|
|
109
|
+
}
|
|
110
|
+
/** The same aliases as module level exports, for `import * as SESTransport` and `import SESTransport = require()` */
|
|
111
|
+
export type { SESTransportOptions as Options, SendMailOptions as MailOptions, SESSentMessageInfo as SentMessageInfo, SESTransportClient as SESv2ClientLike, SESTransportSendEmailCommand as SendEmailCommandConstructorLike, SESSendEmailRequest as SendEmailRequestLike, SESSendEmailRequest as MailSesOptions };
|
|
112
|
+
export default SESTransport;
|
|
@@ -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;
|