@hedhog/mail 0.46.1 → 0.46.3
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.
- package/dist/interfaces/mail-module-options.interface.d.ts +4 -0
- package/dist/interfaces/mail-module-options.interface.d.ts.map +1 -1
- package/dist/mail.service.d.ts +5 -1
- package/dist/mail.service.d.ts.map +1 -1
- package/dist/mail.service.js +45 -4
- package/dist/mail.service.js.map +1 -1
- package/package.json +1 -1
- package/src/interfaces/mail-module-options.interface.ts +4 -0
- package/src/mail.service.ts +60 -7
@@ -1,6 +1,7 @@
|
|
1
1
|
import { ModuleMetadata } from '@nestjs/common';
|
2
2
|
export type MailModuleOptions = {
|
3
3
|
global?: boolean;
|
4
|
+
debug?: boolean;
|
4
5
|
type: 'AWS';
|
5
6
|
region: string;
|
6
7
|
accessKeyId: string;
|
@@ -8,14 +9,17 @@ export type MailModuleOptions = {
|
|
8
9
|
from: string;
|
9
10
|
} | {
|
10
11
|
global?: boolean;
|
12
|
+
debug?: boolean;
|
11
13
|
type: 'SMTP';
|
12
14
|
host: string;
|
13
15
|
port: number;
|
14
16
|
secure?: boolean;
|
15
17
|
username: string;
|
16
18
|
password: string;
|
19
|
+
rejectUnauthorized?: boolean;
|
17
20
|
} | {
|
18
21
|
global?: boolean;
|
22
|
+
debug?: boolean;
|
19
23
|
type: 'GMAIL';
|
20
24
|
clientId: string;
|
21
25
|
clientSecret: string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mail-module-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/mail-module-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;
|
1
|
+
{"version":3,"file":"mail-module-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/mail-module-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GACD;IACE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;CACrE;AAED,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IACvC,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IACpD,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB"}
|
package/dist/mail.service.d.ts
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
import { HttpService } from '@nestjs/axios';
|
2
|
+
import { OnModuleInit } from '@nestjs/common';
|
2
3
|
import { MailModuleOptions } from './interfaces/mail-module-options.interface';
|
3
4
|
import { Mail } from './mail.consts';
|
4
|
-
export declare class MailService {
|
5
|
+
export declare class MailService implements OnModuleInit {
|
5
6
|
private readonly mailConfig;
|
6
7
|
private readonly httpService;
|
8
|
+
private debug;
|
7
9
|
constructor(mailConfig: MailModuleOptions, httpService: HttpService);
|
10
|
+
onModuleInit(): Promise<void>;
|
11
|
+
private log;
|
8
12
|
send(mail: Mail): Promise<any>;
|
9
13
|
createRawEmail(mail: Mail): Promise<string>;
|
10
14
|
sendWithSMTP(mail: Mail): Promise<any>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mail.service.d.ts","sourceRoot":"","sources":["../src/mail.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"mail.service.d.ts","sourceRoot":"","sources":["../src/mail.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAkC,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAuB,MAAM,eAAe,CAAC;AAE1D,qBACa,WAAY,YAAW,YAAY;IAK5C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAN9B,OAAO,CAAC,KAAK,CAAS;gBAIH,UAAU,EAAE,iBAAiB,EAE7B,WAAW,EAAE,WAAW;IAGrC,YAAY;IAMlB,OAAO,CAAC,GAAG;IAML,IAAI,CAAC,IAAI,EAAE,IAAI;IAcf,cAAc,CAAC,IAAI,EAAE,IAAI;IA2EzB,YAAY,CAAC,IAAI,EAAE,IAAI;IAsDvB,aAAa,CAAC,IAAI,EAAE,IAAI;;;IAiDxB,WAAW,CAAC,IAAI,EAAE,IAAI;CAoI7B"}
|
package/dist/mail.service.js
CHANGED
@@ -56,8 +56,20 @@ let MailService = class MailService {
|
|
56
56
|
constructor(mailConfig, httpService) {
|
57
57
|
this.mailConfig = mailConfig;
|
58
58
|
this.httpService = httpService;
|
59
|
+
this.debug = false;
|
60
|
+
}
|
61
|
+
async onModuleInit() {
|
62
|
+
if (this.mailConfig.debug) {
|
63
|
+
this.debug = true;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
log(...args) {
|
67
|
+
if (this.debug) {
|
68
|
+
console.log(...args);
|
69
|
+
}
|
59
70
|
}
|
60
71
|
async send(mail) {
|
72
|
+
this.log('Sending mail:', mail);
|
61
73
|
switch (this.mailConfig.type) {
|
62
74
|
case mail_configuration_type_enum_1.MailConfigurationTypeEnum.AWS:
|
63
75
|
return this.sendWithSES(mail);
|
@@ -129,8 +141,16 @@ let MailService = class MailService {
|
|
129
141
|
if (this.mailConfig.type !== 'SMTP') {
|
130
142
|
throw new Error('Invalid mail configuration type');
|
131
143
|
}
|
132
|
-
const { password: pass, username: user, host, port, secure = false, } = this.mailConfig;
|
144
|
+
const { password: pass, username: user, host, port, secure = false, rejectUnauthorized = true, } = this.mailConfig;
|
133
145
|
const nodemailer = await Promise.resolve().then(() => __importStar(require('nodemailer')));
|
146
|
+
this.log(`Sending mail with SMTP`, {
|
147
|
+
host,
|
148
|
+
port,
|
149
|
+
secure,
|
150
|
+
user,
|
151
|
+
pass,
|
152
|
+
rejectUnauthorized,
|
153
|
+
});
|
134
154
|
const transporter = nodemailer.createTransport({
|
135
155
|
host,
|
136
156
|
port,
|
@@ -139,8 +159,11 @@ let MailService = class MailService {
|
|
139
159
|
user,
|
140
160
|
pass,
|
141
161
|
},
|
162
|
+
tls: {
|
163
|
+
rejectUnauthorized,
|
164
|
+
},
|
142
165
|
});
|
143
|
-
|
166
|
+
const result = await transporter.sendMail({
|
144
167
|
from: mail.from || process.env.SMTP_FROM || process.env.SMTP_USER,
|
145
168
|
to: mail.to,
|
146
169
|
subject: mail.subject,
|
@@ -150,6 +173,8 @@ let MailService = class MailService {
|
|
150
173
|
replyTo: mail.replyTo,
|
151
174
|
priority: mail.priority,
|
152
175
|
});
|
176
|
+
this.log('Email sent:', result);
|
177
|
+
return result;
|
153
178
|
}
|
154
179
|
async sendWithGmail(mail) {
|
155
180
|
if (this.mailConfig.type !== 'GMAIL') {
|
@@ -157,6 +182,12 @@ let MailService = class MailService {
|
|
157
182
|
}
|
158
183
|
const { clientId, clientSecret, from, refreshToken } = this.mailConfig;
|
159
184
|
const redirectURI = 'https://developers.google.com/oauthplayground';
|
185
|
+
this.log(`Sending mail with Gmail`, {
|
186
|
+
clientId,
|
187
|
+
clientSecret,
|
188
|
+
from,
|
189
|
+
refreshToken,
|
190
|
+
});
|
160
191
|
const { auth } = await Promise.resolve().then(() => __importStar(require('googleapis/build/src/apis/oauth2')));
|
161
192
|
const oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectURI);
|
162
193
|
oauth2Client.setCredentials({
|
@@ -173,7 +204,9 @@ let MailService = class MailService {
|
|
173
204
|
'Content-Type': 'application/json',
|
174
205
|
};
|
175
206
|
const response = this.httpService.post(url, requestBody, { headers });
|
176
|
-
|
207
|
+
const result = await (0, rxjs_1.firstValueFrom)(response);
|
208
|
+
this.log('Email sent:', result);
|
209
|
+
return result;
|
177
210
|
}
|
178
211
|
async sendWithSES(mail) {
|
179
212
|
var _a;
|
@@ -181,6 +214,12 @@ let MailService = class MailService {
|
|
181
214
|
throw new Error('Invalid mail configuration type');
|
182
215
|
}
|
183
216
|
const { region, from, accessKeyId, secretAccessKey } = this.mailConfig;
|
217
|
+
this.log(`Sending mail with AWS SES`, {
|
218
|
+
region,
|
219
|
+
from,
|
220
|
+
accessKeyId,
|
221
|
+
secretAccessKey,
|
222
|
+
});
|
184
223
|
const { SES } = await Promise.resolve().then(() => __importStar(require('aws-sdk')));
|
185
224
|
const ses = new SES({
|
186
225
|
apiVersion: '2010-12-01',
|
@@ -278,7 +317,9 @@ let MailService = class MailService {
|
|
278
317
|
ReplyToAddresses: mail.replyTo,
|
279
318
|
Source: from,
|
280
319
|
};
|
281
|
-
|
320
|
+
const result = await ses.sendEmail(params).promise();
|
321
|
+
this.log('Email sent:', result);
|
322
|
+
return result;
|
282
323
|
}
|
283
324
|
}
|
284
325
|
};
|
package/dist/mail.service.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mail.service.js","sourceRoot":"","sources":["../src/mail.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA4C;AAC5C,
|
1
|
+
{"version":3,"file":"mail.service.js","sourceRoot":"","sources":["../src/mail.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -3,6 +3,7 @@ import { ModuleMetadata } from '@nestjs/common';
|
|
3
3
|
export type MailModuleOptions =
|
4
4
|
| {
|
5
5
|
global?: boolean;
|
6
|
+
debug?: boolean;
|
6
7
|
type: 'AWS';
|
7
8
|
region: string;
|
8
9
|
accessKeyId: string;
|
@@ -11,15 +12,18 @@ export type MailModuleOptions =
|
|
11
12
|
}
|
12
13
|
| {
|
13
14
|
global?: boolean;
|
15
|
+
debug?: boolean;
|
14
16
|
type: 'SMTP';
|
15
17
|
host: string;
|
16
18
|
port: number;
|
17
19
|
secure?: boolean;
|
18
20
|
username: string;
|
19
21
|
password: string;
|
22
|
+
rejectUnauthorized?: boolean;
|
20
23
|
}
|
21
24
|
| {
|
22
25
|
global?: boolean;
|
26
|
+
debug?: boolean;
|
23
27
|
type: 'GMAIL';
|
24
28
|
clientId: string;
|
25
29
|
clientSecret: string;
|
package/src/mail.service.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { HttpService } from '@nestjs/axios';
|
2
|
-
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
2
|
+
import { forwardRef, Inject, Injectable, OnModuleInit } from '@nestjs/common';
|
3
3
|
import * as mimemessage from 'mimemessage';
|
4
4
|
import { firstValueFrom } from 'rxjs';
|
5
5
|
import { MailConfigurationTypeEnum } from './enums/mail-configuration-type.enum';
|
@@ -7,15 +7,30 @@ import { MailModuleOptions } from './interfaces/mail-module-options.interface';
|
|
7
7
|
import { Mail, MAIL_MODULE_OPTIONS } from './mail.consts';
|
8
8
|
|
9
9
|
@Injectable()
|
10
|
-
export class MailService {
|
10
|
+
export class MailService implements OnModuleInit {
|
11
|
+
private debug = false;
|
12
|
+
|
11
13
|
constructor(
|
12
14
|
@Inject(MAIL_MODULE_OPTIONS)
|
13
15
|
private readonly mailConfig: MailModuleOptions,
|
14
16
|
@Inject(forwardRef(() => HttpService))
|
15
17
|
private readonly httpService: HttpService,
|
16
|
-
) {
|
18
|
+
) {}
|
19
|
+
|
20
|
+
async onModuleInit() {
|
21
|
+
if (this.mailConfig.debug) {
|
22
|
+
this.debug = true;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
private log(...args: any[]) {
|
27
|
+
if (this.debug) {
|
28
|
+
console.log(...args);
|
29
|
+
}
|
30
|
+
}
|
17
31
|
|
18
32
|
async send(mail: Mail) {
|
33
|
+
this.log('Sending mail:', mail);
|
19
34
|
switch (this.mailConfig.type) {
|
20
35
|
case MailConfigurationTypeEnum.AWS:
|
21
36
|
return this.sendWithSES(mail);
|
@@ -81,7 +96,6 @@ export class MailService {
|
|
81
96
|
|
82
97
|
return encodedMessage;
|
83
98
|
} else {
|
84
|
-
|
85
99
|
const encodedSubject = `=?utf-8?B?${Buffer.from(mail.subject).toString('base64')}?=`;
|
86
100
|
|
87
101
|
const messageParts = [
|
@@ -115,10 +129,20 @@ export class MailService {
|
|
115
129
|
host,
|
116
130
|
port,
|
117
131
|
secure = false,
|
132
|
+
rejectUnauthorized = true,
|
118
133
|
} = this.mailConfig;
|
119
134
|
|
120
135
|
const nodemailer = await import('nodemailer');
|
121
136
|
|
137
|
+
this.log(`Sending mail with SMTP`, {
|
138
|
+
host,
|
139
|
+
port,
|
140
|
+
secure,
|
141
|
+
user,
|
142
|
+
pass,
|
143
|
+
rejectUnauthorized,
|
144
|
+
});
|
145
|
+
|
122
146
|
const transporter = nodemailer.createTransport({
|
123
147
|
host,
|
124
148
|
port,
|
@@ -127,9 +151,12 @@ export class MailService {
|
|
127
151
|
user,
|
128
152
|
pass,
|
129
153
|
},
|
154
|
+
tls: {
|
155
|
+
rejectUnauthorized,
|
156
|
+
},
|
130
157
|
});
|
131
158
|
|
132
|
-
|
159
|
+
const result = await transporter.sendMail({
|
133
160
|
from: mail.from || process.env.SMTP_FROM || process.env.SMTP_USER,
|
134
161
|
to: mail.to,
|
135
162
|
subject: mail.subject,
|
@@ -139,6 +166,10 @@ export class MailService {
|
|
139
166
|
replyTo: mail.replyTo,
|
140
167
|
priority: mail.priority,
|
141
168
|
});
|
169
|
+
|
170
|
+
this.log('Email sent:', result);
|
171
|
+
|
172
|
+
return result;
|
142
173
|
}
|
143
174
|
|
144
175
|
async sendWithGmail(mail: Mail) {
|
@@ -148,6 +179,13 @@ export class MailService {
|
|
148
179
|
const { clientId, clientSecret, from, refreshToken } = this.mailConfig;
|
149
180
|
const redirectURI = 'https://developers.google.com/oauthplayground';
|
150
181
|
|
182
|
+
this.log(`Sending mail with Gmail`, {
|
183
|
+
clientId,
|
184
|
+
clientSecret,
|
185
|
+
from,
|
186
|
+
refreshToken,
|
187
|
+
});
|
188
|
+
|
151
189
|
const { auth } = await import('googleapis/build/src/apis/oauth2');
|
152
190
|
|
153
191
|
const oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectURI);
|
@@ -176,7 +214,11 @@ export class MailService {
|
|
176
214
|
|
177
215
|
const response = this.httpService.post(url, requestBody, { headers });
|
178
216
|
|
179
|
-
|
217
|
+
const result = await firstValueFrom(response);
|
218
|
+
|
219
|
+
this.log('Email sent:', result);
|
220
|
+
|
221
|
+
return result;
|
180
222
|
}
|
181
223
|
|
182
224
|
async sendWithSES(mail: Mail) {
|
@@ -185,6 +227,13 @@ export class MailService {
|
|
185
227
|
}
|
186
228
|
const { region, from, accessKeyId, secretAccessKey } = this.mailConfig;
|
187
229
|
|
230
|
+
this.log(`Sending mail with AWS SES`, {
|
231
|
+
region,
|
232
|
+
from,
|
233
|
+
accessKeyId,
|
234
|
+
secretAccessKey,
|
235
|
+
});
|
236
|
+
|
188
237
|
const { SES } = await import('aws-sdk');
|
189
238
|
|
190
239
|
const ses = new SES({
|
@@ -297,7 +346,11 @@ export class MailService {
|
|
297
346
|
Source: from,
|
298
347
|
};
|
299
348
|
|
300
|
-
|
349
|
+
const result = await ses.sendEmail(params).promise();
|
350
|
+
|
351
|
+
this.log('Email sent:', result);
|
352
|
+
|
353
|
+
return result;
|
301
354
|
}
|
302
355
|
}
|
303
356
|
}
|