@nocobase/plugin-workflow-mailer 2.2.20 → 2.2.21

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 (173) hide show
  1. package/dist/externalVersion.js +6 -6
  2. package/dist/node_modules/joi/package.json +1 -1
  3. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
  4. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
  5. package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
  6. package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
  7. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
  8. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
  9. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
  10. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
  11. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
  12. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
  13. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
  14. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
  15. package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
  16. package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
  17. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
  18. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
  19. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
  20. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
  21. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
  22. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
  23. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
  24. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
  25. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
  26. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
  27. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
  28. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
  29. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
  30. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
  31. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
  32. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
  33. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
  34. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
  35. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
  36. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
  37. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
  38. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
  39. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
  40. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
  41. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
  42. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
  43. package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
  44. package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
  45. package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
  46. package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
  47. package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +62 -111
  48. package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
  49. package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
  50. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
  51. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
  52. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
  53. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
  54. package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
  55. package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
  56. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
  57. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
  58. package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
  59. package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
  60. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
  61. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
  62. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
  63. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
  64. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
  65. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
  66. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
  67. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
  68. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
  69. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
  70. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
  71. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
  72. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
  73. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
  74. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
  75. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
  76. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
  77. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
  78. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
  79. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
  80. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
  81. package/dist/node_modules/nodemailer/{lib → dist/esm}/addressparser/index.js +361 -131
  82. package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
  83. package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +31 -56
  84. package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
  85. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +49 -78
  86. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
  87. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/message-parser.js +64 -42
  88. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
  89. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
  90. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
  91. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/sign.js +50 -46
  92. package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
  93. package/dist/node_modules/nodemailer/{lib → dist/esm}/errors.js +26 -18
  94. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
  95. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
  96. package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
  97. package/dist/node_modules/nodemailer/{lib → dist/esm}/fetch/index.js +80 -147
  98. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
  99. package/dist/node_modules/nodemailer/{lib → dist/esm}/json-transport/index.js +19 -39
  100. package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
  101. package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +199 -265
  102. package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
  103. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +128 -234
  104. package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
  105. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +62 -114
  106. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
  107. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
  108. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
  109. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +29 -42
  110. package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
  111. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +259 -372
  112. package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
  113. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
  114. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
  115. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +6 -11
  116. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
  117. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -13
  118. package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
  119. package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
  120. package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
  121. package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
  122. package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
  123. package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
  124. package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
  125. package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
  126. package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +38 -67
  127. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
  128. package/dist/node_modules/nodemailer/{lib → dist/esm}/sendmail-transport/index.js +51 -101
  129. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
  130. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
  131. package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
  132. package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/index.js +156 -272
  133. package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
  134. package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/objects.js +13 -17
  135. package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
  136. package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
  137. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
  138. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
  139. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
  140. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/http-proxy-client.js +49 -74
  141. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
  142. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/index.js +574 -794
  143. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
  144. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +172 -284
  145. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
  146. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +57 -97
  147. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
  148. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-transport/index.js +81 -179
  149. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
  150. package/dist/node_modules/nodemailer/{lib → dist/esm}/stream-transport/index.js +36 -74
  151. package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
  152. package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +5 -16
  153. package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
  154. package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
  155. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
  156. package/dist/node_modules/nodemailer/{lib → dist/esm}/xoauth2/index.js +125 -187
  157. package/dist/node_modules/nodemailer/{lib → dist}/well-known/services.json +9 -2
  158. package/dist/node_modules/nodemailer/package.json +1 -1
  159. package/package.json +3 -3
  160. package/dist/node_modules/nodemailer/.gitattributes +0 -6
  161. package/dist/node_modules/nodemailer/.ncurc.js +0 -9
  162. package/dist/node_modules/nodemailer/.prettierignore +0 -8
  163. package/dist/node_modules/nodemailer/.prettierrc +0 -12
  164. package/dist/node_modules/nodemailer/.prettierrc.js +0 -10
  165. package/dist/node_modules/nodemailer/.release-please-config.json +0 -9
  166. package/dist/node_modules/nodemailer/eslint.config.js +0 -88
  167. package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  168. package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -276
  169. package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -671
  170. package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
  171. package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -266
  172. package/dist/node_modules/nodemailer/lib/shared/url.js +0 -151
  173. package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -105
@@ -0,0 +1,69 @@
1
+ import type { Logger } from '../shared/index.js';
2
+ import type { MimeNodeEnvelope } from '../mime-node/index.js';
3
+ import type MailMessage from '../mailer/mail-message.js';
4
+ import type { default as Mail, SentMessageInfo, SendMailOptions, TransportOptions } from '../mailer/index.js';
5
+ /**
6
+ * Options for the Sendmail transport
7
+ */
8
+ export interface SendmailTransportOptions extends TransportOptions {
9
+ /** Selects this transport in createTransport, the binary itself is set with `path` */
10
+ sendmail?: boolean | string | undefined;
11
+ /** Path to the sendmail binary, defaults to 'sendmail' */
12
+ path?: string | undefined;
13
+ /** Either 'windows' or 'unix', the line ending of the message piped to sendmail */
14
+ newline?: string | undefined;
15
+ /** Arguments for the sendmail binary, replaces the default '-f <sender>' */
16
+ args?: string[] | undefined;
17
+ }
18
+ /**
19
+ * The value the Sendmail transport hands to the send callback
20
+ */
21
+ export interface SendmailSentMessageInfo extends SentMessageInfo {
22
+ /** The envelope the message was sent with */
23
+ envelope: MimeNodeEnvelope;
24
+ /** Message-ID value of the message */
25
+ messageId: string;
26
+ /** Always 'Messages queued for delivery' */
27
+ response: string;
28
+ }
29
+ /**
30
+ * Generates a Transport object for Sendmail
31
+ *
32
+ * Possible options can be the following:
33
+ *
34
+ * * **path** optional path to sendmail binary
35
+ * * **newline** either 'windows' or 'unix'
36
+ * * **args** an array of arguments for the sendmail binary
37
+ *
38
+ * @constructor
39
+ * @param optional config parameter for Sendmail
40
+ */
41
+ declare class SendmailTransport {
42
+ mailer: Mail<SendmailSentMessageInfo>;
43
+ options: SendmailTransportOptions;
44
+ name: string;
45
+ version: string;
46
+ path: string;
47
+ args: string[] | false;
48
+ logger: Logger;
49
+ winbreak: boolean;
50
+ constructor(options?: SendmailTransportOptions | string);
51
+ /**
52
+ * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
53
+ *
54
+ * @param mail MailComposer object
55
+ * @param done Callback function to run when the sending is completed
56
+ */
57
+ send(mail: MailMessage<SendmailSentMessageInfo>, done: (err: Error | null, info?: SendmailSentMessageInfo) => void): void;
58
+ }
59
+ /**
60
+ * Type aliases in the layout of @types/nodemailer, so `SendmailTransport.Options` style references keep working
61
+ */
62
+ declare namespace SendmailTransport {
63
+ type Options = SendmailTransportOptions;
64
+ type MailOptions = SendMailOptions;
65
+ type SentMessageInfo = SendmailSentMessageInfo;
66
+ }
67
+ /** The same aliases as module level exports, for `import * as SendmailTransport` and `import SendmailTransport = require()` */
68
+ export type { SendmailTransportOptions as Options, SendMailOptions as MailOptions, SendmailSentMessageInfo as SentMessageInfo };
69
+ export default SendmailTransport;
@@ -1,12 +1,9 @@
1
- 'use strict';
2
-
3
- const { spawn } = require('child_process');
4
- const packageData = require('../../package.json');
5
- const shared = require('../shared');
6
- const errors = require('../errors');
7
- const LeWindows = require('../mime-node/le-windows');
8
- const LeUnix = require('../mime-node/le-unix');
9
-
1
+ import { spawn } from 'node:child_process';
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 LeUnix from '../mime-node/le-unix.js';
10
7
  /**
11
8
  * Generates a Transport object for Sendmail
12
9
  *
@@ -17,30 +14,25 @@ const LeUnix = require('../mime-node/le-unix');
17
14
  * * **args** an array of arguments for the sendmail binary
18
15
  *
19
16
  * @constructor
20
- * @param {Object} optional config parameter for Sendmail
17
+ * @param optional config parameter for Sendmail
21
18
  */
22
19
  class SendmailTransport {
23
20
  constructor(options) {
24
21
  options = options || {};
25
-
26
22
  // use a reference to spawn for mocking purposes
27
23
  this._spawn = spawn;
28
-
29
24
  this.options = options;
30
-
31
25
  this.name = 'Sendmail';
32
26
  this.version = packageData.version;
33
-
34
27
  this.path = 'sendmail';
35
28
  this.args = false;
36
-
37
29
  this.logger = shared.getLogger(this.options, {
38
30
  component: this.options.component || 'sendmail'
39
31
  });
40
-
41
32
  if (typeof options === 'string') {
42
33
  this.path = options;
43
- } else if (typeof options === 'object') {
34
+ }
35
+ else if (typeof options === 'object') {
44
36
  if (options.path) {
45
37
  this.path = options.path;
46
38
  }
@@ -48,24 +40,21 @@ class SendmailTransport {
48
40
  this.args = options.args;
49
41
  }
50
42
  }
51
-
52
43
  this.winbreak = ['win', 'windows', 'dos', '\r\n'].includes((options.newline || '').toString().toLowerCase());
53
44
  }
54
-
55
45
  /**
56
46
  * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>
57
47
  *
58
- * @param {Object} emailMessage MailComposer object
59
- * @param {Function} callback Callback function to run when the sending is completed
48
+ * @param mail MailComposer object
49
+ * @param done Callback function to run when the sending is completed
60
50
  */
61
51
  send(mail, done) {
62
- // Sendmail strips this header line by itself
52
+ // Sendmail strips this header line by itself. send() runs after the message was
53
+ // compiled, so mail.message is set
63
54
  mail.message.keepBcc = true;
64
-
65
55
  const envelope = mail.message.getEnvelope();
66
56
  const messageId = mail.message.messageId();
67
57
  let returned;
68
-
69
58
  const hasInvalidAddresses = []
70
59
  .concat(envelope.from || [])
71
60
  .concat(envelope.to || [])
@@ -78,13 +67,11 @@ class SendmailTransport {
78
67
  err.code = errors.ESENDMAIL;
79
68
  return done(err);
80
69
  }
81
-
82
70
  // force -i to keep single dots
83
71
  const args = this.args
84
72
  ? ['-i'].concat(this.args).concat(envelope.to)
85
73
  : ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);
86
-
87
- const callback = err => {
74
+ const callback = (err) => {
88
75
  if (returned) {
89
76
  // ignore any additional responses, already done
90
77
  return;
@@ -101,89 +88,59 @@ class SendmailTransport {
101
88
  });
102
89
  }
103
90
  };
104
-
105
91
  let sendmail;
106
92
  try {
107
93
  sendmail = this._spawn(this.path, args);
108
- } catch (E) {
109
- this.logger.error(
110
- {
111
- err: E,
112
- tnx: 'spawn',
113
- messageId
114
- },
115
- 'Error occurred while spawning sendmail. %s',
116
- E.message
117
- );
94
+ }
95
+ catch (E) {
96
+ this.logger.error({
97
+ err: E,
98
+ tnx: 'spawn',
99
+ messageId
100
+ }, 'Error occurred while spawning sendmail. %s', E.message);
118
101
  return callback(E);
119
102
  }
120
-
121
103
  if (sendmail) {
122
104
  sendmail.on('error', err => {
123
- this.logger.error(
124
- {
125
- err,
126
- tnx: 'spawn',
127
- messageId
128
- },
129
- 'Error occurred when sending message %s. %s',
130
- messageId,
131
- err.message
132
- );
105
+ this.logger.error({
106
+ err,
107
+ tnx: 'spawn',
108
+ messageId
109
+ }, 'Error occurred when sending message %s. %s', messageId, err.message);
133
110
  callback(err);
134
111
  });
135
-
136
112
  sendmail.once('exit', code => {
137
113
  if (!code) {
138
114
  return callback();
139
115
  }
140
- const err = new Error(
141
- code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code
142
- );
116
+ const err = new Error(code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code);
143
117
  err.code = errors.ESENDMAIL;
144
-
145
- this.logger.error(
146
- {
147
- err,
148
- tnx: 'stdin',
149
- messageId
150
- },
151
- 'Error sending message %s to sendmail. %s',
152
- messageId,
153
- err.message
154
- );
118
+ this.logger.error({
119
+ err,
120
+ tnx: 'stdin',
121
+ messageId
122
+ }, 'Error sending message %s to sendmail. %s', messageId, err.message);
155
123
  callback(err);
156
124
  });
125
+ // the close listener is handed the exit code as its first argument, so a non-zero
126
+ // code reaching it before the exit listener did counts as the error value
157
127
  sendmail.once('close', callback);
158
-
159
128
  sendmail.stdin.on('error', err => {
160
- this.logger.error(
161
- {
162
- err,
163
- tnx: 'stdin',
164
- messageId
165
- },
166
- 'Error occurred when piping message %s to sendmail. %s',
167
- messageId,
168
- err.message
169
- );
129
+ this.logger.error({
130
+ err,
131
+ tnx: 'stdin',
132
+ messageId
133
+ }, 'Error occurred when piping message %s to sendmail. %s', messageId, err.message);
170
134
  callback(err);
171
135
  });
172
-
173
136
  const recipients = [].concat(envelope.to || []);
174
137
  if (recipients.length > 3) {
175
138
  recipients.push('...and ' + recipients.splice(2).length + ' more');
176
139
  }
177
- this.logger.info(
178
- {
179
- tnx: 'send',
180
- messageId
181
- },
182
- 'Sending message %s to <%s>',
183
- messageId,
184
- recipients.join(', ')
185
- );
186
-
140
+ this.logger.info({
141
+ tnx: 'send',
142
+ messageId
143
+ }, 'Sending message %s to <%s>', messageId, recipients.join(', '));
187
144
  const sourceStream = mail.message.createReadStream();
188
145
  let stream = sourceStream;
189
146
  if (this.options.newline) {
@@ -192,29 +149,22 @@ class SendmailTransport {
192
149
  stream = sourceStream.pipe(this.winbreak ? new LeWindows() : new LeUnix());
193
150
  sourceStream.once('error', err => stream.emit('error', err));
194
151
  }
195
-
196
152
  stream.once('error', err => {
197
- this.logger.error(
198
- {
199
- err,
200
- tnx: 'stdin',
201
- messageId
202
- },
203
- 'Error occurred when generating message %s. %s',
204
- messageId,
205
- err.message
206
- );
153
+ this.logger.error({
154
+ err,
155
+ tnx: 'stdin',
156
+ messageId
157
+ }, 'Error occurred when generating message %s. %s', messageId, err.message);
207
158
  sendmail.kill('SIGINT'); // do not deliver the message
208
159
  callback(err);
209
160
  });
210
-
211
161
  stream.pipe(sendmail.stdin);
212
- } else {
162
+ }
163
+ else {
213
164
  const err = new Error('sendmail was not found');
214
165
  err.code = errors.ESENDMAIL;
215
166
  return callback(err);
216
167
  }
217
168
  }
218
169
  }
219
-
220
- module.exports = SendmailTransport;
170
+ export default SendmailTransport;
@@ -0,0 +1,112 @@
1
+ import EventEmitter from 'node:events';
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, VerifyCallback } from '../mailer/index.js';
6
+ /**
7
+ * Options for the SES transport
8
+ */
9
+ export interface SESTransportOptions extends TransportOptions {
10
+ /** The AWS SDK v3 objects to send with, `{ sesClient, SendEmailCommand }` from @aws-sdk/client-sesv2 */
11
+ SES: {
12
+ /** SESv2Client instance. Its config.region provider is resolved for the domain of the returned Message-ID */
13
+ sesClient: {
14
+ config?: {
15
+ region?: (() => Promise<string>) | undefined;
16
+ [key: string]: any;
17
+ } | undefined;
18
+ send(command: unknown): Promise<any>;
19
+ };
20
+ /** SendEmailCommand class, constructed with the SendEmailCommandInput of every message */
21
+ SendEmailCommand: new (input: any) => unknown;
22
+ };
23
+ }
24
+ /** The SESv2Client shape the transport needs */
25
+ export type SESTransportClient = SESTransportOptions['SES']['sesClient'];
26
+ /** The SendEmailCommand constructor shape the transport needs */
27
+ export type SESTransportSendEmailCommand = SESTransportOptions['SES']['SendEmailCommand'];
28
+ /**
29
+ * SendEmailCommand parameters, the shape of the `ses` message option that is merged into
30
+ * the API call. Any further SendEmailCommandInput field is accepted as well
31
+ */
32
+ export interface SESSendEmailRequest {
33
+ FromEmailAddress?: string | undefined;
34
+ Destination?: {
35
+ ToAddresses?: string[] | undefined;
36
+ CcAddresses?: string[] | undefined;
37
+ BccAddresses?: string[] | undefined;
38
+ } | undefined;
39
+ ReplyToAddresses?: string[] | undefined;
40
+ Content?: unknown;
41
+ EmailTags?: Array<{
42
+ Name?: string | undefined;
43
+ Value?: string | undefined;
44
+ }> | undefined;
45
+ ConfigurationSetName?: string | undefined;
46
+ ListManagementOptions?: unknown;
47
+ FeedbackForwardingEmailAddress?: string | undefined;
48
+ [key: string]: unknown;
49
+ }
50
+ /**
51
+ * The value the SES transport hands to the send callback
52
+ */
53
+ export interface SESSentMessageInfo extends SentMessageInfo {
54
+ /** The envelope the message was sent with */
55
+ envelope: MimeNodeEnvelope;
56
+ /** Message-ID built from the MessageId SES returned */
57
+ messageId: string;
58
+ /** The MessageId SES returned */
59
+ response: string;
60
+ /** The raw RFC822 message that was sent */
61
+ raw: Buffer;
62
+ }
63
+ /**
64
+ * Generates a Transport object for AWS SES
65
+ *
66
+ * @constructor
67
+ * @param optional config parameter
68
+ */
69
+ declare class SESTransport extends EventEmitter {
70
+ mailer: Mail<SESSentMessageInfo>;
71
+ options: SESTransportOptions;
72
+ ses: SESTransportOptions['SES'];
73
+ name: string;
74
+ version: string;
75
+ logger: Logger;
76
+ constructor(options: SESTransportOptions);
77
+ getRegion(cb: (err: Error | null, region?: string | false) => void): void;
78
+ /**
79
+ * Compiles a mailcomposer message and forwards it to SES
80
+ *
81
+ * @param mail MailComposer object
82
+ * @param callback Callback function to run when the sending is completed
83
+ */
84
+ send(mail: MailMessage<SESSentMessageInfo>, callback: (err: Error | null, info?: SESSentMessageInfo) => void): void;
85
+ /**
86
+ * Verifies SES configuration
87
+ *
88
+ * @returns Promise that resolves to true if the configuration is usable
89
+ */
90
+ verify(): Promise<true>;
91
+ /**
92
+ * Verifies SES configuration
93
+ *
94
+ * @param callback Callback function
95
+ */
96
+ verify(callback: VerifyCallback): void;
97
+ }
98
+ /**
99
+ * Type aliases in the layout of @types/nodemailer, so `SESTransport.Options` style references keep working
100
+ */
101
+ declare namespace SESTransport {
102
+ type Options = SESTransportOptions;
103
+ type MailOptions = SendMailOptions;
104
+ type SentMessageInfo = SESSentMessageInfo;
105
+ type SESv2ClientLike = SESTransportClient;
106
+ type SendEmailCommandConstructorLike = SESTransportSendEmailCommand;
107
+ type SendEmailRequestLike = SESSendEmailRequest;
108
+ type MailSesOptions = SESSendEmailRequest;
109
+ }
110
+ /** The same aliases as module level exports, for `import * as SESTransport` and `import SESTransport = require()` */
111
+ export type { SESTransportOptions as Options, SendMailOptions as MailOptions, SESSentMessageInfo as SentMessageInfo, SESTransportClient as SESv2ClientLike, SESTransportSendEmailCommand as SendEmailCommandConstructorLike, SESSendEmailRequest as SendEmailRequestLike, SESSendEmailRequest as MailSesOptions };
112
+ export default SESTransport;
@@ -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;