@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.
Files changed (187) hide show
  1. package/dist/externalVersion.js +6 -6
  2. package/dist/node_modules/joi/dist/joi-browser.min.js +1 -1
  3. package/dist/node_modules/joi/lib/index.js +1 -1
  4. package/dist/node_modules/joi/lib/messages.js +35 -6
  5. package/dist/node_modules/joi/lib/types/keys.js +18 -1
  6. package/dist/node_modules/joi/lib/types/link.js +18 -2
  7. package/dist/node_modules/joi/lib/types/string.js +2 -2
  8. package/dist/node_modules/joi/package.json +1 -1
  9. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
  10. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
  11. package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
  12. package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
  13. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
  14. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
  15. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
  16. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
  17. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
  18. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
  19. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
  20. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
  21. package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
  22. package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
  23. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
  24. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
  25. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
  26. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
  27. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
  28. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
  29. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
  30. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
  31. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
  32. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
  33. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
  34. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
  35. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
  36. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
  37. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
  38. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
  39. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
  40. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
  41. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
  42. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
  43. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
  44. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
  45. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
  46. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
  47. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
  48. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
  49. package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
  50. package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
  51. package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
  52. package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
  53. package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +63 -112
  54. package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
  55. package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
  56. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
  57. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
  58. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
  59. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
  60. package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
  61. package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
  62. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
  63. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
  64. package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
  65. package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
  66. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
  67. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
  68. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
  69. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
  70. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
  71. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
  72. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
  73. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
  74. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
  75. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
  76. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
  77. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
  78. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
  79. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
  80. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
  81. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
  82. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
  83. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
  84. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
  85. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
  86. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
  87. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.js +786 -0
  88. package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
  89. package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +39 -68
  90. package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
  91. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +62 -92
  92. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
  93. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.js +176 -0
  94. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
  95. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
  96. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
  97. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.js +125 -0
  98. package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
  99. package/dist/node_modules/nodemailer/dist/esm/errors.js +67 -0
  100. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
  101. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
  102. package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
  103. package/dist/node_modules/nodemailer/dist/esm/fetch/index.js +344 -0
  104. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
  105. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.js +62 -0
  106. package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
  107. package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +283 -275
  108. package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
  109. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +151 -205
  110. package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
  111. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +111 -125
  112. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
  113. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
  114. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
  115. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +43 -49
  116. package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
  117. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +576 -437
  118. package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
  119. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
  120. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
  121. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +7 -15
  122. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
  123. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -16
  124. package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
  125. package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
  126. package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
  127. package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
  128. package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
  129. package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
  130. package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
  131. package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
  132. package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +59 -77
  133. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
  134. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.js +170 -0
  135. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
  136. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
  137. package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
  138. package/dist/node_modules/nodemailer/dist/esm/shared/index.js +631 -0
  139. package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
  140. package/dist/node_modules/nodemailer/dist/esm/shared/objects.js +38 -0
  141. package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
  142. package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
  143. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
  144. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
  145. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
  146. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.js +149 -0
  147. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
  148. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.js +1797 -0
  149. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
  150. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +195 -314
  151. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
  152. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +70 -107
  153. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
  154. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.js +331 -0
  155. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
  156. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.js +106 -0
  157. package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
  158. package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +12 -23
  159. package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
  160. package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
  161. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
  162. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.js +386 -0
  163. package/dist/node_modules/nodemailer/dist/well-known/services.json +640 -0
  164. package/dist/node_modules/nodemailer/package.json +1 -1
  165. package/package.json +4 -4
  166. package/dist/node_modules/nodemailer/.gitattributes +0 -6
  167. package/dist/node_modules/nodemailer/.ncurc.js +0 -7
  168. package/dist/node_modules/nodemailer/.prettierrc.js +0 -8
  169. package/dist/node_modules/nodemailer/lib/addressparser/index.js +0 -313
  170. package/dist/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  171. package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  172. package/dist/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  173. package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  174. package/dist/node_modules/nodemailer/lib/fetch/index.js +0 -274
  175. package/dist/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  176. package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  177. package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
  178. package/dist/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  179. package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -349
  180. package/dist/node_modules/nodemailer/lib/shared/index.js +0 -688
  181. package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  182. package/dist/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  183. package/dist/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1825
  184. package/dist/node_modules/nodemailer/lib/smtp-transport/index.js +0 -416
  185. package/dist/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  186. package/dist/node_modules/nodemailer/lib/well-known/services.json +0 -343
  187. 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
- 'use strict';
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
- let service = services[key];
8
-
9
- normalized[normalizeKey(key)] = normalizeService(service);
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)] = normalizeService(service);
8
+ normalized[normalizeKey(alias)] = normalizedService;
13
9
  });
14
-
15
10
  [].concat(service.domains || []).forEach(domain => {
16
- normalized[normalizeKey(domain)] = normalizeService(service);
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
- let filter = ['domains', 'aliases'];
26
- let response = {};
27
-
18
+ const response = {};
28
19
  Object.keys(service).forEach(key => {
29
- if (filter.indexOf(key) < 0) {
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 {String} key [description]
42
- * @returns {Object} SMTP config or false if not found
30
+ * @param key Service name, alias or an email address
31
+ * @returns SMTP config or false if not found
43
32
  */
44
- module.exports = function (key) {
33
+ export default function wellKnown(key) {
45
34
  key = normalizeKey(key.split('@').pop());
46
35
  return normalized[key] || false;
47
- };
36
+ }
@@ -0,0 +1,2 @@
1
+ import type { WellKnownServiceDefinition } from './index.js';
2
+ export declare const services: Record<string, WellKnownServiceDefinition>;