@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,62 @@
|
|
|
1
|
+
import SMTPConnection from '../smtp-connection/index.js';
|
|
2
|
+
import { type Logger } from '../shared/index.js';
|
|
3
|
+
import { EventEmitter } from 'node:events';
|
|
4
|
+
import type { SMTPTransportAuth, SMTPTransportSendCallback } from '../smtp-transport/index.js';
|
|
5
|
+
import type MailMessage from '../mailer/mail-message.js';
|
|
6
|
+
import type SMTPPool from './index.js';
|
|
7
|
+
import type { SMTPPoolResolvedOptions, SMTPPoolQueueEntry } from './index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Callback for connect(), the result is true once the connection is ready for messages
|
|
10
|
+
*/
|
|
11
|
+
export type PoolResourceConnectCallback = (err: Error | null, connected?: true) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Callback for send()
|
|
14
|
+
*/
|
|
15
|
+
export type PoolResourceSendCallback = SMTPTransportSendCallback;
|
|
16
|
+
/**
|
|
17
|
+
* Creates an element for the pool
|
|
18
|
+
*
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param pool SMTPPool instance
|
|
21
|
+
*/
|
|
22
|
+
export default class PoolResource extends EventEmitter {
|
|
23
|
+
pool: SMTPPool;
|
|
24
|
+
options: SMTPPoolResolvedOptions;
|
|
25
|
+
logger: Logger;
|
|
26
|
+
/**
|
|
27
|
+
* Authentication data for the connection, set when the pool options include auth
|
|
28
|
+
*/
|
|
29
|
+
auth?: SMTPTransportAuth | undefined;
|
|
30
|
+
messages: number;
|
|
31
|
+
available: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* The SMTP connection, set by connect()
|
|
34
|
+
*/
|
|
35
|
+
connection: SMTPConnection;
|
|
36
|
+
/**
|
|
37
|
+
* Resource id, assigned by the pool
|
|
38
|
+
*/
|
|
39
|
+
id: number;
|
|
40
|
+
/**
|
|
41
|
+
* The queue entry being sent, assigned by the pool. False once it has been handled
|
|
42
|
+
*/
|
|
43
|
+
queueEntry?: SMTPPoolQueueEntry | false | undefined;
|
|
44
|
+
constructor(pool: SMTPPool);
|
|
45
|
+
/**
|
|
46
|
+
* Initiates a connection to the SMTP server
|
|
47
|
+
*
|
|
48
|
+
* @param callback Callback function to run once the connection is established or failed
|
|
49
|
+
*/
|
|
50
|
+
connect(callback: PoolResourceConnectCallback): void;
|
|
51
|
+
/**
|
|
52
|
+
* Sends an e-mail to be sent using the selected settings
|
|
53
|
+
*
|
|
54
|
+
* @param mail Mail object
|
|
55
|
+
* @param callback Callback function
|
|
56
|
+
*/
|
|
57
|
+
send(mail: MailMessage, callback: PoolResourceSendCallback): void;
|
|
58
|
+
/**
|
|
59
|
+
* Closes the connection
|
|
60
|
+
*/
|
|
61
|
+
close(): void;
|
|
62
|
+
}
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const EventEmitter = require('events');
|
|
7
|
-
|
|
1
|
+
import SMTPConnection from '../smtp-connection/index.js';
|
|
2
|
+
import { assign } from '../shared/index.js';
|
|
3
|
+
import XOAuth2 from '../xoauth2/index.js';
|
|
4
|
+
import * as errors from '../errors.js';
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
8
6
|
/**
|
|
9
7
|
* Creates an element for the pool
|
|
10
8
|
*
|
|
11
9
|
* @constructor
|
|
12
|
-
* @param
|
|
10
|
+
* @param pool SMTPPool instance
|
|
13
11
|
*/
|
|
14
|
-
class PoolResource extends EventEmitter {
|
|
12
|
+
export default class PoolResource extends EventEmitter {
|
|
15
13
|
constructor(pool) {
|
|
16
14
|
super();
|
|
17
|
-
|
|
18
15
|
this.pool = pool;
|
|
19
16
|
this.options = pool.options;
|
|
20
17
|
this.logger = this.pool.logger;
|
|
21
|
-
|
|
22
18
|
if (this.options.auth) {
|
|
23
19
|
switch ((this.options.auth.type || '').toString().toUpperCase()) {
|
|
24
20
|
case 'OAUTH2': {
|
|
25
|
-
|
|
26
|
-
oauth2.provisionCallback =
|
|
21
|
+
const oauth2 = new XOAuth2(this.options.auth, this.logger);
|
|
22
|
+
oauth2.provisionCallback =
|
|
23
|
+
(this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;
|
|
27
24
|
this.auth = {
|
|
28
25
|
type: 'OAUTH2',
|
|
29
26
|
user: this.options.auth.user,
|
|
30
27
|
oauth2,
|
|
31
28
|
method: 'XOAUTH2'
|
|
32
29
|
};
|
|
33
|
-
oauth2.on('token', token => this.pool.mailer.emit('token', token));
|
|
34
|
-
oauth2.on('error', err => this.
|
|
30
|
+
oauth2.on('token', (token) => this.pool.mailer.emit('token', token));
|
|
31
|
+
oauth2.on('error', err => this._fail(err));
|
|
35
32
|
break;
|
|
36
33
|
}
|
|
37
34
|
default:
|
|
@@ -50,110 +47,90 @@ class PoolResource extends EventEmitter {
|
|
|
50
47
|
};
|
|
51
48
|
}
|
|
52
49
|
}
|
|
53
|
-
|
|
54
50
|
this._connection = false;
|
|
55
51
|
this._connected = false;
|
|
56
|
-
|
|
57
52
|
this.messages = 0;
|
|
58
53
|
this.available = true;
|
|
54
|
+
this._failed = false;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emits 'error' for the first failure only. A dead resource can report the same failure more
|
|
58
|
+
* than once (the connection error, then the send callback), the pool handles it once
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
_fail(err) {
|
|
62
|
+
if (this._failed) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this._failed = true;
|
|
66
|
+
this.emit('error', err);
|
|
59
67
|
}
|
|
60
|
-
|
|
61
68
|
/**
|
|
62
69
|
* Initiates a connection to the SMTP server
|
|
63
70
|
*
|
|
64
|
-
* @param
|
|
71
|
+
* @param callback Callback function to run once the connection is established or failed
|
|
65
72
|
*/
|
|
66
73
|
connect(callback) {
|
|
67
74
|
this.pool.getSocket(this.options, (err, socketOptions) => {
|
|
68
75
|
if (err) {
|
|
76
|
+
// nothing was connected, so no 'close' event is coming that would free the
|
|
77
|
+
// slot this resource holds in the pool, report the failure the way a failed
|
|
78
|
+
// login does
|
|
79
|
+
this._fail(err);
|
|
69
80
|
return callback(err);
|
|
70
81
|
}
|
|
71
|
-
|
|
72
82
|
let returned = false;
|
|
73
83
|
let options = this.options;
|
|
74
84
|
if (socketOptions && socketOptions.connection) {
|
|
75
|
-
this.logger.info(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
'Using proxied socket from %s:%s to %s:%s',
|
|
85
|
-
socketOptions.connection.remoteAddress,
|
|
86
|
-
socketOptions.connection.remotePort,
|
|
87
|
-
options.host || '',
|
|
88
|
-
options.port || ''
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
options = assign(false, options);
|
|
92
|
-
Object.keys(socketOptions).forEach(key => {
|
|
93
|
-
options[key] = socketOptions[key];
|
|
94
|
-
});
|
|
85
|
+
this.logger.info({
|
|
86
|
+
tnx: 'proxy',
|
|
87
|
+
remoteAddress: socketOptions.connection.remoteAddress,
|
|
88
|
+
remotePort: socketOptions.connection.remotePort,
|
|
89
|
+
destHost: options.host || '',
|
|
90
|
+
destPort: options.port || '',
|
|
91
|
+
action: 'connected'
|
|
92
|
+
}, 'Using proxied socket from %s:%s to %s:%s', socketOptions.connection.remoteAddress, socketOptions.connection.remotePort, options.host || '', options.port || '');
|
|
93
|
+
options = Object.assign(assign(false, options), socketOptions);
|
|
95
94
|
}
|
|
96
|
-
|
|
97
95
|
this.connection = new SMTPConnection(options);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.emit('error', err);
|
|
96
|
+
this.connection.on('error', err => {
|
|
97
|
+
this._fail(err);
|
|
101
98
|
if (returned) {
|
|
102
99
|
return;
|
|
103
100
|
}
|
|
104
101
|
returned = true;
|
|
105
102
|
return callback(err);
|
|
106
103
|
});
|
|
107
|
-
|
|
108
104
|
this.connection.once('end', () => {
|
|
109
105
|
this.close();
|
|
110
|
-
if (returned) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
106
|
returned = true;
|
|
114
|
-
|
|
115
|
-
let timer = setTimeout(() => {
|
|
116
|
-
if (returned) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
// still have not returned, this means we have an unexpected connection close
|
|
120
|
-
let err = new Error('Unexpected socket close');
|
|
121
|
-
if (this.connection && this.connection._socket && this.connection._socket.upgrading) {
|
|
122
|
-
// starttls connection errors
|
|
123
|
-
err.code = 'ETLS';
|
|
124
|
-
}
|
|
125
|
-
callback(err);
|
|
126
|
-
}, 1000);
|
|
127
|
-
|
|
128
|
-
try {
|
|
129
|
-
timer.unref();
|
|
130
|
-
} catch (E) {
|
|
131
|
-
// Ignore. Happens on envs with non-node timer implementation
|
|
132
|
-
}
|
|
133
107
|
});
|
|
134
|
-
|
|
135
|
-
this.connection.connect(() => {
|
|
108
|
+
this.connection.connect(err => {
|
|
136
109
|
if (returned) {
|
|
137
110
|
return;
|
|
138
111
|
}
|
|
139
|
-
|
|
112
|
+
if (err) {
|
|
113
|
+
// a close before the greeting, the 'end' that follows closes this resource
|
|
114
|
+
// and the pool requeues or fails the entry, bounded by maxRequeues
|
|
115
|
+
returned = true;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
140
118
|
if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {
|
|
141
119
|
this.connection.login(this.auth, err => {
|
|
142
120
|
if (returned) {
|
|
143
121
|
return;
|
|
144
122
|
}
|
|
145
123
|
returned = true;
|
|
146
|
-
|
|
147
124
|
if (err) {
|
|
148
125
|
this.connection.close();
|
|
149
|
-
this.
|
|
126
|
+
this._fail(err);
|
|
150
127
|
return callback(err);
|
|
151
128
|
}
|
|
152
|
-
|
|
153
129
|
this._connected = true;
|
|
154
130
|
callback(null, true);
|
|
155
131
|
});
|
|
156
|
-
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
157
134
|
returned = true;
|
|
158
135
|
this._connected = true;
|
|
159
136
|
return callback(null, true);
|
|
@@ -161,12 +138,11 @@ class PoolResource extends EventEmitter {
|
|
|
161
138
|
});
|
|
162
139
|
});
|
|
163
140
|
}
|
|
164
|
-
|
|
165
141
|
/**
|
|
166
142
|
* Sends an e-mail to be sent using the selected settings
|
|
167
143
|
*
|
|
168
|
-
* @param
|
|
169
|
-
* @param
|
|
144
|
+
* @param mail Mail object
|
|
145
|
+
* @param callback Callback function
|
|
170
146
|
*/
|
|
171
147
|
send(mail, callback) {
|
|
172
148
|
if (!this._connected) {
|
|
@@ -177,64 +153,53 @@ class PoolResource extends EventEmitter {
|
|
|
177
153
|
return this.send(mail, callback);
|
|
178
154
|
});
|
|
179
155
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
let recipients = [].concat(envelope.to || []);
|
|
156
|
+
const envelope = mail.message.getEnvelope();
|
|
157
|
+
const messageId = mail.message.messageId();
|
|
158
|
+
const recipients = [].concat(envelope.to || []);
|
|
185
159
|
if (recipients.length > 3) {
|
|
186
160
|
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
187
161
|
}
|
|
188
|
-
this.logger.info(
|
|
189
|
-
|
|
190
|
-
tnx: 'send',
|
|
191
|
-
messageId,
|
|
192
|
-
cid: this.id
|
|
193
|
-
},
|
|
194
|
-
'Sending message %s using #%s to <%s>',
|
|
162
|
+
this.logger.info({
|
|
163
|
+
tnx: 'send',
|
|
195
164
|
messageId,
|
|
196
|
-
this.id
|
|
197
|
-
|
|
198
|
-
);
|
|
199
|
-
|
|
165
|
+
cid: this.id
|
|
166
|
+
}, 'Sending message %s using #%s to <%s>', messageId, this.id, recipients.join(', '));
|
|
200
167
|
if (mail.data.dsn) {
|
|
201
168
|
envelope.dsn = mail.data.dsn;
|
|
202
169
|
}
|
|
203
|
-
|
|
170
|
+
// RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter
|
|
171
|
+
if (mail.data.requireTLSExtensionEnabled) {
|
|
172
|
+
envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;
|
|
173
|
+
}
|
|
204
174
|
this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {
|
|
205
175
|
this.messages++;
|
|
206
|
-
|
|
207
176
|
if (err) {
|
|
208
177
|
this.connection.close();
|
|
209
|
-
this.
|
|
178
|
+
this._fail(err);
|
|
210
179
|
return callback(err);
|
|
211
180
|
}
|
|
212
|
-
|
|
213
181
|
info.envelope = {
|
|
214
182
|
from: envelope.from,
|
|
215
183
|
to: envelope.to
|
|
216
184
|
};
|
|
217
185
|
info.messageId = messageId;
|
|
218
|
-
|
|
219
186
|
setImmediate(() => {
|
|
220
|
-
let err;
|
|
221
187
|
if (this.messages >= this.options.maxMessages) {
|
|
222
|
-
err = new Error('Resource exhausted');
|
|
223
|
-
err.code =
|
|
188
|
+
const err = new Error('Resource exhausted');
|
|
189
|
+
err.code = errors.EMAXLIMIT;
|
|
224
190
|
this.connection.close();
|
|
225
|
-
this.
|
|
226
|
-
}
|
|
191
|
+
this._fail(err);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
227
194
|
this.pool._checkRateLimit(() => {
|
|
228
195
|
this.available = true;
|
|
229
196
|
this.emit('available');
|
|
230
197
|
});
|
|
231
198
|
}
|
|
232
199
|
});
|
|
233
|
-
|
|
234
200
|
callback(null, info);
|
|
235
201
|
});
|
|
236
202
|
}
|
|
237
|
-
|
|
238
203
|
/**
|
|
239
204
|
* Closes the connection
|
|
240
205
|
*/
|
|
@@ -249,5 +214,3 @@ class PoolResource extends EventEmitter {
|
|
|
249
214
|
this.emit('close');
|
|
250
215
|
}
|
|
251
216
|
}
|
|
252
|
-
|
|
253
|
-
module.exports = PoolResource;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { type SMTPConnectionOptions, type SMTPConnectionAuth, type SMTPConnectionSendInfo } from '../smtp-connection/index.js';
|
|
3
|
+
import * as shared from '../shared/index.js';
|
|
4
|
+
import { type XOAuth2Options } from '../xoauth2/index.js';
|
|
5
|
+
import type { ResultCallback } from '../errors.js';
|
|
6
|
+
import type MailMessage from '../mailer/mail-message.js';
|
|
7
|
+
import type { default as Mail, GetSocketCallback, SentMessageInfo, SendMailOptions, TransportOptions, VerifyCallback } from '../mailer/index.js';
|
|
8
|
+
import type { MimeNodeEnvelope } from '../mime-node/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Authentication settings, either from the transport options or from the message data.
|
|
11
|
+
* OAuth2 settings are handed to XOAuth2 as is
|
|
12
|
+
*/
|
|
13
|
+
export interface SMTPTransportAuthOptions extends XOAuth2Options {
|
|
14
|
+
/** 'OAuth2' selects XOAUTH2, anything else is a password login, 'LOGIN' when not set */
|
|
15
|
+
type?: string | undefined;
|
|
16
|
+
/** Username */
|
|
17
|
+
user?: string | undefined;
|
|
18
|
+
/** Password */
|
|
19
|
+
pass?: string | undefined;
|
|
20
|
+
/** SASL method to use, e.g. 'PLAIN', 'LOGIN' or 'CRAM-MD5' */
|
|
21
|
+
method?: string | undefined;
|
|
22
|
+
/** Extra options for the authentication method, handed to a custom SASL handler */
|
|
23
|
+
options?: {
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
} | undefined;
|
|
26
|
+
/** Service identifier, an OAuth2 login needs either this or a user */
|
|
27
|
+
service?: string | undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Authentication data built by getAuth() and handed to SMTPConnection#login
|
|
31
|
+
*/
|
|
32
|
+
export interface SMTPTransportAuth extends SMTPConnectionAuth {
|
|
33
|
+
/** 'OAUTH2', or the upper cased type from the settings, 'LOGIN' when none was given */
|
|
34
|
+
type: string;
|
|
35
|
+
/** 'XOAUTH2' for OAuth2, otherwise the configured SASL method, false lets the connection pick one */
|
|
36
|
+
method: string | false;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Receives the socket details from getSocket, false when a new socket should be opened. The
|
|
40
|
+
* object is merged into the connection options, a proxy handler provides the connected socket
|
|
41
|
+
* as `connection`. The same callback type Mail hands to a transport, so that the SMTP
|
|
42
|
+
* transports stay assignable to the Transport interface
|
|
43
|
+
*/
|
|
44
|
+
export type SMTPTransportGetSocketCallback = GetSocketCallback;
|
|
45
|
+
/**
|
|
46
|
+
* Custom socket provider, replaces the getSocket method of the transport
|
|
47
|
+
*/
|
|
48
|
+
export type SMTPTransportGetSocket = (options: SMTPTransportOptions, callback: SMTPTransportGetSocketCallback) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Options for the SMTP transport, the connection options plus the transport level settings
|
|
51
|
+
*/
|
|
52
|
+
export interface SMTPTransportOptions extends SMTPConnectionOptions, TransportOptions {
|
|
53
|
+
/** Well-known service name, e.g. 'Gmail', fills in host, port and secure */
|
|
54
|
+
service?: string | undefined;
|
|
55
|
+
/** Connection url, e.g. 'smtps://user:pass@smtp.example.com', parsed into options */
|
|
56
|
+
url?: string | undefined;
|
|
57
|
+
/** Authentication settings, no authentication when not set */
|
|
58
|
+
auth?: SMTPTransportAuthOptions | undefined;
|
|
59
|
+
/** Custom socket provider, e.g. for connecting through a proxy, replaces the getSocket method */
|
|
60
|
+
getSocket?: SMTPTransportGetSocket | undefined;
|
|
61
|
+
/** Authenticate even when the server does not advertise AUTH, and fail verify() when it does but no credentials were given */
|
|
62
|
+
forceAuth?: boolean | undefined;
|
|
63
|
+
/** Default SASL method for the password logins when the auth settings do not name one */
|
|
64
|
+
authMethod?: string | undefined;
|
|
65
|
+
/** Logger component name, defaults to 'smtp-transport' */
|
|
66
|
+
component?: string | undefined;
|
|
67
|
+
/** Set to true to get a pooled transport from createTransport, this transport does not read it */
|
|
68
|
+
pool?: boolean | undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Result of a sent message, the connection result plus the envelope and the Message-ID
|
|
72
|
+
*/
|
|
73
|
+
export interface SMTPSentMessageInfo extends SMTPConnectionSendInfo, SentMessageInfo {
|
|
74
|
+
/** Envelope the message was sent with */
|
|
75
|
+
envelope: MimeNodeEnvelope;
|
|
76
|
+
/** Message-ID value of the sent message */
|
|
77
|
+
messageId: string;
|
|
78
|
+
/** Recipients the server accepted */
|
|
79
|
+
accepted: string[];
|
|
80
|
+
/** Recipients the server rejected */
|
|
81
|
+
rejected: string[];
|
|
82
|
+
/** Final server response for the message */
|
|
83
|
+
response: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Callback for send()
|
|
87
|
+
*/
|
|
88
|
+
export type SMTPTransportSendCallback = ResultCallback<SMTPSentMessageInfo>;
|
|
89
|
+
/**
|
|
90
|
+
* Creates a SMTP transport object for Nodemailer
|
|
91
|
+
*
|
|
92
|
+
* @constructor
|
|
93
|
+
* @param options Connection options
|
|
94
|
+
*/
|
|
95
|
+
declare class SMTPTransport extends EventEmitter {
|
|
96
|
+
options: SMTPTransportOptions;
|
|
97
|
+
logger: shared.Logger;
|
|
98
|
+
name: string;
|
|
99
|
+
version: string;
|
|
100
|
+
/**
|
|
101
|
+
* Transport level authentication data, set when the options include auth
|
|
102
|
+
*/
|
|
103
|
+
auth?: SMTPTransportAuth | false | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* The Mail instance using this transport, assigned by Mail
|
|
106
|
+
*/
|
|
107
|
+
mailer?: Mail<SMTPSentMessageInfo, SMTPTransportOptions> | undefined;
|
|
108
|
+
constructor(options?: SMTPTransportOptions | string);
|
|
109
|
+
/**
|
|
110
|
+
* Placeholder function for creating proxy sockets. This method immediatelly returns
|
|
111
|
+
* without a socket
|
|
112
|
+
*
|
|
113
|
+
* @param options Connection options
|
|
114
|
+
* @param callback Callback function to run with the socket keys
|
|
115
|
+
*/
|
|
116
|
+
getSocket(options: SMTPTransportOptions, callback: SMTPTransportGetSocketCallback): void;
|
|
117
|
+
getAuth(authOpts?: SMTPTransportAuthOptions | false | null): SMTPTransportAuth | false | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Sends an e-mail using the selected settings
|
|
120
|
+
*
|
|
121
|
+
* @param mail Mail object
|
|
122
|
+
* @param callback Callback function
|
|
123
|
+
*/
|
|
124
|
+
send(mail: MailMessage<SMTPSentMessageInfo>, callback: SMTPTransportSendCallback): void;
|
|
125
|
+
/**
|
|
126
|
+
* Verifies SMTP configuration
|
|
127
|
+
*
|
|
128
|
+
* @returns Promise that resolves to true if the configuration is usable
|
|
129
|
+
*/
|
|
130
|
+
verify(): Promise<true>;
|
|
131
|
+
/**
|
|
132
|
+
* Verifies SMTP configuration
|
|
133
|
+
*
|
|
134
|
+
* @param callback Callback function
|
|
135
|
+
*/
|
|
136
|
+
verify(callback: VerifyCallback): void;
|
|
137
|
+
/**
|
|
138
|
+
* Releases resources
|
|
139
|
+
*/
|
|
140
|
+
close(): void;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Type aliases in the layout of @types/nodemailer, so `SMTPTransport.Options` style references keep working
|
|
144
|
+
*/
|
|
145
|
+
declare namespace SMTPTransport {
|
|
146
|
+
type Options = SMTPTransportOptions;
|
|
147
|
+
type MailOptions = SendMailOptions;
|
|
148
|
+
type SentMessageInfo = SMTPSentMessageInfo;
|
|
149
|
+
type AuthenticationType = SMTPTransportAuth;
|
|
150
|
+
type AuthenticationTypeLogin = SMTPTransportAuth;
|
|
151
|
+
type AuthenticationTypeOAuth2 = SMTPTransportAuth;
|
|
152
|
+
type AuthenticationTypeCustom = SMTPTransportAuth;
|
|
153
|
+
}
|
|
154
|
+
/** The same aliases as module level exports, for `import * as SMTPTransport` and `import SMTPTransport = require()` */
|
|
155
|
+
export type { SMTPTransportOptions as Options, SendMailOptions as MailOptions, SMTPSentMessageInfo as SentMessageInfo, SMTPTransportAuth as AuthenticationType, SMTPTransportAuth as AuthenticationTypeLogin, SMTPTransportAuth as AuthenticationTypeOAuth2, SMTPTransportAuth as AuthenticationTypeCustom };
|
|
156
|
+
export default SMTPTransport;
|