@nocobase/plugin-workflow-mailer 2.4.0-alpha.1 → 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
@@ -0,0 +1,212 @@
1
+ import EventEmitter from 'node:events';
2
+ import * as packageData from '../package-info.js';
3
+ import * as shared from '../shared/index.js';
4
+ import * as errors from '../errors.js';
5
+ import LeWindows from '../mime-node/le-windows.js';
6
+ import MimeNode from '../mime-node/index.js';
7
+ /**
8
+ * Tags AWS SDK rejections that carry no `code` property (SDK v3 errors only
9
+ * have a `name`) with the generic SES transport error code, keeping the
10
+ * original error object intact
11
+ */
12
+ function tagSesError(err) {
13
+ if (err && typeof err === 'object' && !err.code) {
14
+ err.code = errors.ESES;
15
+ }
16
+ return err;
17
+ }
18
+ /**
19
+ * Generates a Transport object for AWS SES
20
+ *
21
+ * @constructor
22
+ * @param optional config parameter
23
+ */
24
+ class SESTransport extends EventEmitter {
25
+ constructor(options) {
26
+ super();
27
+ if (!options || !options.SES || !options.SES.sesClient) {
28
+ const error = new Error('Missing SES configuration, expecting { sesClient, SendEmailCommand } from @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/');
29
+ error.code = errors.ECONFIG;
30
+ throw error;
31
+ }
32
+ this.options = options;
33
+ this.ses = this.options.SES;
34
+ this.name = 'SESTransport';
35
+ this.version = packageData.version;
36
+ this.logger = shared.getLogger(this.options, {
37
+ component: this.options.component || 'ses-transport'
38
+ });
39
+ }
40
+ getRegion(cb) {
41
+ if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {
42
+ // Resolve the region provider. Use the two-argument form of then() so that a
43
+ // synchronous throw from cb is not recaught here and used to invoke cb a second time.
44
+ this.ses.sesClient.config.region().then(region => cb(null, region), err => cb(err));
45
+ return;
46
+ }
47
+ return cb(null, false);
48
+ }
49
+ /**
50
+ * Compiles a mailcomposer message and forwards it to SES
51
+ *
52
+ * @param mail MailComposer object
53
+ * @param callback Callback function to run when the sending is completed
54
+ */
55
+ send(mail, callback) {
56
+ // send() runs after the message was compiled, so mail.message is set
57
+ let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));
58
+ if (fromHeader) {
59
+ const mimeNode = new MimeNode('text/plain');
60
+ fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));
61
+ }
62
+ const envelope = mail.message.getEnvelope();
63
+ const messageId = mail.message.messageId();
64
+ const recipients = [].concat(envelope.to || []);
65
+ if (recipients.length > 3) {
66
+ recipients.push('...and ' + recipients.splice(2).length + ' more');
67
+ }
68
+ this.logger.info({
69
+ tnx: 'send',
70
+ messageId
71
+ }, 'Sending message %s to <%s>', messageId, recipients.join(', '));
72
+ const getRawMessage = (next) => {
73
+ // do not use Message-ID and Date in DKIM signature
74
+ if (!mail.data._dkim) {
75
+ mail.data._dkim = {};
76
+ }
77
+ if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {
78
+ mail.data._dkim.skipFields += ':date:message-id';
79
+ }
80
+ else {
81
+ mail.data._dkim.skipFields = 'date:message-id';
82
+ }
83
+ const sourceStream = mail.message.createReadStream();
84
+ const stream = sourceStream.pipe(new LeWindows());
85
+ const chunks = [];
86
+ let chunklen = 0;
87
+ stream.on('readable', () => {
88
+ let chunk;
89
+ while ((chunk = stream.read()) !== null) {
90
+ chunks.push(chunk);
91
+ chunklen += chunk.length;
92
+ }
93
+ });
94
+ sourceStream.once('error', err => stream.emit('error', err));
95
+ stream.once('error', err => next(err));
96
+ stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));
97
+ };
98
+ setImmediate(() => getRawMessage((err, raw) => {
99
+ if (err) {
100
+ this.logger.error({
101
+ err,
102
+ tnx: 'send',
103
+ messageId
104
+ }, 'Failed creating message for %s. %s', messageId, err.message);
105
+ return callback(err);
106
+ }
107
+ // mail.data.ses is caller supplied message data, so copy its own keys only
108
+ const sesMessage = shared.copyOwnKeys({
109
+ Content: {
110
+ Raw: {
111
+ // required
112
+ Data: raw // required
113
+ }
114
+ },
115
+ FromEmailAddress: fromHeader || envelope.from,
116
+ Destination: {
117
+ ToAddresses: envelope.to
118
+ }
119
+ }, mail.data.ses);
120
+ this.getRegion((err, region) => {
121
+ if (err || !region) {
122
+ region = 'us-east-1';
123
+ }
124
+ let sendPromise;
125
+ try {
126
+ // command construction or dispatch can throw synchronously on a
127
+ // misconfigured SDK; surface it as a single error callback instead
128
+ // of letting it escape into getRegion's promise chain
129
+ const command = new this.ses.SendEmailCommand(sesMessage);
130
+ sendPromise = this.ses.sesClient.send(command);
131
+ }
132
+ catch (err) {
133
+ tagSesError(err);
134
+ this.logger.error({
135
+ err,
136
+ tnx: 'send'
137
+ }, 'Send error for %s: %s', messageId, err.message);
138
+ setImmediate(() => callback(err));
139
+ return;
140
+ }
141
+ sendPromise
142
+ .then(data => {
143
+ if (region === 'us-east-1') {
144
+ region = 'email';
145
+ }
146
+ const info = {
147
+ envelope: {
148
+ from: envelope.from,
149
+ to: envelope.to
150
+ },
151
+ messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',
152
+ response: data.MessageId,
153
+ raw: raw
154
+ };
155
+ // invoke the callback outside the promise chain so a throw from it
156
+ // is not recaught by .catch() and used to call it a second time
157
+ setImmediate(() => callback(null, info));
158
+ })
159
+ .catch(err => {
160
+ tagSesError(err);
161
+ this.logger.error({
162
+ err,
163
+ tnx: 'send'
164
+ }, 'Send error for %s: %s', messageId, err.message);
165
+ setImmediate(() => callback(err));
166
+ });
167
+ });
168
+ }));
169
+ }
170
+ verify(callback) {
171
+ let promise;
172
+ if (!callback) {
173
+ promise = new Promise((resolve, reject) => {
174
+ callback = shared.callbackPromise(resolve, reject);
175
+ });
176
+ }
177
+ const done = callback;
178
+ const cb = (err) => {
179
+ if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {
180
+ return done(tagSesError(err));
181
+ }
182
+ return done(null, true);
183
+ };
184
+ const sesMessage = {
185
+ Content: {
186
+ Raw: {
187
+ Data: Buffer.from('From: <invalid@invalid>\r\nTo: <invalid@invalid>\r\n Subject: Invalid\r\n\r\nInvalid')
188
+ }
189
+ },
190
+ FromEmailAddress: 'invalid@invalid',
191
+ Destination: {
192
+ ToAddresses: ['invalid@invalid']
193
+ }
194
+ };
195
+ // the region value is not used for anything when verifying, but the lookup
196
+ // exercises the client configuration the same way as send() does
197
+ this.getRegion(() => {
198
+ let sendPromise;
199
+ try {
200
+ const command = new this.ses.SendEmailCommand(sesMessage);
201
+ sendPromise = this.ses.sesClient.send(command);
202
+ }
203
+ catch (err) {
204
+ setImmediate(() => cb(err));
205
+ return;
206
+ }
207
+ sendPromise.then(() => setImmediate(() => cb(null))).catch(err => setImmediate(() => cb(err)));
208
+ });
209
+ return promise;
210
+ }
211
+ }
212
+ export default SESTransport;
@@ -0,0 +1,260 @@
1
+ import { isProtoKey, copyOwnKeys } from './objects.js';
2
+ import os from 'node:os';
3
+ import type { Readable } from 'node:stream';
4
+ import type { OutgoingHttpHeaders } from 'node:http';
5
+ export { isProtoKey, copyOwnKeys };
6
+ /**
7
+ * Options for resolveHostname. The object is also handed to dns.Resolver, so its
8
+ * `timeout` and `tries` settings apply to the lookups
9
+ */
10
+ export interface ResolveHostnameOptions {
11
+ /** Hostname or IP address to resolve */
12
+ host?: string | undefined;
13
+ /** Server name for TLS, used as the host when no host is set */
14
+ servername?: string | undefined;
15
+ /** Count loopback interfaces when checking which address families are usable */
16
+ allowInternalNetworkInterfaces?: boolean | undefined;
17
+ /** How long a resolved value stays cached, in milliseconds (default 5 minutes) */
18
+ dnsTtl?: number | undefined;
19
+ /** Query timeout in milliseconds, passed to dns.Resolver */
20
+ timeout?: number | undefined;
21
+ /** Number of query attempts, passed to dns.Resolver */
22
+ tries?: number | undefined;
23
+ }
24
+ /**
25
+ * Resolved value handed to the resolveHostname callback
26
+ */
27
+ export interface ResolvedHostname {
28
+ /** Server name to use for TLS, false when an IP literal was given without one */
29
+ servername?: string | false | undefined;
30
+ /** Address to connect to, picked at random from the resolved addresses */
31
+ host?: string | null | undefined;
32
+ /** Whether the value came from the DNS cache */
33
+ cached?: boolean | undefined;
34
+ /** The resolver error when a cached value was used because of it */
35
+ error?: Error | undefined;
36
+ }
37
+ /** The name @types/nodemailer used for ResolvedHostname */
38
+ export type ResolveHostnameValue = ResolvedHostname;
39
+ /**
40
+ * Resolved addresses as stored in the DNS cache
41
+ */
42
+ export interface DnsCacheValue {
43
+ addresses: string[];
44
+ }
45
+ /**
46
+ * A DNS cache entry
47
+ */
48
+ export interface DnsCacheEntry {
49
+ value: DnsCacheValue;
50
+ /** Expiration time as a timestamp, entries without one never expire */
51
+ expires?: number | undefined;
52
+ }
53
+ /**
54
+ * Configuration object parsed from a connection url. Query parameters become
55
+ * top level keys, `tls.*` parameters go into `tls`
56
+ */
57
+ export interface ConnectionUrlOptions {
58
+ secure?: boolean | undefined;
59
+ direct?: boolean | undefined;
60
+ port?: number | undefined;
61
+ host?: string | undefined;
62
+ /** Well-known service name from the ?service= query parameter */
63
+ service?: string | undefined;
64
+ auth?: {
65
+ user: string;
66
+ pass: string;
67
+ } | undefined;
68
+ tls?: {
69
+ [key: string]: unknown;
70
+ } | undefined;
71
+ [key: string]: unknown;
72
+ }
73
+ /**
74
+ * Structured data attached to a log line. tnx, sid and cid drive the line prefix
75
+ * of the default console logger
76
+ */
77
+ export interface LogEntry {
78
+ /** 'server' or 'client' for SMTP transaction lines */
79
+ tnx?: string | undefined;
80
+ /** Session id */
81
+ sid?: string | undefined;
82
+ /** Connection id */
83
+ cid?: string | number | undefined;
84
+ level?: string | undefined;
85
+ [key: string]: any;
86
+ }
87
+ export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
88
+ /** The name @types/nodemailer used for LogLevel */
89
+ export type LoggerLevel = LogLevel;
90
+ /**
91
+ * A logger supplied by the caller, bunyan style. Any object works, a level it does not
92
+ * implement is routed to one it does, see _logFunc
93
+ */
94
+ export interface ExternalLogger {
95
+ trace?(...args: any[]): any;
96
+ debug?(...args: any[]): any;
97
+ info?(...args: any[]): any;
98
+ warn?(...args: any[]): any;
99
+ error?(...args: any[]): any;
100
+ fatal?(...args: any[]): any;
101
+ log?(...args: any[]): any;
102
+ [level: string]: any;
103
+ }
104
+ /**
105
+ * Options for getLogger
106
+ */
107
+ export interface GetLoggerOptions {
108
+ /** A bunyan compatible logger, true for the default console logger, false or unset for no logging */
109
+ logger?: ExternalLogger | boolean | undefined;
110
+ }
111
+ /**
112
+ * A bunyan style log method: a data object followed by a printf style message, or the
113
+ * message alone
114
+ */
115
+ export interface LogMethod {
116
+ (data: LogEntry | undefined, message?: string, ...args: any[]): void;
117
+ (message?: string, ...args: any[]): void;
118
+ }
119
+ /**
120
+ * The bunyan compatible logger interface returned by getLogger
121
+ */
122
+ export interface Logger {
123
+ trace: LogMethod;
124
+ debug: LogMethod;
125
+ info: LogMethod;
126
+ warn: LogMethod;
127
+ error: LogMethod;
128
+ fatal: LogMethod;
129
+ }
130
+ /**
131
+ * A parsed data URI
132
+ */
133
+ export interface ParsedDataURI {
134
+ /** Decoded payload */
135
+ data: Buffer;
136
+ /** 'base64', 'utf8' or 'utf-8' when the URI declared one, null otherwise */
137
+ encoding: string | null;
138
+ contentType: string;
139
+ /** Further `key=value` parameters from the metadata section */
140
+ params: {
141
+ [key: string]: string;
142
+ };
143
+ }
144
+ /**
145
+ * Access policy for resolveContent
146
+ */
147
+ export interface ResolveContentOptions {
148
+ /** Reject content that points to a file path */
149
+ disableFileAccess?: boolean | undefined;
150
+ /** Reject content that points to a URL */
151
+ disableUrlAccess?: boolean | undefined;
152
+ }
153
+ /**
154
+ * An object value resolveContent understands. A plain string or Buffer value is returned as
155
+ * is and a readable stream is read into a Buffer, an object carries the content in `content`
156
+ * or points to it with `path` or `href`
157
+ */
158
+ export interface ContentDescriptor {
159
+ /** The content itself, a string, a Buffer or a readable stream */
160
+ content?: string | Buffer | Readable | undefined;
161
+ /** Encoding of a string `content`, it is decoded into a Buffer unless it is utf8 or ascii */
162
+ encoding?: string | undefined;
163
+ /** File path, http(s) URL or data URI to read the content from */
164
+ path?: string | undefined;
165
+ /** URL to fetch the content from */
166
+ href?: string | undefined;
167
+ /** Request headers for a URL fetch */
168
+ httpHeaders?: OutgoingHttpHeaders | undefined;
169
+ /** TLS settings for a URL fetch, see nmfetch */
170
+ tls?: {
171
+ [key: string]: any;
172
+ } | undefined;
173
+ }
174
+ export type ResolveContentCallback = (err: Error | null, value?: any) => void;
175
+ export declare let networkInterfaces: NodeJS.Dict<os.NetworkInterfaceInfo[]> | undefined;
176
+ export declare const dnsCache: Map<string, DnsCacheEntry>;
177
+ export declare const resolveHostname: (options: ResolveHostnameOptions | undefined, callback: (err: Error | null, result?: ResolvedHostname) => void) => void;
178
+ /**
179
+ * Parses connection url to a structured configuration object
180
+ *
181
+ * @param str Connection url
182
+ * @return Configuration object
183
+ */
184
+ export declare const parseConnectionUrl: (str?: string | null) => ConnectionUrlOptions;
185
+ /**
186
+ * Returns a bunyan-compatible logger interface. Uses either provided logger or
187
+ * creates a default console logger
188
+ *
189
+ * @param [options] Options object that might include 'logger' value
190
+ * @param [defaults] Fields merged into every log entry, overridden by the fields of the entry itself
191
+ * @return bunyan compatible logger
192
+ */
193
+ export declare const getLogger: (options?: GetLoggerOptions, defaults?: LogEntry) => Logger;
194
+ /**
195
+ * Wrapper for creating a callback that either resolves or rejects a promise
196
+ * based on input
197
+ *
198
+ * @param resolve Function to run if callback is called
199
+ * @param reject Function to run if callback ends with an error
200
+ */
201
+ export declare const callbackPromise: (resolve: (...args: any[]) => void, reject: (reason?: any) => void) => (...args: any[]) => void;
202
+ export declare const parseDataURI: (uri: unknown) => ParsedDataURI | null;
203
+ /**
204
+ * Resolves a String or a Buffer value for content value. Useful if the value
205
+ * is a Stream or a file or an URL. If the value is a Stream, overwrites
206
+ * the stream object with the resolved value (you can't stream a value twice).
207
+ *
208
+ * This is useful when you want to create a plugin that needs a content value,
209
+ * for example the `html` or `text` value as a String or a Buffer but not as
210
+ * a file path or an URL.
211
+ *
212
+ * @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
213
+ * @param key Property name or an Array index
214
+ * @param callback Callback function with (err, value)
215
+ */
216
+ export declare function resolveContent(data: {
217
+ [key: string]: any;
218
+ }, key: string | number, callback: ResolveContentCallback): void;
219
+ /**
220
+ * Resolves a String or a Buffer value for content value
221
+ *
222
+ * @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
223
+ * @param key Property name or an Array index
224
+ * @param options Access policy: { disableFileAccess, disableUrlAccess }
225
+ * @param callback Callback function with (err, value)
226
+ */
227
+ export declare function resolveContent(data: {
228
+ [key: string]: any;
229
+ }, key: string | number, options: ResolveContentOptions | false | undefined, callback: ResolveContentCallback): void;
230
+ /**
231
+ * Resolves a String or a Buffer value for content value
232
+ *
233
+ * @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
234
+ * @param key Property name or an Array index
235
+ * @param [options] Optional access policy: { disableFileAccess, disableUrlAccess }
236
+ * @returns Promise that resolves with the value
237
+ */
238
+ export declare function resolveContent(data: {
239
+ [key: string]: any;
240
+ }, key: string | number, options?: ResolveContentOptions | false): Promise<any>;
241
+ /**
242
+ * Resolves a String or a Buffer value for content value
243
+ *
244
+ * @param data An object or an Array you want to resolve an element for, see ContentDescriptor for the values it understands
245
+ * @param key Property name or an Array index
246
+ * @param options Access policy: { disableFileAccess, disableUrlAccess }
247
+ * @param callback Callback function with (err, value), a Promise is returned if not set
248
+ */
249
+ export declare function resolveContent(data: {
250
+ [key: string]: any;
251
+ }, key: string | number, options: ResolveContentOptions | false | undefined, callback: ResolveContentCallback | undefined): Promise<any> | void;
252
+ /**
253
+ * Copies properties from source objects to target objects
254
+ */
255
+ export declare const assign: (...args: ({
256
+ [key: string]: any;
257
+ } | false | null | undefined)[]) => {
258
+ [key: string]: any;
259
+ };
260
+ export declare const encodeXText: (str: string) => string;