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,427 @@
1
+ 'use strict';
2
+
3
+ const EventEmitter = require('events');
4
+ const shared = require('../shared');
5
+ const mimeTypes = require('../mime-funcs/mime-types');
6
+ const MailComposer = require('../mail-composer');
7
+ const DKIM = require('../dkim');
8
+ const httpProxyClient = require('../smtp-connection/http-proxy-client');
9
+ const util = require('util');
10
+ const urllib = require('url');
11
+ const packageData = require('../../package.json');
12
+ const MailMessage = require('./mail-message');
13
+ const net = require('net');
14
+ const dns = require('dns');
15
+ const crypto = require('crypto');
16
+
17
+ /**
18
+ * Creates an object for exposing the Mail API
19
+ *
20
+ * @constructor
21
+ * @param {Object} transporter Transport object instance to pass the mails to
22
+ */
23
+ class Mail extends EventEmitter {
24
+ constructor(transporter, options, defaults) {
25
+ super();
26
+
27
+ this.options = options || {};
28
+ this._defaults = defaults || {};
29
+
30
+ this._defaultPlugins = {
31
+ compile: [(...args) => this._convertDataImages(...args)],
32
+ stream: []
33
+ };
34
+
35
+ this._userPlugins = {
36
+ compile: [],
37
+ stream: []
38
+ };
39
+
40
+ this.meta = new Map();
41
+
42
+ this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;
43
+
44
+ this.transporter = transporter;
45
+ this.transporter.mailer = this;
46
+
47
+ this.logger = shared.getLogger(this.options, {
48
+ component: this.options.component || 'mail'
49
+ });
50
+
51
+ this.logger.debug(
52
+ {
53
+ tnx: 'create'
54
+ },
55
+ 'Creating transport: %s',
56
+ this.getVersionString()
57
+ );
58
+
59
+ // setup emit handlers for the transporter
60
+ if (typeof this.transporter.on === 'function') {
61
+ // deprecated log interface
62
+ this.transporter.on('log', log => {
63
+ this.logger.debug(
64
+ {
65
+ tnx: 'transport'
66
+ },
67
+ '%s: %s',
68
+ log.type,
69
+ log.message
70
+ );
71
+ });
72
+
73
+ // transporter errors
74
+ this.transporter.on('error', err => {
75
+ this.logger.error(
76
+ {
77
+ err,
78
+ tnx: 'transport'
79
+ },
80
+ 'Transport Error: %s',
81
+ err.message
82
+ );
83
+ this.emit('error', err);
84
+ });
85
+
86
+ // indicates if the sender has became idle
87
+ this.transporter.on('idle', (...args) => {
88
+ this.emit('idle', ...args);
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Optional methods passed to the underlying transport object
94
+ */
95
+ ['close', 'isIdle', 'verify'].forEach(method => {
96
+ this[method] = (...args) => {
97
+ if (typeof this.transporter[method] === 'function') {
98
+ if (method === 'verify' && typeof this.getSocket === 'function') {
99
+ this.transporter.getSocket = this.getSocket;
100
+ this.getSocket = false;
101
+ }
102
+ return this.transporter[method](...args);
103
+ } else {
104
+ this.logger.warn(
105
+ {
106
+ tnx: 'transport',
107
+ methodName: method
108
+ },
109
+ 'Non existing method %s called for transport',
110
+ method
111
+ );
112
+ return false;
113
+ }
114
+ };
115
+ });
116
+
117
+ // setup proxy handling
118
+ if (this.options.proxy && typeof this.options.proxy === 'string') {
119
+ this.setupProxy(this.options.proxy);
120
+ }
121
+ }
122
+
123
+ use(step, plugin) {
124
+ step = (step || '').toString();
125
+ if (!this._userPlugins.hasOwnProperty(step)) {
126
+ this._userPlugins[step] = [plugin];
127
+ } else {
128
+ this._userPlugins[step].push(plugin);
129
+ }
130
+
131
+ return this;
132
+ }
133
+
134
+ /**
135
+ * Sends an email using the preselected transport object
136
+ *
137
+ * @param {Object} data E-data description
138
+ * @param {Function?} callback Callback to run once the sending succeeded or failed
139
+ */
140
+ sendMail(data, callback) {
141
+ let promise;
142
+
143
+ if (!callback) {
144
+ promise = new Promise((resolve, reject) => {
145
+ callback = shared.callbackPromise(resolve, reject);
146
+ });
147
+ }
148
+
149
+ if (typeof this.getSocket === 'function') {
150
+ this.transporter.getSocket = this.getSocket;
151
+ this.getSocket = false;
152
+ }
153
+
154
+ let mail = new MailMessage(this, data);
155
+
156
+ this.logger.debug(
157
+ {
158
+ tnx: 'transport',
159
+ name: this.transporter.name,
160
+ version: this.transporter.version,
161
+ action: 'send'
162
+ },
163
+ 'Sending mail using %s/%s',
164
+ this.transporter.name,
165
+ this.transporter.version
166
+ );
167
+
168
+ this._processPlugins('compile', mail, err => {
169
+ if (err) {
170
+ this.logger.error(
171
+ {
172
+ err,
173
+ tnx: 'plugin',
174
+ action: 'compile'
175
+ },
176
+ 'PluginCompile Error: %s',
177
+ err.message
178
+ );
179
+ return callback(err);
180
+ }
181
+
182
+ mail.message = new MailComposer(mail.data).compile();
183
+
184
+ mail.setMailerHeader();
185
+ mail.setPriorityHeaders();
186
+ mail.setListHeaders();
187
+
188
+ this._processPlugins('stream', mail, err => {
189
+ if (err) {
190
+ this.logger.error(
191
+ {
192
+ err,
193
+ tnx: 'plugin',
194
+ action: 'stream'
195
+ },
196
+ 'PluginStream Error: %s',
197
+ err.message
198
+ );
199
+ return callback(err);
200
+ }
201
+
202
+ if (mail.data.dkim || this.dkim) {
203
+ mail.message.processFunc(input => {
204
+ let dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;
205
+ this.logger.debug(
206
+ {
207
+ tnx: 'DKIM',
208
+ messageId: mail.message.messageId(),
209
+ dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')
210
+ },
211
+ 'Signing outgoing message with %s keys',
212
+ dkim.keys.length
213
+ );
214
+ return dkim.sign(input, mail.data._dkim);
215
+ });
216
+ }
217
+
218
+ this.transporter.send(mail, (...args) => {
219
+ if (args[0]) {
220
+ this.logger.error(
221
+ {
222
+ err: args[0],
223
+ tnx: 'transport',
224
+ action: 'send'
225
+ },
226
+ 'Send Error: %s',
227
+ args[0].message
228
+ );
229
+ }
230
+ callback(...args);
231
+ });
232
+ });
233
+ });
234
+
235
+ return promise;
236
+ }
237
+
238
+ getVersionString() {
239
+ return util.format('%s (%s; +%s; %s/%s)', packageData.name, packageData.version, packageData.homepage, this.transporter.name, this.transporter.version);
240
+ }
241
+
242
+ _processPlugins(step, mail, callback) {
243
+ step = (step || '').toString();
244
+
245
+ if (!this._userPlugins.hasOwnProperty(step)) {
246
+ return callback();
247
+ }
248
+
249
+ let userPlugins = this._userPlugins[step] || [];
250
+ let defaultPlugins = this._defaultPlugins[step] || [];
251
+
252
+ if (userPlugins.length) {
253
+ this.logger.debug(
254
+ {
255
+ tnx: 'transaction',
256
+ pluginCount: userPlugins.length,
257
+ step
258
+ },
259
+ 'Using %s plugins for %s',
260
+ userPlugins.length,
261
+ step
262
+ );
263
+ }
264
+
265
+ if (userPlugins.length + defaultPlugins.length === 0) {
266
+ return callback();
267
+ }
268
+
269
+ let pos = 0;
270
+ let block = 'default';
271
+ let processPlugins = () => {
272
+ let curplugins = block === 'default' ? defaultPlugins : userPlugins;
273
+ if (pos >= curplugins.length) {
274
+ if (block === 'default' && userPlugins.length) {
275
+ block = 'user';
276
+ pos = 0;
277
+ curplugins = userPlugins;
278
+ } else {
279
+ return callback();
280
+ }
281
+ }
282
+ let plugin = curplugins[pos++];
283
+ plugin(mail, err => {
284
+ if (err) {
285
+ return callback(err);
286
+ }
287
+ processPlugins();
288
+ });
289
+ };
290
+
291
+ processPlugins();
292
+ }
293
+
294
+ /**
295
+ * Sets up proxy handler for a Nodemailer object
296
+ *
297
+ * @param {String} proxyUrl Proxy configuration url
298
+ */
299
+ setupProxy(proxyUrl) {
300
+ let proxy = urllib.parse(proxyUrl);
301
+
302
+ // setup socket handler for the mailer object
303
+ this.getSocket = (options, callback) => {
304
+ let protocol = proxy.protocol.replace(/:$/, '').toLowerCase();
305
+
306
+ if (this.meta.has('proxy_handler_' + protocol)) {
307
+ return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);
308
+ }
309
+
310
+ switch (protocol) {
311
+ // Connect using a HTTP CONNECT method
312
+ case 'http':
313
+ case 'https':
314
+ httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {
315
+ if (err) {
316
+ return callback(err);
317
+ }
318
+ return callback(null, {
319
+ connection: socket
320
+ });
321
+ });
322
+ return;
323
+ case 'socks':
324
+ case 'socks5':
325
+ case 'socks4':
326
+ case 'socks4a': {
327
+ if (!this.meta.has('proxy_socks_module')) {
328
+ return callback(new Error('Socks module not loaded'));
329
+ }
330
+ let connect = ipaddress => {
331
+ let proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;
332
+ let socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');
333
+ let proxyType = Number(proxy.protocol.replace(/\D/g, '')) || 5;
334
+ let connectionOpts = {
335
+ proxy: {
336
+ ipaddress,
337
+ port: Number(proxy.port),
338
+ type: proxyType
339
+ },
340
+ [proxyV2 ? 'destination' : 'target']: {
341
+ host: options.host,
342
+ port: options.port
343
+ },
344
+ command: 'connect'
345
+ };
346
+
347
+ if (proxy.auth) {
348
+ let username = decodeURIComponent(proxy.auth.split(':').shift());
349
+ let password = decodeURIComponent(proxy.auth.split(':').pop());
350
+ if (proxyV2) {
351
+ connectionOpts.proxy.userId = username;
352
+ connectionOpts.proxy.password = password;
353
+ } else if (proxyType === 4) {
354
+ connectionOpts.userid = username;
355
+ } else {
356
+ connectionOpts.authentication = {
357
+ username,
358
+ password
359
+ };
360
+ }
361
+ }
362
+
363
+ socksClient.createConnection(connectionOpts, (err, info) => {
364
+ if (err) {
365
+ return callback(err);
366
+ }
367
+ return callback(null, {
368
+ connection: info.socket || info
369
+ });
370
+ });
371
+ };
372
+
373
+ if (net.isIP(proxy.hostname)) {
374
+ return connect(proxy.hostname);
375
+ }
376
+
377
+ return dns.resolve(proxy.hostname, (err, address) => {
378
+ if (err) {
379
+ return callback(err);
380
+ }
381
+ connect(Array.isArray(address) ? address[0] : address);
382
+ });
383
+ }
384
+ }
385
+ callback(new Error('Unknown proxy configuration'));
386
+ };
387
+ }
388
+
389
+ _convertDataImages(mail, callback) {
390
+ if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {
391
+ return callback();
392
+ }
393
+ mail.resolveContent(mail.data, 'html', (err, html) => {
394
+ if (err) {
395
+ return callback(err);
396
+ }
397
+ let cidCounter = 0;
398
+ html = (html || '').toString().replace(/(<img\b[^>]* src\s*=[\s"']*)(data:([^;]+);[^"'>\s]+)/gi, (match, prefix, dataUri, mimeType) => {
399
+ let cid = crypto.randomBytes(10).toString('hex') + '@localhost';
400
+ if (!mail.data.attachments) {
401
+ mail.data.attachments = [];
402
+ }
403
+ if (!Array.isArray(mail.data.attachments)) {
404
+ mail.data.attachments = [].concat(mail.data.attachments || []);
405
+ }
406
+ mail.data.attachments.push({
407
+ path: dataUri,
408
+ cid,
409
+ filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)
410
+ });
411
+ return prefix + 'cid:' + cid;
412
+ });
413
+ mail.data.html = html;
414
+ callback();
415
+ });
416
+ }
417
+
418
+ set(key, value) {
419
+ return this.meta.set(key, value);
420
+ }
421
+
422
+ get(key) {
423
+ return this.meta.get(key);
424
+ }
425
+ }
426
+
427
+ module.exports = Mail;