@nocobase/plugin-workflow-mailer 2.4.0-alpha.1 → 2.4.0-alpha.11
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,331 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import SMTPConnection from '../smtp-connection/index.js';
|
|
3
|
+
import wellKnown from '../well-known/index.js';
|
|
4
|
+
import * as shared from '../shared/index.js';
|
|
5
|
+
import XOAuth2 from '../xoauth2/index.js';
|
|
6
|
+
import * as errors from '../errors.js';
|
|
7
|
+
import * as packageData from '../package-info.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a SMTP transport object for Nodemailer
|
|
10
|
+
*
|
|
11
|
+
* @constructor
|
|
12
|
+
* @param options Connection options
|
|
13
|
+
*/
|
|
14
|
+
class SMTPTransport extends EventEmitter {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super();
|
|
17
|
+
options = options || {};
|
|
18
|
+
if (typeof options === 'string') {
|
|
19
|
+
options = {
|
|
20
|
+
url: options
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
let urlData;
|
|
24
|
+
let service = options.service;
|
|
25
|
+
if (typeof options.getSocket === 'function') {
|
|
26
|
+
this.getSocket = options.getSocket;
|
|
27
|
+
}
|
|
28
|
+
if (options.url) {
|
|
29
|
+
urlData = shared.parseConnectionUrl(options.url);
|
|
30
|
+
service = service || urlData.service;
|
|
31
|
+
}
|
|
32
|
+
this.options = shared.assign(false, // create new object
|
|
33
|
+
options, // regular options
|
|
34
|
+
urlData, // url options
|
|
35
|
+
(service && wellKnown(service)) // wellknown options
|
|
36
|
+
);
|
|
37
|
+
this.logger = shared.getLogger(this.options, {
|
|
38
|
+
component: this.options.component || 'smtp-transport'
|
|
39
|
+
});
|
|
40
|
+
this.name = 'SMTP';
|
|
41
|
+
this.version = packageData.version + '[client:' + packageData.version + ']';
|
|
42
|
+
if (this.options.auth) {
|
|
43
|
+
this.auth = this.getAuth({});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Placeholder function for creating proxy sockets. This method immediatelly returns
|
|
48
|
+
* without a socket
|
|
49
|
+
*
|
|
50
|
+
* @param options Connection options
|
|
51
|
+
* @param callback Callback function to run with the socket keys
|
|
52
|
+
*/
|
|
53
|
+
getSocket(options, callback) {
|
|
54
|
+
// return immediatelly
|
|
55
|
+
setImmediate(() => callback(null, false));
|
|
56
|
+
}
|
|
57
|
+
getAuth(authOpts) {
|
|
58
|
+
if (!authOpts) {
|
|
59
|
+
if (this.auth && this.auth.oauth2 && this.mailer) {
|
|
60
|
+
// Transport-level auth is resolved in the constructor, before the Mail wrapper
|
|
61
|
+
// assigns `this.mailer`, so a provision callback registered with
|
|
62
|
+
// `transporter.set('oauth2_provision_cb', ...)` has to be re-checked here
|
|
63
|
+
this.auth.oauth2.provisionCallback = this.mailer.get('oauth2_provision_cb') || this.auth.oauth2.provisionCallback;
|
|
64
|
+
}
|
|
65
|
+
return this.auth;
|
|
66
|
+
}
|
|
67
|
+
const authData = Object.assign({}, this.options.auth && typeof this.options.auth === 'object' ? this.options.auth : {}, typeof authOpts === 'object' ? authOpts : {});
|
|
68
|
+
if (Object.keys(authData).length === 0) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
switch ((authData.type || '').toString().toUpperCase()) {
|
|
72
|
+
case 'OAUTH2': {
|
|
73
|
+
if (!authData.service && !authData.user) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const oauth2 = new XOAuth2(authData, this.logger);
|
|
77
|
+
oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;
|
|
78
|
+
oauth2.on('token', (token) => this.mailer.emit('token', token));
|
|
79
|
+
oauth2.on('error', err => this.emit('error', err));
|
|
80
|
+
return {
|
|
81
|
+
type: 'OAUTH2',
|
|
82
|
+
user: authData.user,
|
|
83
|
+
oauth2,
|
|
84
|
+
method: 'XOAUTH2'
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
default:
|
|
88
|
+
return {
|
|
89
|
+
type: (authData.type || '').toString().toUpperCase() || 'LOGIN',
|
|
90
|
+
user: authData.user,
|
|
91
|
+
credentials: {
|
|
92
|
+
user: authData.user || '',
|
|
93
|
+
pass: authData.pass,
|
|
94
|
+
options: authData.options
|
|
95
|
+
},
|
|
96
|
+
method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Sends an e-mail using the selected settings
|
|
102
|
+
*
|
|
103
|
+
* @param mail Mail object
|
|
104
|
+
* @param callback Callback function
|
|
105
|
+
*/
|
|
106
|
+
send(mail, callback) {
|
|
107
|
+
this.getSocket(this.options, (err, socketOptions) => {
|
|
108
|
+
if (err) {
|
|
109
|
+
return callback(err);
|
|
110
|
+
}
|
|
111
|
+
let returned = false;
|
|
112
|
+
let options = this.options;
|
|
113
|
+
if (socketOptions && socketOptions.connection) {
|
|
114
|
+
this.logger.info({
|
|
115
|
+
tnx: 'proxy',
|
|
116
|
+
remoteAddress: socketOptions.connection.remoteAddress,
|
|
117
|
+
remotePort: socketOptions.connection.remotePort,
|
|
118
|
+
destHost: options.host || '',
|
|
119
|
+
destPort: options.port || '',
|
|
120
|
+
action: 'connected'
|
|
121
|
+
}, 'Using proxied socket from %s:%s to %s:%s', socketOptions.connection.remoteAddress, socketOptions.connection.remotePort, options.host || '', options.port || '');
|
|
122
|
+
// only copy options if we need to modify it
|
|
123
|
+
options = Object.assign(shared.assign(false, options), socketOptions);
|
|
124
|
+
}
|
|
125
|
+
const connection = new SMTPConnection(options);
|
|
126
|
+
let perCallAuth;
|
|
127
|
+
const cleanupPerCallAuth = () => {
|
|
128
|
+
if (perCallAuth && perCallAuth !== this.auth && perCallAuth.oauth2) {
|
|
129
|
+
perCallAuth.oauth2.removeAllListeners();
|
|
130
|
+
}
|
|
131
|
+
perCallAuth = null;
|
|
132
|
+
};
|
|
133
|
+
connection.once('error', err => {
|
|
134
|
+
if (returned) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
returned = true;
|
|
138
|
+
cleanupPerCallAuth();
|
|
139
|
+
connection.close();
|
|
140
|
+
return callback(err);
|
|
141
|
+
});
|
|
142
|
+
const sendMessage = () => {
|
|
143
|
+
const envelope = mail.message.getEnvelope();
|
|
144
|
+
const messageId = mail.message.messageId();
|
|
145
|
+
const recipients = [].concat(envelope.to || []);
|
|
146
|
+
if (recipients.length > 3) {
|
|
147
|
+
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
148
|
+
}
|
|
149
|
+
if (mail.data.dsn) {
|
|
150
|
+
envelope.dsn = mail.data.dsn;
|
|
151
|
+
}
|
|
152
|
+
// RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter
|
|
153
|
+
if (mail.data.requireTLSExtensionEnabled) {
|
|
154
|
+
envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;
|
|
155
|
+
}
|
|
156
|
+
this.logger.info({
|
|
157
|
+
tnx: 'send',
|
|
158
|
+
messageId
|
|
159
|
+
}, 'Sending message %s to <%s>', messageId, recipients.join(', '));
|
|
160
|
+
connection.send(envelope, mail.message.createReadStream(), (err, info) => {
|
|
161
|
+
if (returned) {
|
|
162
|
+
// the connection error handler has already reported this send
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
returned = true;
|
|
166
|
+
cleanupPerCallAuth();
|
|
167
|
+
connection.close();
|
|
168
|
+
if (err) {
|
|
169
|
+
this.logger.error({
|
|
170
|
+
err,
|
|
171
|
+
tnx: 'send'
|
|
172
|
+
}, 'Send error for %s: %s', messageId, err.message);
|
|
173
|
+
return callback(err);
|
|
174
|
+
}
|
|
175
|
+
info.envelope = {
|
|
176
|
+
from: envelope.from,
|
|
177
|
+
to: envelope.to
|
|
178
|
+
};
|
|
179
|
+
info.messageId = messageId;
|
|
180
|
+
try {
|
|
181
|
+
return callback(null, info);
|
|
182
|
+
}
|
|
183
|
+
catch (E) {
|
|
184
|
+
this.logger.error({
|
|
185
|
+
err: E,
|
|
186
|
+
tnx: 'callback'
|
|
187
|
+
}, 'Callback error for %s: %s', messageId, E.message);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
connection.connect(err => {
|
|
192
|
+
if (returned) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (err) {
|
|
196
|
+
// the server closed the connection before the greeting
|
|
197
|
+
returned = true;
|
|
198
|
+
connection.close();
|
|
199
|
+
return callback(err);
|
|
200
|
+
}
|
|
201
|
+
perCallAuth = this.getAuth(mail.data.auth);
|
|
202
|
+
if (perCallAuth && (connection.allowsAuth || options.forceAuth)) {
|
|
203
|
+
connection.login(perCallAuth, err => {
|
|
204
|
+
cleanupPerCallAuth();
|
|
205
|
+
if (returned) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (err) {
|
|
209
|
+
returned = true;
|
|
210
|
+
connection.close();
|
|
211
|
+
return callback(err);
|
|
212
|
+
}
|
|
213
|
+
sendMessage();
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
sendMessage();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
verify(callback) {
|
|
223
|
+
let promise;
|
|
224
|
+
if (!callback) {
|
|
225
|
+
promise = new Promise((resolve, reject) => {
|
|
226
|
+
callback = shared.callbackPromise(resolve, reject);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// the error paths hand over the error alone
|
|
230
|
+
const done = callback;
|
|
231
|
+
this.getSocket(this.options, (err, socketOptions) => {
|
|
232
|
+
if (err) {
|
|
233
|
+
return done(err);
|
|
234
|
+
}
|
|
235
|
+
let options = this.options;
|
|
236
|
+
if (socketOptions && socketOptions.connection) {
|
|
237
|
+
this.logger.info({
|
|
238
|
+
tnx: 'proxy',
|
|
239
|
+
remoteAddress: socketOptions.connection.remoteAddress,
|
|
240
|
+
remotePort: socketOptions.connection.remotePort,
|
|
241
|
+
destHost: options.host || '',
|
|
242
|
+
destPort: options.port || '',
|
|
243
|
+
action: 'connected'
|
|
244
|
+
}, 'Using proxied socket from %s:%s to %s:%s', socketOptions.connection.remoteAddress, socketOptions.connection.remotePort, options.host || '', options.port || '');
|
|
245
|
+
options = Object.assign(shared.assign(false, options), socketOptions);
|
|
246
|
+
}
|
|
247
|
+
const connection = new SMTPConnection(options);
|
|
248
|
+
let returned = false;
|
|
249
|
+
let perCallAuth;
|
|
250
|
+
const cleanupPerCallAuth = () => {
|
|
251
|
+
if (perCallAuth && perCallAuth !== this.auth && perCallAuth.oauth2) {
|
|
252
|
+
perCallAuth.oauth2.removeAllListeners();
|
|
253
|
+
}
|
|
254
|
+
perCallAuth = null;
|
|
255
|
+
};
|
|
256
|
+
connection.once('error', err => {
|
|
257
|
+
if (returned) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
returned = true;
|
|
261
|
+
cleanupPerCallAuth();
|
|
262
|
+
connection.close();
|
|
263
|
+
return done(err);
|
|
264
|
+
});
|
|
265
|
+
connection.once('end', () => {
|
|
266
|
+
if (returned) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
returned = true;
|
|
270
|
+
cleanupPerCallAuth();
|
|
271
|
+
return done(new Error('Connection closed'));
|
|
272
|
+
});
|
|
273
|
+
const finalize = () => {
|
|
274
|
+
if (returned) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
returned = true;
|
|
278
|
+
cleanupPerCallAuth();
|
|
279
|
+
connection.quit();
|
|
280
|
+
return done(null, true);
|
|
281
|
+
};
|
|
282
|
+
connection.connect(err => {
|
|
283
|
+
if (returned) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (err) {
|
|
287
|
+
returned = true;
|
|
288
|
+
connection.close();
|
|
289
|
+
return done(err);
|
|
290
|
+
}
|
|
291
|
+
perCallAuth = this.getAuth({});
|
|
292
|
+
if (perCallAuth && (connection.allowsAuth || options.forceAuth)) {
|
|
293
|
+
connection.login(perCallAuth, err => {
|
|
294
|
+
cleanupPerCallAuth();
|
|
295
|
+
if (returned) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (err) {
|
|
299
|
+
returned = true;
|
|
300
|
+
connection.close();
|
|
301
|
+
return done(err);
|
|
302
|
+
}
|
|
303
|
+
finalize();
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else if (!perCallAuth && connection.allowsAuth && options.forceAuth) {
|
|
307
|
+
const err = new Error('Authentication info was not provided');
|
|
308
|
+
err.code = errors.ENOAUTH;
|
|
309
|
+
returned = true;
|
|
310
|
+
cleanupPerCallAuth();
|
|
311
|
+
connection.close();
|
|
312
|
+
return done(err);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
finalize();
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
return promise;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Releases resources
|
|
323
|
+
*/
|
|
324
|
+
close() {
|
|
325
|
+
if (this.auth && this.auth.oauth2) {
|
|
326
|
+
this.auth.oauth2.removeAllListeners();
|
|
327
|
+
}
|
|
328
|
+
this.emit('close');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
export default SMTPTransport;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
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 } from '../mailer/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options for the Stream transport
|
|
8
|
+
*/
|
|
9
|
+
export interface StreamTransportOptions extends TransportOptions {
|
|
10
|
+
/** Selects this transport in createTransport */
|
|
11
|
+
streamTransport?: boolean | undefined;
|
|
12
|
+
/** If true, the message is returned as a Buffer object instead of a stream */
|
|
13
|
+
buffer?: boolean | undefined;
|
|
14
|
+
/** Either 'windows' or 'unix', the line ending of the generated message */
|
|
15
|
+
newline?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The value the Stream transport hands to the send callback
|
|
19
|
+
*/
|
|
20
|
+
export interface StreamSentMessageInfo extends SentMessageInfo {
|
|
21
|
+
/** The envelope the message was generated with */
|
|
22
|
+
envelope: MimeNodeEnvelope;
|
|
23
|
+
/** Message-ID value of the message */
|
|
24
|
+
messageId: string;
|
|
25
|
+
/** The generated message, a Buffer when the buffer option is set, a readable stream otherwise */
|
|
26
|
+
message: Readable | Buffer;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generates a Transport object for streaming
|
|
30
|
+
*
|
|
31
|
+
* Possible options can be the following:
|
|
32
|
+
*
|
|
33
|
+
* * **buffer** if true, then returns the message as a Buffer object instead of a stream
|
|
34
|
+
* * **newline** either 'windows' or 'unix'
|
|
35
|
+
*
|
|
36
|
+
* @constructor
|
|
37
|
+
* @param optional config parameter
|
|
38
|
+
*/
|
|
39
|
+
declare class StreamTransport {
|
|
40
|
+
mailer: Mail<StreamSentMessageInfo>;
|
|
41
|
+
options: StreamTransportOptions;
|
|
42
|
+
name: string;
|
|
43
|
+
version: string;
|
|
44
|
+
logger: Logger;
|
|
45
|
+
winbreak: boolean;
|
|
46
|
+
constructor(options?: StreamTransportOptions);
|
|
47
|
+
/**
|
|
48
|
+
* Compiles a mailcomposer message and forwards it to handler that sends it
|
|
49
|
+
*
|
|
50
|
+
* @param mail MailComposer object
|
|
51
|
+
* @param done Callback function to run when the sending is completed
|
|
52
|
+
*/
|
|
53
|
+
send(mail: MailMessage<StreamSentMessageInfo>, done: (err: Error | null, info?: StreamSentMessageInfo) => void): void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Type aliases in the layout of @types/nodemailer, so `StreamTransport.Options` style references keep working
|
|
57
|
+
*/
|
|
58
|
+
declare namespace StreamTransport {
|
|
59
|
+
type Options = StreamTransportOptions;
|
|
60
|
+
type MailOptions = SendMailOptions;
|
|
61
|
+
type SentMessageInfo = StreamSentMessageInfo;
|
|
62
|
+
}
|
|
63
|
+
/** The same aliases as module level exports, for `import * as StreamTransport` and `import StreamTransport = require()` */
|
|
64
|
+
export type { StreamTransportOptions as Options, SendMailOptions as MailOptions, StreamSentMessageInfo as SentMessageInfo };
|
|
65
|
+
export default StreamTransport;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as packageData from '../package-info.js';
|
|
2
|
+
import * as shared from '../shared/index.js';
|
|
3
|
+
import LeWindows from '../mime-node/le-windows.js';
|
|
4
|
+
import LeUnix from '../mime-node/le-unix.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generates a Transport object for streaming
|
|
7
|
+
*
|
|
8
|
+
* Possible options can be the following:
|
|
9
|
+
*
|
|
10
|
+
* * **buffer** if true, then returns the message as a Buffer object instead of a stream
|
|
11
|
+
* * **newline** either 'windows' or 'unix'
|
|
12
|
+
*
|
|
13
|
+
* @constructor
|
|
14
|
+
* @param optional config parameter
|
|
15
|
+
*/
|
|
16
|
+
class StreamTransport {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
options = options || {};
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.name = 'StreamTransport';
|
|
21
|
+
this.version = packageData.version;
|
|
22
|
+
this.logger = shared.getLogger(this.options, {
|
|
23
|
+
component: this.options.component || 'stream-transport'
|
|
24
|
+
});
|
|
25
|
+
this.winbreak = ['win', 'windows', 'dos', '\r\n'].includes((options.newline || '').toString().toLowerCase());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compiles a mailcomposer message and forwards it to handler that sends it
|
|
29
|
+
*
|
|
30
|
+
* @param mail MailComposer object
|
|
31
|
+
* @param done Callback function to run when the sending is completed
|
|
32
|
+
*/
|
|
33
|
+
send(mail, done) {
|
|
34
|
+
// We probably need this in the output. send() runs after the message was compiled,
|
|
35
|
+
// so mail.message is set
|
|
36
|
+
mail.message.keepBcc = true;
|
|
37
|
+
const envelope = mail.message.getEnvelope();
|
|
38
|
+
const messageId = mail.message.messageId();
|
|
39
|
+
const recipients = [].concat(envelope.to || []);
|
|
40
|
+
if (recipients.length > 3) {
|
|
41
|
+
recipients.push('...and ' + recipients.splice(2).length + ' more');
|
|
42
|
+
}
|
|
43
|
+
this.logger.info({
|
|
44
|
+
tnx: 'send',
|
|
45
|
+
messageId
|
|
46
|
+
}, 'Sending message %s to <%s> using %s line breaks', messageId, recipients.join(', '), this.winbreak ? '<CR><LF>' : '<LF>');
|
|
47
|
+
setImmediate(() => {
|
|
48
|
+
let stream;
|
|
49
|
+
try {
|
|
50
|
+
stream = mail.message.createReadStream();
|
|
51
|
+
if (this.options.newline) {
|
|
52
|
+
// apply the transport-level line ending transform; the message-level
|
|
53
|
+
// `newline` option is handled by MimeNode in createReadStream()
|
|
54
|
+
const sourceStream = stream;
|
|
55
|
+
stream = sourceStream.pipe(this.winbreak ? new LeWindows() : new LeUnix());
|
|
56
|
+
sourceStream.once('error', err => stream.emit('error', err));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (E) {
|
|
60
|
+
this.logger.error({
|
|
61
|
+
err: E,
|
|
62
|
+
tnx: 'send',
|
|
63
|
+
messageId
|
|
64
|
+
}, 'Creating send stream failed for %s. %s', messageId, E.message);
|
|
65
|
+
return done(E);
|
|
66
|
+
}
|
|
67
|
+
if (!this.options.buffer) {
|
|
68
|
+
stream.once('error', err => {
|
|
69
|
+
this.logger.error({
|
|
70
|
+
err,
|
|
71
|
+
tnx: 'send',
|
|
72
|
+
messageId
|
|
73
|
+
}, 'Failed creating message for %s. %s', messageId, err.message);
|
|
74
|
+
});
|
|
75
|
+
return done(null, {
|
|
76
|
+
envelope,
|
|
77
|
+
messageId,
|
|
78
|
+
message: stream
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const chunks = [];
|
|
82
|
+
let chunklen = 0;
|
|
83
|
+
stream.on('readable', () => {
|
|
84
|
+
let chunk;
|
|
85
|
+
while ((chunk = stream.read()) !== null) {
|
|
86
|
+
chunks.push(chunk);
|
|
87
|
+
chunklen += chunk.length;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
stream.once('error', err => {
|
|
91
|
+
this.logger.error({
|
|
92
|
+
err,
|
|
93
|
+
tnx: 'send',
|
|
94
|
+
messageId
|
|
95
|
+
}, 'Failed creating message for %s. %s', messageId, err.message);
|
|
96
|
+
return done(err);
|
|
97
|
+
});
|
|
98
|
+
stream.on('end', () => done(null, {
|
|
99
|
+
envelope,
|
|
100
|
+
messageId,
|
|
101
|
+
message: Buffer.concat(chunks, chunklen)
|
|
102
|
+
}));
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export default StreamTransport;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection settings of a well-known e-mail service
|
|
3
|
+
*/
|
|
4
|
+
export interface WellKnownServiceDefinition {
|
|
5
|
+
/** Human readable description of the service */
|
|
6
|
+
description?: string | undefined;
|
|
7
|
+
/** Domains of e-mail addresses hosted by the service */
|
|
8
|
+
domains?: string[] | undefined;
|
|
9
|
+
/** Alternative names the service can be looked up by */
|
|
10
|
+
aliases?: string[] | undefined;
|
|
11
|
+
/** SMTP hostname */
|
|
12
|
+
host?: string | undefined;
|
|
13
|
+
/** SMTP port (a numeric string in a few entries) */
|
|
14
|
+
port?: number | string | undefined;
|
|
15
|
+
/** true for implicit TLS (usually port 465) */
|
|
16
|
+
secure?: boolean | undefined;
|
|
17
|
+
/** Preferred authentication method */
|
|
18
|
+
authMethod?: string | undefined;
|
|
19
|
+
/** Set to true to require STARTTLS on a plaintext connection */
|
|
20
|
+
requireTLS?: boolean | undefined;
|
|
21
|
+
/** Set to true to skip STARTTLS */
|
|
22
|
+
ignoreTLS?: boolean | undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* SMTP settings of a well-known service, without the lookup keys
|
|
26
|
+
*/
|
|
27
|
+
export type WellKnownService = Omit<WellKnownServiceDefinition, 'domains' | 'aliases'>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or
|
|
30
|
+
* an email address (like 'test@googlemail.com').
|
|
31
|
+
*
|
|
32
|
+
* @param key Service name, alias or an email address
|
|
33
|
+
* @returns SMTP config or false if not found
|
|
34
|
+
*/
|
|
35
|
+
export default function wellKnown(key: string): WellKnownService | false;
|
|
@@ -1,47 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const services = require('./services.json');
|
|
1
|
+
import { services } from './services.js';
|
|
4
2
|
const normalized = {};
|
|
5
|
-
|
|
6
3
|
Object.keys(services).forEach(key => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
normalized[normalizeKey(key)] =
|
|
10
|
-
|
|
4
|
+
const service = services[key];
|
|
5
|
+
const normalizedService = normalizeService(service);
|
|
6
|
+
normalized[normalizeKey(key)] = normalizedService;
|
|
11
7
|
[].concat(service.aliases || []).forEach(alias => {
|
|
12
|
-
normalized[normalizeKey(alias)] =
|
|
8
|
+
normalized[normalizeKey(alias)] = normalizedService;
|
|
13
9
|
});
|
|
14
|
-
|
|
15
10
|
[].concat(service.domains || []).forEach(domain => {
|
|
16
|
-
normalized[normalizeKey(domain)] =
|
|
11
|
+
normalized[normalizeKey(domain)] = normalizedService;
|
|
17
12
|
});
|
|
18
13
|
});
|
|
19
|
-
|
|
20
14
|
function normalizeKey(key) {
|
|
21
15
|
return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();
|
|
22
16
|
}
|
|
23
|
-
|
|
24
17
|
function normalizeService(service) {
|
|
25
|
-
|
|
26
|
-
let response = {};
|
|
27
|
-
|
|
18
|
+
const response = {};
|
|
28
19
|
Object.keys(service).forEach(key => {
|
|
29
|
-
if (
|
|
20
|
+
if (!['domains', 'aliases'].includes(key)) {
|
|
30
21
|
response[key] = service[key];
|
|
31
22
|
}
|
|
32
23
|
});
|
|
33
|
-
|
|
34
24
|
return response;
|
|
35
25
|
}
|
|
36
|
-
|
|
37
26
|
/**
|
|
38
27
|
* Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or
|
|
39
28
|
* an email address (like 'test@googlemail.com').
|
|
40
29
|
*
|
|
41
|
-
* @param
|
|
42
|
-
* @returns
|
|
30
|
+
* @param key Service name, alias or an email address
|
|
31
|
+
* @returns SMTP config or false if not found
|
|
43
32
|
*/
|
|
44
|
-
|
|
33
|
+
export default function wellKnown(key) {
|
|
45
34
|
key = normalizeKey(key.split('@').pop());
|
|
46
35
|
return normalized[key] || false;
|
|
47
|
-
}
|
|
36
|
+
}
|