@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.
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
@@ -1,94 +1,77 @@
1
- 'use strict';
2
-
3
- const EventEmitter = require('events');
4
- const shared = require('../shared');
5
- const mimeTypes = require('../mime-funcs/mime-types');
6
- const MailComposer = require('../mail-composer');
7
- const DKIM = require('../dkim');
8
- const httpProxyClient = require('../smtp-connection/http-proxy-client');
9
- const util = require('util');
10
- const urllib = require('url');
11
- const packageData = require('../../package.json');
12
- const MailMessage = require('./mail-message');
13
- const net = require('net');
14
- const dns = require('dns');
15
- const crypto = require('crypto');
16
-
1
+ import { EventEmitter } from 'node:events';
2
+ import * as shared from '../shared/index.js';
3
+ import * as mimeTypes from '../mime-funcs/mime-types.js';
4
+ import MailComposer from '../mail-composer/index.js';
5
+ import DKIM from '../dkim/index.js';
6
+ import httpProxyClient from '../smtp-connection/http-proxy-client.js';
7
+ import * as errors from '../errors.js';
8
+ import util from 'node:util';
9
+ import * as urllib from '../shared/url.js';
10
+ import * as packageData from '../package-info.js';
11
+ import MailMessage from './mail-message.js';
12
+ import net from 'node:net';
13
+ import dns from 'node:dns';
14
+ import crypto from 'node:crypto';
15
+ /**
16
+ * Recipients allowed on one message unless the caller sets its own maxRecipients. A backstop
17
+ * against a runaway or hostile recipient list rather than a delivery policy: RFC 5321 only
18
+ * asks a server to accept 100, so a real send is bounded far below this.
19
+ */
20
+ const DEFAULT_MAX_RECIPIENTS = 100000;
17
21
  /**
18
22
  * Creates an object for exposing the Mail API
19
23
  *
20
24
  * @constructor
21
- * @param {Object} transporter Transport object instance to pass the mails to
25
+ * @param transporter Transport object instance to pass the mails to
22
26
  */
23
27
  class Mail extends EventEmitter {
24
28
  constructor(transporter, options, defaults) {
25
29
  super();
26
-
27
30
  this.options = options || {};
28
31
  this._defaults = defaults || {};
29
-
30
32
  this._defaultPlugins = {
31
33
  compile: [(...args) => this._convertDataImages(...args)],
32
34
  stream: []
33
35
  };
34
-
35
36
  this._userPlugins = {
36
37
  compile: [],
37
38
  stream: []
38
39
  };
39
-
40
40
  this.meta = new Map();
41
-
42
41
  this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;
43
-
44
42
  this.transporter = transporter;
45
43
  this.transporter.mailer = this;
46
-
47
44
  this.logger = shared.getLogger(this.options, {
48
45
  component: this.options.component || 'mail'
49
46
  });
50
-
51
- this.logger.debug(
52
- {
53
- tnx: 'create'
54
- },
55
- 'Creating transport: %s',
56
- this.getVersionString()
57
- );
58
-
47
+ this.logger.debug({
48
+ tnx: 'create'
49
+ }, 'Creating transport: %s', this.getVersionString());
59
50
  // setup emit handlers for the transporter
60
51
  if (typeof this.transporter.on === 'function') {
61
52
  // deprecated log interface
62
53
  this.transporter.on('log', log => {
63
- this.logger.debug(
64
- {
65
- tnx: 'transport'
66
- },
67
- '%s: %s',
68
- log.type,
69
- log.message
70
- );
54
+ this.logger.debug({
55
+ tnx: 'transport'
56
+ }, '%s: %s', log.type, log.message);
71
57
  });
72
-
73
58
  // transporter errors
74
59
  this.transporter.on('error', err => {
75
- this.logger.error(
76
- {
77
- err,
78
- tnx: 'transport'
79
- },
80
- 'Transport Error: %s',
81
- err.message
82
- );
60
+ this.logger.error({
61
+ err,
62
+ tnx: 'transport'
63
+ }, 'Transport Error: %s', err.message);
83
64
  this.emit('error', err);
84
65
  });
85
-
86
66
  // indicates if the sender has became idle
87
67
  this.transporter.on('idle', (...args) => {
88
68
  this.emit('idle', ...args);
89
69
  });
70
+ // indicates if the sender has became idle and all connections are terminated
71
+ this.transporter.on('clear', (...args) => {
72
+ this.emit('clear', ...args);
73
+ });
90
74
  }
91
-
92
75
  /**
93
76
  * Optional methods passed to the underlying transport object
94
77
  */
@@ -100,186 +83,155 @@ class Mail extends EventEmitter {
100
83
  this.getSocket = false;
101
84
  }
102
85
  return this.transporter[method](...args);
103
- } else {
104
- this.logger.warn(
105
- {
106
- tnx: 'transport',
107
- methodName: method
108
- },
109
- 'Non existing method %s called for transport',
110
- method
111
- );
112
- return false;
113
86
  }
87
+ this.logger.warn({
88
+ tnx: 'transport',
89
+ methodName: method
90
+ }, 'Non existing method %s called for transport', method);
91
+ return false;
114
92
  };
115
93
  });
116
-
117
94
  // setup proxy handling
118
95
  if (this.options.proxy && typeof this.options.proxy === 'string') {
119
96
  this.setupProxy(this.options.proxy);
120
97
  }
121
98
  }
122
-
123
99
  use(step, plugin) {
124
100
  step = (step || '').toString();
125
101
  if (!this._userPlugins.hasOwnProperty(step)) {
126
102
  this._userPlugins[step] = [plugin];
127
- } else {
103
+ }
104
+ else {
128
105
  this._userPlugins[step].push(plugin);
129
106
  }
130
-
131
107
  return this;
132
108
  }
133
-
134
- /**
135
- * Sends an email using the preselected transport object
136
- *
137
- * @param {Object} data E-data description
138
- * @param {Function?} callback Callback to run once the sending succeeded or failed
139
- */
140
109
  sendMail(data, callback = null) {
141
110
  let promise;
142
-
143
111
  if (!callback) {
144
112
  promise = new Promise((resolve, reject) => {
145
113
  callback = shared.callbackPromise(resolve, reject);
146
114
  });
147
115
  }
148
-
116
+ const done = callback;
149
117
  if (typeof this.getSocket === 'function') {
150
118
  this.transporter.getSocket = this.getSocket;
151
119
  this.getSocket = false;
152
120
  }
153
-
154
- let mail = new MailMessage(this, data);
155
-
156
- this.logger.debug(
157
- {
158
- tnx: 'transport',
159
- name: this.transporter.name,
160
- version: this.transporter.version,
161
- action: 'send'
162
- },
163
- 'Sending mail using %s/%s',
164
- this.transporter.name,
165
- this.transporter.version
166
- );
167
-
121
+ const mail = new MailMessage(this, data);
122
+ this.logger.debug({
123
+ tnx: 'transport',
124
+ name: this.transporter.name,
125
+ version: this.transporter.version,
126
+ action: 'send'
127
+ }, 'Sending mail using %s/%s', this.transporter.name, this.transporter.version);
168
128
  this._processPlugins('compile', mail, err => {
169
129
  if (err) {
170
- this.logger.error(
171
- {
172
- err,
173
- tnx: 'plugin',
174
- action: 'compile'
175
- },
176
- 'PluginCompile Error: %s',
177
- err.message
178
- );
179
- return callback(err);
130
+ this.logger.error({
131
+ err,
132
+ tnx: 'plugin',
133
+ action: 'compile'
134
+ }, 'PluginCompile Error: %s', err.message);
135
+ return done(err);
136
+ }
137
+ let recipientCount;
138
+ try {
139
+ mail.message = new MailComposer(mail.data).compile();
140
+ mail.setMailerHeader();
141
+ mail.setPriorityHeaders();
142
+ mail.setListHeaders();
143
+ recipientCount = mail.message.getEnvelope().to.length;
144
+ }
145
+ catch (err) {
146
+ // message data can throw while it is compiled, the error belongs to the callback
147
+ this.logger.error({
148
+ err,
149
+ tnx: 'transport',
150
+ action: 'send'
151
+ }, 'Compile Error: %s', err.message);
152
+ return done(err);
153
+ }
154
+ const maxRecipients = mail.data.maxRecipients === undefined ? DEFAULT_MAX_RECIPIENTS : mail.data.maxRecipients;
155
+ if (maxRecipients && recipientCount > maxRecipients) {
156
+ const err = new Error(`Message has ${recipientCount} recipients, which is over the ${maxRecipients} allowed by maxRecipients`);
157
+ err.code = errors.EMAXRECIPIENTS;
158
+ this.logger.error({
159
+ err,
160
+ tnx: 'transport',
161
+ action: 'send'
162
+ }, 'Send Error: %s', err.message);
163
+ return done(err);
180
164
  }
181
-
182
- mail.message = new MailComposer(mail.data).compile();
183
-
184
- mail.setMailerHeader();
185
- mail.setPriorityHeaders();
186
- mail.setListHeaders();
187
-
188
165
  this._processPlugins('stream', mail, err => {
189
166
  if (err) {
190
- this.logger.error(
191
- {
192
- err,
193
- tnx: 'plugin',
194
- action: 'stream'
195
- },
196
- 'PluginStream Error: %s',
197
- err.message
198
- );
199
- return callback(err);
167
+ this.logger.error({
168
+ err,
169
+ tnx: 'plugin',
170
+ action: 'stream'
171
+ }, 'PluginStream Error: %s', err.message);
172
+ return done(err);
200
173
  }
201
-
202
174
  if (mail.data.dkim || this.dkim) {
203
175
  mail.message.processFunc(input => {
204
- let dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;
205
- this.logger.debug(
206
- {
207
- tnx: 'DKIM',
208
- messageId: mail.message.messageId(),
209
- dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')
210
- },
211
- 'Signing outgoing message with %s keys',
212
- dkim.keys.length
213
- );
176
+ const dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;
177
+ this.logger.debug({
178
+ tnx: 'DKIM',
179
+ messageId: mail.message.messageId(),
180
+ dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')
181
+ }, 'Signing outgoing message with %s keys', dkim.keys.length);
214
182
  return dkim.sign(input, mail.data._dkim);
215
183
  });
216
184
  }
217
-
218
185
  this.transporter.send(mail, (...args) => {
219
186
  if (args[0]) {
220
- this.logger.error(
221
- {
222
- err: args[0],
223
- tnx: 'transport',
224
- action: 'send'
225
- },
226
- 'Send Error: %s',
227
- args[0].message
228
- );
187
+ this.logger.error({
188
+ err: args[0],
189
+ tnx: 'transport',
190
+ action: 'send'
191
+ }, 'Send Error: %s', args[0].message);
229
192
  }
230
- callback(...args);
193
+ done(...args);
231
194
  });
232
195
  });
233
196
  });
234
-
235
197
  return promise;
236
198
  }
237
-
238
199
  getVersionString() {
239
200
  return util.format('%s (%s; +%s; %s/%s)', packageData.name, packageData.version, packageData.homepage, this.transporter.name, this.transporter.version);
240
201
  }
241
-
202
+ /** @internal */
242
203
  _processPlugins(step, mail, callback) {
243
204
  step = (step || '').toString();
244
-
245
205
  if (!this._userPlugins.hasOwnProperty(step)) {
246
206
  return callback();
247
207
  }
248
-
249
- let userPlugins = this._userPlugins[step] || [];
250
- let defaultPlugins = this._defaultPlugins[step] || [];
251
-
208
+ const userPlugins = this._userPlugins[step] || [];
209
+ const defaultPlugins = this._defaultPlugins[step] || [];
252
210
  if (userPlugins.length) {
253
- this.logger.debug(
254
- {
255
- tnx: 'transaction',
256
- pluginCount: userPlugins.length,
257
- step
258
- },
259
- 'Using %s plugins for %s',
260
- userPlugins.length,
211
+ this.logger.debug({
212
+ tnx: 'transaction',
213
+ pluginCount: userPlugins.length,
261
214
  step
262
- );
215
+ }, 'Using %s plugins for %s', userPlugins.length, step);
263
216
  }
264
-
265
217
  if (userPlugins.length + defaultPlugins.length === 0) {
266
218
  return callback();
267
219
  }
268
-
269
220
  let pos = 0;
270
221
  let block = 'default';
271
- let processPlugins = () => {
222
+ const processPlugins = () => {
272
223
  let curplugins = block === 'default' ? defaultPlugins : userPlugins;
273
224
  if (pos >= curplugins.length) {
274
225
  if (block === 'default' && userPlugins.length) {
275
226
  block = 'user';
276
227
  pos = 0;
277
228
  curplugins = userPlugins;
278
- } else {
229
+ }
230
+ else {
279
231
  return callback();
280
232
  }
281
233
  }
282
- let plugin = curplugins[pos++];
234
+ const plugin = curplugins[pos++];
283
235
  plugin(mail, err => {
284
236
  if (err) {
285
237
  return callback(err);
@@ -287,31 +239,26 @@ class Mail extends EventEmitter {
287
239
  processPlugins();
288
240
  });
289
241
  };
290
-
291
242
  processPlugins();
292
243
  }
293
-
294
244
  /**
295
245
  * Sets up proxy handler for a Nodemailer object
296
246
  *
297
- * @param {String} proxyUrl Proxy configuration url
247
+ * @param proxyUrl Proxy configuration url
298
248
  */
299
249
  setupProxy(proxyUrl) {
300
- let proxy = urllib.parse(proxyUrl);
301
-
250
+ const proxy = urllib.parse(proxyUrl);
302
251
  // setup socket handler for the mailer object
303
252
  this.getSocket = (options, callback) => {
304
- let protocol = proxy.protocol.replace(/:$/, '').toLowerCase();
305
-
253
+ const protocol = proxy.protocol.replace(/:$/, '').toLowerCase();
306
254
  if (this.meta.has('proxy_handler_' + protocol)) {
307
255
  return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);
308
256
  }
309
-
310
257
  switch (protocol) {
311
258
  // Connect using a HTTP CONNECT method
312
259
  case 'http':
313
260
  case 'https':
314
- httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {
261
+ httpProxyClient(proxy.href, options.port, options.host, this.options.tls || {}, (err, socket) => {
315
262
  if (err) {
316
263
  return callback(err);
317
264
  }
@@ -325,13 +272,15 @@ class Mail extends EventEmitter {
325
272
  case 'socks4':
326
273
  case 'socks4a': {
327
274
  if (!this.meta.has('proxy_socks_module')) {
328
- return callback(new Error('Socks module not loaded'));
275
+ let err = new Error('Socks module not loaded');
276
+ err.code = errors.EPROXY;
277
+ return callback(err);
329
278
  }
330
- let connect = ipaddress => {
331
- let proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;
332
- let socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');
333
- let proxyType = Number(proxy.protocol.replace(/\D/g, '')) || 5;
334
- let connectionOpts = {
279
+ const connect = (ipaddress) => {
280
+ const proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;
281
+ const socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');
282
+ const proxyType = Number(proxy.protocol.replace(/\D/g, '')) || 5;
283
+ const connectionOpts = {
335
284
  proxy: {
336
285
  ipaddress,
337
286
  port: Number(proxy.port),
@@ -343,23 +292,23 @@ class Mail extends EventEmitter {
343
292
  },
344
293
  command: 'connect'
345
294
  };
346
-
347
- if (proxy.auth) {
348
- let username = decodeURIComponent(proxy.auth.split(':').shift());
349
- let password = decodeURIComponent(proxy.auth.split(':').pop());
295
+ if (proxy.username || proxy.password) {
296
+ const username = proxy.username || '';
297
+ const password = proxy.password || '';
350
298
  if (proxyV2) {
351
299
  connectionOpts.proxy.userId = username;
352
300
  connectionOpts.proxy.password = password;
353
- } else if (proxyType === 4) {
301
+ }
302
+ else if (proxyType === 4) {
354
303
  connectionOpts.userid = username;
355
- } else {
304
+ }
305
+ else {
356
306
  connectionOpts.authentication = {
357
307
  username,
358
308
  password
359
309
  };
360
310
  }
361
311
  }
362
-
363
312
  socksClient.createConnection(connectionOpts, (err, info) => {
364
313
  if (err) {
365
314
  return callback(err);
@@ -369,11 +318,9 @@ class Mail extends EventEmitter {
369
318
  });
370
319
  });
371
320
  };
372
-
373
321
  if (net.isIP(proxy.hostname)) {
374
322
  return connect(proxy.hostname);
375
323
  }
376
-
377
324
  return dns.resolve(proxy.hostname, (err, address) => {
378
325
  if (err) {
379
326
  return callback(err);
@@ -382,15 +329,17 @@ class Mail extends EventEmitter {
382
329
  });
383
330
  }
384
331
  }
385
- callback(new Error('Unknown proxy configuration'));
332
+ let err = new Error('Unknown proxy configuration');
333
+ err.code = errors.EPROXY;
334
+ callback(err);
386
335
  };
387
336
  }
388
-
337
+ /** @internal */
389
338
  _convertDataImages(mail, callback) {
390
339
  if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {
391
340
  return callback();
392
341
  }
393
- mail.resolveContent(mail.data, 'html', (err, html) => {
342
+ mail.resolveContent(mail.data, 'html', { disableFileAccess: mail.data.disableFileAccess, disableUrlAccess: mail.data.disableUrlAccess }, (err, html) => {
394
343
  if (err) {
395
344
  return callback(err);
396
345
  }
@@ -398,32 +347,29 @@ class Mail extends EventEmitter {
398
347
  html = (html || '')
399
348
  .toString()
400
349
  .replace(/(<img\b[^<>]{0,1024} src\s{0,20}=[\s"']{0,20})(data:([^;]+);[^"'>\s]+)/gi, (match, prefix, dataUri, mimeType) => {
401
- let cid = crypto.randomBytes(10).toString('hex') + '@localhost';
402
- if (!mail.data.attachments) {
403
- mail.data.attachments = [];
404
- }
405
- if (!Array.isArray(mail.data.attachments)) {
406
- mail.data.attachments = [].concat(mail.data.attachments || []);
407
- }
408
- mail.data.attachments.push({
409
- path: dataUri,
410
- cid,
411
- filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)
412
- });
413
- return prefix + 'cid:' + cid;
350
+ const cid = crypto.randomBytes(10).toString('hex') + '@localhost';
351
+ if (!mail.data.attachments) {
352
+ mail.data.attachments = [];
353
+ }
354
+ if (!Array.isArray(mail.data.attachments)) {
355
+ mail.data.attachments = [].concat(mail.data.attachments || []);
356
+ }
357
+ mail.data.attachments.push({
358
+ path: dataUri,
359
+ cid,
360
+ filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)
414
361
  });
362
+ return prefix + 'cid:' + cid;
363
+ });
415
364
  mail.data.html = html;
416
365
  callback();
417
366
  });
418
367
  }
419
-
420
368
  set(key, value) {
421
369
  return this.meta.set(key, value);
422
370
  }
423
-
424
371
  get(key) {
425
372
  return this.meta.get(key);
426
373
  }
427
374
  }
428
-
429
- module.exports = Mail;
375
+ export default Mail;
@@ -0,0 +1,97 @@
1
+ import MimeNode, { type MimeNodePreparedHeaderValue } from '../mime-node/index.js';
2
+ import type { MailComposerOptions } from '../mail-composer/index.js';
3
+ import type { DKIMOptions } from '../dkim/index.js';
4
+ import type { SMTPEnvelopeDsn } from '../smtp-connection/index.js';
5
+ import type { SMTPTransportAuthOptions } from '../smtp-transport/index.js';
6
+ import type { SESSendEmailRequest } from '../ses-transport/index.js';
7
+ import type { NodemailerError } from '../errors.js';
8
+ import type { ResolveContentOptions } from '../shared/index.js';
9
+ import type Mail from './index.js';
10
+ import type { SentMessageInfo } from './index.js';
11
+ /**
12
+ * The message data accepted by sendMail. MailComposerOptions describes the fields the MIME
13
+ * tree is built from, the fields below are the ones the mailer reads on top of those
14
+ */
15
+ export interface SendMailOptions extends MailComposerOptions {
16
+ /** DKIM signing options for this message, used instead of the ones of the transporter */
17
+ dkim?: DKIMOptions | undefined;
18
+ /** Extra DKIM options for this message, merged over the options of the signer. The SES transport sets skipFields here, the option is not meant for callers */
19
+ _dkim?: DKIMOptions | undefined;
20
+ /** Recipients allowed on this message, 0 disables the limit, defaults to 100000 */
21
+ maxRecipients?: number | undefined;
22
+ /** SMTP transports: DSN parameters for the envelope, sent when the server supports the DSN extension */
23
+ dsn?: SMTPEnvelopeDsn | undefined;
24
+ /** SMTP transports: RFC 8689, send the REQUIRETLS parameter with MAIL FROM */
25
+ requireTLSExtensionEnabled?: boolean | undefined;
26
+ /** SMTP transports: per-message authentication settings, used instead of the transport level auth */
27
+ auth?: SMTPTransportAuthOptions | undefined;
28
+ /** SES transport: extra SendEmailCommand parameters merged into the API call */
29
+ ses?: SESSendEmailRequest | undefined;
30
+ }
31
+ /**
32
+ * Default message fields, the third argument of createTransport. Applied to every message
33
+ * for the fields the message does not set itself, the headers are merged one by one
34
+ */
35
+ export type MailDefaults = SendMailOptions;
36
+ /**
37
+ * The message data as held by a MailMessage: the options the caller passed to sendMail with
38
+ * the transporter defaults applied. resolveAll rewrites the content and address fields in
39
+ * place and normalize adds the envelope, the Message-ID and the normalized headers
40
+ */
41
+ export interface MailMessageData extends SendMailOptions {
42
+ /** Header values flattened to strings and keyed by lowercase header name, set by normalize */
43
+ normalizedHeaders?: {
44
+ [key: string]: string;
45
+ } | undefined;
46
+ }
47
+ /**
48
+ * Callback for resolveAll and normalize, receives the message data with every content value
49
+ * resolved
50
+ */
51
+ export type MailMessageDataCallback = (err: NodemailerError | null, data: MailMessageData) => void;
52
+ /**
53
+ * Callback for resolveContent, receives the resolved content value
54
+ */
55
+ export type MailMessageContentCallback = (err: NodemailerError | null, value?: any) => void;
56
+ /**
57
+ * A single prepared List-* header value, emitted as is
58
+ */
59
+ export interface MailMessageListHeaderValue extends MimeNodePreparedHeaderValue {
60
+ prepared: boolean;
61
+ foldLines: boolean;
62
+ value: string;
63
+ }
64
+ /**
65
+ * A List-* header as built from the list value, one prepared value per list entry
66
+ */
67
+ export interface MailMessageListHeader {
68
+ /** Header key, 'list-' followed by the lowercase list key */
69
+ key: string;
70
+ value: MailMessageListHeaderValue[];
71
+ }
72
+ export default class MailMessage<T = SentMessageInfo> {
73
+ mailer: Mail<T>;
74
+ data: MailMessageData;
75
+ /**
76
+ * The compiled MIME tree. Set once the compile step is done, so it is null while the
77
+ * 'compile' plugins run and set by the time the 'stream' plugins and the transport see
78
+ * the message. Declared as always set, the way @types/nodemailer declared it, since the
79
+ * plugins that read it are the ones that run after it is set
80
+ */
81
+ message: MimeNode;
82
+ constructor(mailer: Mail<T>, data?: SendMailOptions);
83
+ resolveContent(data: {
84
+ [key: string]: any;
85
+ }, key: string | number, callback: MailMessageContentCallback): void;
86
+ resolveContent(data: {
87
+ [key: string]: any;
88
+ }, key: string | number, options: ResolveContentOptions | false | undefined, callback: MailMessageContentCallback): void;
89
+ resolveContent(data: {
90
+ [key: string]: any;
91
+ }, key: string | number, options?: ResolveContentOptions | false): Promise<any>;
92
+ resolveAll(callback: MailMessageDataCallback): void;
93
+ normalize(callback: MailMessageDataCallback): void;
94
+ setMailerHeader(): void;
95
+ setPriorityHeaders(): void;
96
+ setListHeaders(): void;
97
+ }