m06_task3.js 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. package/.idea/.name +1 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +10 -0
  3. package/.idea/jsLibraryMappings.xml +6 -0
  4. package/.idea/modules.xml +8 -0
  5. package/.idea/node_lab_6.iml +12 -0
  6. package/06_task2.html +73 -0
  7. package/06_task2.js +52 -0
  8. package/06_task3.js +3 -0
  9. package/06_task4.js +3 -0
  10. package/m06_task3.js +28 -0
  11. package/package/index.js +28 -0
  12. package/package/node_modules/.package-lock.json +31 -0
  13. package/package/node_modules/@types/node/LICENSE +21 -0
  14. package/package/node_modules/@types/node/README.md +16 -0
  15. package/package/node_modules/@types/node/assert/strict.d.ts +8 -0
  16. package/package/node_modules/@types/node/assert.d.ts +961 -0
  17. package/package/node_modules/@types/node/async_hooks.d.ts +501 -0
  18. package/package/node_modules/@types/node/buffer.d.ts +2258 -0
  19. package/package/node_modules/@types/node/child_process.d.ts +1369 -0
  20. package/package/node_modules/@types/node/cluster.d.ts +410 -0
  21. package/package/node_modules/@types/node/console.d.ts +412 -0
  22. package/package/node_modules/@types/node/constants.d.ts +18 -0
  23. package/package/node_modules/@types/node/crypto.d.ts +3964 -0
  24. package/package/node_modules/@types/node/dgram.d.ts +545 -0
  25. package/package/node_modules/@types/node/diagnostics_channel.d.ts +153 -0
  26. package/package/node_modules/@types/node/dns/promises.d.ts +370 -0
  27. package/package/node_modules/@types/node/dns.d.ts +659 -0
  28. package/package/node_modules/@types/node/dom-events.d.ts +126 -0
  29. package/package/node_modules/@types/node/domain.d.ts +170 -0
  30. package/package/node_modules/@types/node/events.d.ts +678 -0
  31. package/package/node_modules/@types/node/fs/promises.d.ts +1138 -0
  32. package/package/node_modules/@types/node/fs.d.ts +3872 -0
  33. package/package/node_modules/@types/node/globals.d.ts +300 -0
  34. package/package/node_modules/@types/node/globals.global.d.ts +1 -0
  35. package/package/node_modules/@types/node/http.d.ts +1614 -0
  36. package/package/node_modules/@types/node/http2.d.ts +2134 -0
  37. package/package/node_modules/@types/node/https.d.ts +541 -0
  38. package/package/node_modules/@types/node/index.d.ts +133 -0
  39. package/package/node_modules/@types/node/inspector.d.ts +2741 -0
  40. package/package/node_modules/@types/node/module.d.ts +114 -0
  41. package/package/node_modules/@types/node/net.d.ts +869 -0
  42. package/package/node_modules/@types/node/os.d.ts +466 -0
  43. package/package/node_modules/@types/node/package.json +232 -0
  44. package/package/node_modules/@types/node/path.d.ts +191 -0
  45. package/package/node_modules/@types/node/perf_hooks.d.ts +625 -0
  46. package/package/node_modules/@types/node/process.d.ts +1482 -0
  47. package/package/node_modules/@types/node/punycode.d.ts +117 -0
  48. package/package/node_modules/@types/node/querystring.d.ts +131 -0
  49. package/package/node_modules/@types/node/readline/promises.d.ts +143 -0
  50. package/package/node_modules/@types/node/readline.d.ts +653 -0
  51. package/package/node_modules/@types/node/repl.d.ts +424 -0
  52. package/package/node_modules/@types/node/stream/consumers.d.ts +12 -0
  53. package/package/node_modules/@types/node/stream/promises.d.ts +42 -0
  54. package/package/node_modules/@types/node/stream/web.d.ts +330 -0
  55. package/package/node_modules/@types/node/stream.d.ts +1340 -0
  56. package/package/node_modules/@types/node/string_decoder.d.ts +67 -0
  57. package/package/node_modules/@types/node/test.d.ts +314 -0
  58. package/package/node_modules/@types/node/timers/promises.d.ts +68 -0
  59. package/package/node_modules/@types/node/timers.d.ts +94 -0
  60. package/package/node_modules/@types/node/tls.d.ts +1028 -0
  61. package/package/node_modules/@types/node/trace_events.d.ts +171 -0
  62. package/package/node_modules/@types/node/ts4.8/assert/strict.d.ts +8 -0
  63. package/package/node_modules/@types/node/ts4.8/assert.d.ts +961 -0
  64. package/package/node_modules/@types/node/ts4.8/async_hooks.d.ts +501 -0
  65. package/package/node_modules/@types/node/ts4.8/buffer.d.ts +2259 -0
  66. package/package/node_modules/@types/node/ts4.8/child_process.d.ts +1369 -0
  67. package/package/node_modules/@types/node/ts4.8/cluster.d.ts +410 -0
  68. package/package/node_modules/@types/node/ts4.8/console.d.ts +412 -0
  69. package/package/node_modules/@types/node/ts4.8/constants.d.ts +18 -0
  70. package/package/node_modules/@types/node/ts4.8/crypto.d.ts +3964 -0
  71. package/package/node_modules/@types/node/ts4.8/dgram.d.ts +545 -0
  72. package/package/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts +153 -0
  73. package/package/node_modules/@types/node/ts4.8/dns/promises.d.ts +370 -0
  74. package/package/node_modules/@types/node/ts4.8/dns.d.ts +659 -0
  75. package/package/node_modules/@types/node/ts4.8/dom-events.d.ts +126 -0
  76. package/package/node_modules/@types/node/ts4.8/domain.d.ts +170 -0
  77. package/package/node_modules/@types/node/ts4.8/events.d.ts +678 -0
  78. package/package/node_modules/@types/node/ts4.8/fs/promises.d.ts +1138 -0
  79. package/package/node_modules/@types/node/ts4.8/fs.d.ts +3872 -0
  80. package/package/node_modules/@types/node/ts4.8/globals.d.ts +294 -0
  81. package/package/node_modules/@types/node/ts4.8/globals.global.d.ts +1 -0
  82. package/package/node_modules/@types/node/ts4.8/http.d.ts +1614 -0
  83. package/package/node_modules/@types/node/ts4.8/http2.d.ts +2134 -0
  84. package/package/node_modules/@types/node/ts4.8/https.d.ts +541 -0
  85. package/package/node_modules/@types/node/ts4.8/index.d.ts +88 -0
  86. package/package/node_modules/@types/node/ts4.8/inspector.d.ts +2741 -0
  87. package/package/node_modules/@types/node/ts4.8/module.d.ts +114 -0
  88. package/package/node_modules/@types/node/ts4.8/net.d.ts +869 -0
  89. package/package/node_modules/@types/node/ts4.8/os.d.ts +466 -0
  90. package/package/node_modules/@types/node/ts4.8/path.d.ts +191 -0
  91. package/package/node_modules/@types/node/ts4.8/perf_hooks.d.ts +625 -0
  92. package/package/node_modules/@types/node/ts4.8/process.d.ts +1482 -0
  93. package/package/node_modules/@types/node/ts4.8/punycode.d.ts +117 -0
  94. package/package/node_modules/@types/node/ts4.8/querystring.d.ts +131 -0
  95. package/package/node_modules/@types/node/ts4.8/readline/promises.d.ts +143 -0
  96. package/package/node_modules/@types/node/ts4.8/readline.d.ts +653 -0
  97. package/package/node_modules/@types/node/ts4.8/repl.d.ts +424 -0
  98. package/package/node_modules/@types/node/ts4.8/stream/consumers.d.ts +12 -0
  99. package/package/node_modules/@types/node/ts4.8/stream/promises.d.ts +42 -0
  100. package/package/node_modules/@types/node/ts4.8/stream/web.d.ts +330 -0
  101. package/package/node_modules/@types/node/ts4.8/stream.d.ts +1340 -0
  102. package/package/node_modules/@types/node/ts4.8/string_decoder.d.ts +67 -0
  103. package/package/node_modules/@types/node/ts4.8/test.d.ts +314 -0
  104. package/package/node_modules/@types/node/ts4.8/timers/promises.d.ts +68 -0
  105. package/package/node_modules/@types/node/ts4.8/timers.d.ts +94 -0
  106. package/package/node_modules/@types/node/ts4.8/tls.d.ts +1028 -0
  107. package/package/node_modules/@types/node/ts4.8/trace_events.d.ts +171 -0
  108. package/package/node_modules/@types/node/ts4.8/tty.d.ts +206 -0
  109. package/package/node_modules/@types/node/ts4.8/url.d.ts +897 -0
  110. package/package/node_modules/@types/node/ts4.8/util.d.ts +1850 -0
  111. package/package/node_modules/@types/node/ts4.8/v8.d.ts +396 -0
  112. package/package/node_modules/@types/node/ts4.8/vm.d.ts +509 -0
  113. package/package/node_modules/@types/node/ts4.8/wasi.d.ts +158 -0
  114. package/package/node_modules/@types/node/ts4.8/worker_threads.d.ts +689 -0
  115. package/package/node_modules/@types/node/ts4.8/zlib.d.ts +517 -0
  116. package/package/node_modules/@types/node/tty.d.ts +206 -0
  117. package/package/node_modules/@types/node/url.d.ts +897 -0
  118. package/package/node_modules/@types/node/util.d.ts +1850 -0
  119. package/package/node_modules/@types/node/v8.d.ts +396 -0
  120. package/package/node_modules/@types/node/vm.d.ts +509 -0
  121. package/package/node_modules/@types/node/wasi.d.ts +158 -0
  122. package/package/node_modules/@types/node/worker_threads.d.ts +689 -0
  123. package/package/node_modules/@types/node/zlib.d.ts +517 -0
  124. package/package/node_modules/@types/nodemailer/LICENSE +21 -0
  125. package/package/node_modules/@types/nodemailer/README.md +16 -0
  126. package/package/node_modules/@types/nodemailer/index.d.ts +83 -0
  127. package/package/node_modules/@types/nodemailer/lib/addressparser/index.d.ts +31 -0
  128. package/package/node_modules/@types/nodemailer/lib/base64/index.d.ts +22 -0
  129. package/package/node_modules/@types/nodemailer/lib/dkim/index.d.ts +45 -0
  130. package/package/node_modules/@types/nodemailer/lib/dkim/message-parser.d.ts +75 -0
  131. package/package/node_modules/@types/nodemailer/lib/dkim/relaxed-body.d.ts +75 -0
  132. package/package/node_modules/@types/nodemailer/lib/dkim/sign.d.ts +11 -0
  133. package/package/node_modules/@types/nodemailer/lib/fetch/cookies.d.ts +54 -0
  134. package/package/node_modules/@types/nodemailer/lib/fetch/index.d.ts +38 -0
  135. package/package/node_modules/@types/nodemailer/lib/json-transport/index.d.ts +50 -0
  136. package/package/node_modules/@types/nodemailer/lib/mail-composer/index.d.ts +25 -0
  137. package/package/node_modules/@types/nodemailer/lib/mailer/index.d.ts +230 -0
  138. package/package/node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts +28 -0
  139. package/package/node_modules/@types/nodemailer/lib/mime-funcs/index.d.ts +87 -0
  140. package/package/node_modules/@types/nodemailer/lib/mime-funcs/mime-types.d.ts +2 -0
  141. package/package/node_modules/@types/nodemailer/lib/mime-node/index.d.ts +137 -0
  142. package/package/node_modules/@types/nodemailer/lib/mime-node/last-newline.d.ts +9 -0
  143. package/package/node_modules/@types/nodemailer/lib/qp/index.d.ts +23 -0
  144. package/package/node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts +53 -0
  145. package/package/node_modules/@types/nodemailer/lib/sendmail-transport/le-unix.d.ts +7 -0
  146. package/package/node_modules/@types/nodemailer/lib/sendmail-transport/le-windows.d.ts +7 -0
  147. package/package/node_modules/@types/nodemailer/lib/ses-transport/index.d.ts +136 -0
  148. package/package/node_modules/@types/nodemailer/lib/shared/index.d.ts +51 -0
  149. package/package/node_modules/@types/nodemailer/lib/smtp-connection/data-stream.d.ts +11 -0
  150. package/package/node_modules/@types/nodemailer/lib/smtp-connection/http-proxy-client.d.ts +11 -0
  151. package/package/node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts +254 -0
  152. package/package/node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts +90 -0
  153. package/package/node_modules/@types/nodemailer/lib/smtp-pool/pool-resource.d.ts +66 -0
  154. package/package/node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts +115 -0
  155. package/package/node_modules/@types/nodemailer/lib/stream-transport/index.d.ts +56 -0
  156. package/package/node_modules/@types/nodemailer/lib/well-known/index.d.ts +6 -0
  157. package/package/node_modules/@types/nodemailer/lib/xoauth2/index.d.ts +110 -0
  158. package/package/node_modules/@types/nodemailer/package.json +37 -0
  159. package/package/node_modules/nodemailer/.gitattributes +6 -0
  160. package/package/node_modules/nodemailer/.prettierrc.js +8 -0
  161. package/package/node_modules/nodemailer/CHANGELOG.md +715 -0
  162. package/package/node_modules/nodemailer/CODE_OF_CONDUCT.md +76 -0
  163. package/package/node_modules/nodemailer/CONTRIBUTING.md +67 -0
  164. package/package/node_modules/nodemailer/LICENSE +16 -0
  165. package/package/node_modules/nodemailer/README.md +93 -0
  166. package/package/node_modules/nodemailer/SECURITY.txt +22 -0
  167. package/package/node_modules/nodemailer/lib/addressparser/index.js +313 -0
  168. package/package/node_modules/nodemailer/lib/base64/index.js +142 -0
  169. package/package/node_modules/nodemailer/lib/dkim/index.js +251 -0
  170. package/package/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
  171. package/package/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
  172. package/package/node_modules/nodemailer/lib/dkim/sign.js +117 -0
  173. package/package/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
  174. package/package/node_modules/nodemailer/lib/fetch/index.js +269 -0
  175. package/package/node_modules/nodemailer/lib/json-transport/index.js +82 -0
  176. package/package/node_modules/nodemailer/lib/mail-composer/index.js +558 -0
  177. package/package/node_modules/nodemailer/lib/mailer/index.js +427 -0
  178. package/package/node_modules/nodemailer/lib/mailer/mail-message.js +315 -0
  179. package/package/node_modules/nodemailer/lib/mime-funcs/index.js +619 -0
  180. package/package/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2102 -0
  181. package/package/node_modules/nodemailer/lib/mime-node/index.js +1290 -0
  182. package/package/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
  183. package/package/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
  184. package/package/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
  185. package/package/node_modules/nodemailer/lib/nodemailer.js +143 -0
  186. package/package/node_modules/nodemailer/lib/qp/index.js +219 -0
  187. package/package/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
  188. package/package/node_modules/nodemailer/lib/ses-transport/index.js +349 -0
  189. package/package/node_modules/nodemailer/lib/shared/index.js +639 -0
  190. package/package/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
  191. package/package/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
  192. package/package/node_modules/nodemailer/lib/smtp-connection/index.js +1786 -0
  193. package/package/node_modules/nodemailer/lib/smtp-pool/index.js +648 -0
  194. package/package/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +253 -0
  195. package/package/node_modules/nodemailer/lib/smtp-transport/index.js +416 -0
  196. package/package/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
  197. package/package/node_modules/nodemailer/lib/well-known/index.js +47 -0
  198. package/package/node_modules/nodemailer/lib/well-known/services.json +286 -0
  199. package/package/node_modules/nodemailer/lib/xoauth2/index.js +376 -0
  200. package/package/node_modules/nodemailer/package.json +46 -0
  201. package/package/node_modules/nodemailer/postinstall.js +101 -0
  202. package/package/package-lock.json +60 -0
  203. package/package/package.json +6 -0
  204. package/package.json +19 -0
@@ -0,0 +1,349 @@
1
+ 'use strict';
2
+
3
+ const EventEmitter = require('events');
4
+ const packageData = require('../../package.json');
5
+ const shared = require('../shared');
6
+ const LeWindows = require('../mime-node/le-windows');
7
+
8
+ /**
9
+ * Generates a Transport object for AWS SES
10
+ *
11
+ * Possible options can be the following:
12
+ *
13
+ * * **sendingRate** optional Number specifying how many messages per second should be delivered to SES
14
+ * * **maxConnections** optional Number specifying max number of parallel connections to SES
15
+ *
16
+ * @constructor
17
+ * @param {Object} optional config parameter
18
+ */
19
+ class SESTransport extends EventEmitter {
20
+ constructor(options) {
21
+ super();
22
+ options = options || {};
23
+
24
+ this.options = options || {};
25
+ this.ses = this.options.SES;
26
+
27
+ this.name = 'SESTransport';
28
+ this.version = packageData.version;
29
+
30
+ this.logger = shared.getLogger(this.options, {
31
+ component: this.options.component || 'ses-transport'
32
+ });
33
+
34
+ // parallel sending connections
35
+ this.maxConnections = Number(this.options.maxConnections) || Infinity;
36
+ this.connections = 0;
37
+
38
+ // max messages per second
39
+ this.sendingRate = Number(this.options.sendingRate) || Infinity;
40
+ this.sendingRateTTL = null;
41
+ this.rateInterval = 1000; // milliseconds
42
+ this.rateMessages = [];
43
+
44
+ this.pending = [];
45
+
46
+ this.idling = true;
47
+
48
+ setImmediate(() => {
49
+ if (this.idling) {
50
+ this.emit('idle');
51
+ }
52
+ });
53
+ }
54
+
55
+ /**
56
+ * Schedules a sending of a message
57
+ *
58
+ * @param {Object} emailMessage MailComposer object
59
+ * @param {Function} callback Callback function to run when the sending is completed
60
+ */
61
+ send(mail, callback) {
62
+ if (this.connections >= this.maxConnections) {
63
+ this.idling = false;
64
+ return this.pending.push({
65
+ mail,
66
+ callback
67
+ });
68
+ }
69
+
70
+ if (!this._checkSendingRate()) {
71
+ this.idling = false;
72
+ return this.pending.push({
73
+ mail,
74
+ callback
75
+ });
76
+ }
77
+
78
+ this._send(mail, (...args) => {
79
+ setImmediate(() => callback(...args));
80
+ this._sent();
81
+ });
82
+ }
83
+
84
+ _checkRatedQueue() {
85
+ if (this.connections >= this.maxConnections || !this._checkSendingRate()) {
86
+ return;
87
+ }
88
+
89
+ if (!this.pending.length) {
90
+ if (!this.idling) {
91
+ this.idling = true;
92
+ this.emit('idle');
93
+ }
94
+ return;
95
+ }
96
+
97
+ let next = this.pending.shift();
98
+ this._send(next.mail, (...args) => {
99
+ setImmediate(() => next.callback(...args));
100
+ this._sent();
101
+ });
102
+ }
103
+
104
+ _checkSendingRate() {
105
+ clearTimeout(this.sendingRateTTL);
106
+
107
+ let now = Date.now();
108
+ let oldest = false;
109
+ // delete older messages
110
+ for (let i = this.rateMessages.length - 1; i >= 0; i--) {
111
+ if (this.rateMessages[i].ts >= now - this.rateInterval && (!oldest || this.rateMessages[i].ts < oldest)) {
112
+ oldest = this.rateMessages[i].ts;
113
+ }
114
+
115
+ if (this.rateMessages[i].ts < now - this.rateInterval && !this.rateMessages[i].pending) {
116
+ this.rateMessages.splice(i, 1);
117
+ }
118
+ }
119
+
120
+ if (this.rateMessages.length < this.sendingRate) {
121
+ return true;
122
+ }
123
+
124
+ let delay = Math.max(oldest + 1001, now + 20);
125
+ this.sendingRateTTL = setTimeout(() => this._checkRatedQueue(), now - delay);
126
+
127
+ try {
128
+ this.sendingRateTTL.unref();
129
+ } catch (E) {
130
+ // Ignore. Happens on envs with non-node timer implementation
131
+ }
132
+
133
+ return false;
134
+ }
135
+
136
+ _sent() {
137
+ this.connections--;
138
+ this._checkRatedQueue();
139
+ }
140
+
141
+ /**
142
+ * Returns true if there are free slots in the queue
143
+ */
144
+ isIdle() {
145
+ return this.idling;
146
+ }
147
+
148
+ /**
149
+ * Compiles a mailcomposer message and forwards it to SES
150
+ *
151
+ * @param {Object} emailMessage MailComposer object
152
+ * @param {Function} callback Callback function to run when the sending is completed
153
+ */
154
+ _send(mail, callback) {
155
+ let statObject = {
156
+ ts: Date.now(),
157
+ pending: true
158
+ };
159
+ this.connections++;
160
+ this.rateMessages.push(statObject);
161
+
162
+ let envelope = mail.data.envelope || mail.message.getEnvelope();
163
+ let messageId = mail.message.messageId();
164
+
165
+ let recipients = [].concat(envelope.to || []);
166
+ if (recipients.length > 3) {
167
+ recipients.push('...and ' + recipients.splice(2).length + ' more');
168
+ }
169
+ this.logger.info(
170
+ {
171
+ tnx: 'send',
172
+ messageId
173
+ },
174
+ 'Sending message %s to <%s>',
175
+ messageId,
176
+ recipients.join(', ')
177
+ );
178
+
179
+ let getRawMessage = next => {
180
+ // do not use Message-ID and Date in DKIM signature
181
+ if (!mail.data._dkim) {
182
+ mail.data._dkim = {};
183
+ }
184
+ if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {
185
+ mail.data._dkim.skipFields += ':date:message-id';
186
+ } else {
187
+ mail.data._dkim.skipFields = 'date:message-id';
188
+ }
189
+
190
+ let sourceStream = mail.message.createReadStream();
191
+ let stream = sourceStream.pipe(new LeWindows());
192
+ let chunks = [];
193
+ let chunklen = 0;
194
+
195
+ stream.on('readable', () => {
196
+ let chunk;
197
+ while ((chunk = stream.read()) !== null) {
198
+ chunks.push(chunk);
199
+ chunklen += chunk.length;
200
+ }
201
+ });
202
+
203
+ sourceStream.once('error', err => stream.emit('error', err));
204
+
205
+ stream.once('error', err => {
206
+ next(err);
207
+ });
208
+
209
+ stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));
210
+ };
211
+
212
+ setImmediate(() =>
213
+ getRawMessage((err, raw) => {
214
+ if (err) {
215
+ this.logger.error(
216
+ {
217
+ err,
218
+ tnx: 'send',
219
+ messageId
220
+ },
221
+ 'Failed creating message for %s. %s',
222
+ messageId,
223
+ err.message
224
+ );
225
+ statObject.pending = false;
226
+ return callback(err);
227
+ }
228
+
229
+ let sesMessage = {
230
+ RawMessage: {
231
+ // required
232
+ Data: raw // required
233
+ },
234
+ Source: envelope.from,
235
+ Destinations: envelope.to
236
+ };
237
+
238
+ Object.keys(mail.data.ses || {}).forEach(key => {
239
+ sesMessage[key] = mail.data.ses[key];
240
+ });
241
+
242
+ let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};
243
+ let aws = this.ses.aws || {};
244
+
245
+ let getRegion = cb => {
246
+ if (ses.config && typeof ses.config.region === 'function') {
247
+ // promise
248
+ return ses.config
249
+ .region()
250
+ .then(region => cb(null, region))
251
+ .catch(err => cb(err));
252
+ }
253
+ return cb(null, (ses.config && ses.config.region) || 'us-east-1');
254
+ };
255
+
256
+ getRegion((err, region) => {
257
+ if (err || !region) {
258
+ region = 'us-east-1';
259
+ }
260
+
261
+ let sendPromise;
262
+ if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {
263
+ // v3 API
264
+ sendPromise = ses.send(new aws.SendRawEmailCommand(sesMessage));
265
+ } else {
266
+ // v2 API
267
+ sendPromise = ses.sendRawEmail(sesMessage).promise();
268
+ }
269
+
270
+ sendPromise
271
+ .then(data => {
272
+ if (region === 'us-east-1') {
273
+ region = 'email';
274
+ }
275
+
276
+ statObject.pending = false;
277
+ callback(null, {
278
+ envelope: {
279
+ from: envelope.from,
280
+ to: envelope.to
281
+ },
282
+ messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',
283
+ response: data.MessageId,
284
+ raw
285
+ });
286
+ })
287
+ .catch(err => {
288
+ this.logger.error(
289
+ {
290
+ err,
291
+ tnx: 'send'
292
+ },
293
+ 'Send error for %s: %s',
294
+ messageId,
295
+ err.message
296
+ );
297
+ statObject.pending = false;
298
+ callback(err);
299
+ });
300
+ });
301
+ })
302
+ );
303
+ }
304
+
305
+ /**
306
+ * Verifies SES configuration
307
+ *
308
+ * @param {Function} callback Callback function
309
+ */
310
+ verify(callback) {
311
+ let promise;
312
+ let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};
313
+ let aws = this.ses.aws || {};
314
+
315
+ const sesMessage = {
316
+ RawMessage: {
317
+ // required
318
+ Data: 'From: invalid@invalid\r\nTo: invalid@invalid\r\n Subject: Invalid\r\n\r\nInvalid'
319
+ },
320
+ Source: 'invalid@invalid',
321
+ Destinations: ['invalid@invalid']
322
+ };
323
+
324
+ if (!callback) {
325
+ promise = new Promise((resolve, reject) => {
326
+ callback = shared.callbackPromise(resolve, reject);
327
+ });
328
+ }
329
+ const cb = err => {
330
+ if (err && (err.code || err.Code) !== 'InvalidParameterValue') {
331
+ return callback(err);
332
+ }
333
+ return callback(null, true);
334
+ };
335
+
336
+ if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {
337
+ // v3 API
338
+ sesMessage.RawMessage.Data = Buffer.from(sesMessage.RawMessage.Data);
339
+ ses.send(new aws.SendRawEmailCommand(sesMessage), cb);
340
+ } else {
341
+ // v2 API
342
+ ses.sendRawEmail(sesMessage, cb);
343
+ }
344
+
345
+ return promise;
346
+ }
347
+ }
348
+
349
+ module.exports = SESTransport;