@xacos/mail 1.0.0
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/LICENSE +21 -0
- package/README.md +17 -0
- package/dist/MailManager.d.ts +10 -0
- package/dist/MailManager.d.ts.map +1 -0
- package/dist/MailManager.js +69 -0
- package/dist/MailManager.js.map +1 -0
- package/dist/Mailer.d.ts +19 -0
- package/dist/Mailer.d.ts.map +1 -0
- package/dist/Mailer.js +3 -0
- package/dist/Mailer.js.map +1 -0
- package/dist/drivers/LogMailer.d.ts +7 -0
- package/dist/drivers/LogMailer.d.ts.map +1 -0
- package/dist/drivers/LogMailer.js +28 -0
- package/dist/drivers/LogMailer.js.map +1 -0
- package/dist/drivers/MailgunMailer.d.ts +14 -0
- package/dist/drivers/MailgunMailer.d.ts.map +1 -0
- package/dist/drivers/MailgunMailer.js +43 -0
- package/dist/drivers/MailgunMailer.js.map +1 -0
- package/dist/drivers/PostmarkMailer.d.ts +12 -0
- package/dist/drivers/PostmarkMailer.d.ts.map +1 -0
- package/dist/drivers/PostmarkMailer.js +41 -0
- package/dist/drivers/PostmarkMailer.js.map +1 -0
- package/dist/drivers/ResendMailer.d.ts +12 -0
- package/dist/drivers/ResendMailer.d.ts.map +1 -0
- package/dist/drivers/ResendMailer.js +44 -0
- package/dist/drivers/ResendMailer.js.map +1 -0
- package/dist/drivers/SesMailer.d.ts +14 -0
- package/dist/drivers/SesMailer.d.ts.map +1 -0
- package/dist/drivers/SesMailer.js +52 -0
- package/dist/drivers/SesMailer.js.map +1 -0
- package/dist/drivers/SmtpMailer.d.ts +15 -0
- package/dist/drivers/SmtpMailer.d.ts.map +1 -0
- package/dist/drivers/SmtpMailer.js +46 -0
- package/dist/drivers/SmtpMailer.js.map +1 -0
- package/dist/drivers/drivers.test.d.ts +2 -0
- package/dist/drivers/drivers.test.d.ts.map +1 -0
- package/dist/drivers/drivers.test.js +30 -0
- package/dist/drivers/drivers.test.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +18 -0
- package/dist/index.test.js.map +1 -0
- package/dist/utils/interpolate.d.ts +6 -0
- package/dist/utils/interpolate.d.ts.map +1 -0
- package/dist/utils/interpolate.js +10 -0
- package/dist/utils/interpolate.js.map +1 -0
- package/package.json +76 -0
- package/src/MailManager.ts +76 -0
- package/src/Mailer.ts +22 -0
- package/src/drivers/LogMailer.ts +29 -0
- package/src/drivers/MailgunMailer.ts +56 -0
- package/src/drivers/PostmarkMailer.ts +53 -0
- package/src/drivers/ResendMailer.ts +56 -0
- package/src/drivers/SesMailer.ts +64 -0
- package/src/drivers/SmtpMailer.ts +59 -0
- package/src/drivers/drivers.test.ts +34 -0
- package/src/index.test.ts +23 -0
- package/src/index.ts +11 -0
- package/src/utils/interpolate.ts +10 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 XAOCS Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @xacos/mail
|
|
2
|
+
|
|
3
|
+
> Part of the [XAOCS Framework](https://xaocs.dev) — full-stack TypeScript, built for AI-native development.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @xacos/mail
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Docs
|
|
12
|
+
|
|
13
|
+
Full documentation at [xaocs.dev/docs/mail](https://xaocs.dev/docs/mail).
|
|
14
|
+
|
|
15
|
+
## License
|
|
16
|
+
|
|
17
|
+
MIT © XAOCS Team
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { XacosConfig } from '@xacos/config';
|
|
2
|
+
import type { Mailer, MailMessage, MailResult } from './Mailer';
|
|
3
|
+
export declare class MailManager {
|
|
4
|
+
private config;
|
|
5
|
+
private mailer;
|
|
6
|
+
constructor(config?: XacosConfig['mail']);
|
|
7
|
+
getMailer(): Mailer;
|
|
8
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=MailManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../src/MailManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAShE,qBAAa,WAAW;IAGV,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,GAAE,WAAW,CAAC,MAAM,CAAM;IAEpD,SAAS,IAAI,MAAM;IAwDb,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAGtD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { LogMailer } from './drivers/LogMailer';
|
|
2
|
+
import { SmtpMailer } from './drivers/SmtpMailer';
|
|
3
|
+
import { SesMailer } from './drivers/SesMailer';
|
|
4
|
+
import { MailgunMailer } from './drivers/MailgunMailer';
|
|
5
|
+
import { PostmarkMailer } from './drivers/PostmarkMailer';
|
|
6
|
+
import { ResendMailer } from './drivers/ResendMailer';
|
|
7
|
+
export class MailManager {
|
|
8
|
+
config;
|
|
9
|
+
mailer = null;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
getMailer() {
|
|
14
|
+
if (this.mailer)
|
|
15
|
+
return this.mailer;
|
|
16
|
+
const config = this.config ?? {};
|
|
17
|
+
const driver = config.driver ?? 'log';
|
|
18
|
+
switch (driver) {
|
|
19
|
+
case 'smtp':
|
|
20
|
+
this.mailer = new SmtpMailer({
|
|
21
|
+
host: config.host ?? 'localhost',
|
|
22
|
+
port: config.port ?? 587,
|
|
23
|
+
user: config.user ?? '',
|
|
24
|
+
pass: config.pass ?? '',
|
|
25
|
+
from: config.from ?? 'noreply@xacos.dev',
|
|
26
|
+
});
|
|
27
|
+
break;
|
|
28
|
+
case 'ses':
|
|
29
|
+
if (!config.ses)
|
|
30
|
+
throw new Error('[XAOCS Mail] SES config missing');
|
|
31
|
+
this.mailer = new SesMailer({
|
|
32
|
+
region: config.ses.region ?? 'us-east-1',
|
|
33
|
+
key: config.ses.key ?? '',
|
|
34
|
+
secret: config.ses.secret ?? '',
|
|
35
|
+
from: config.from ?? 'noreply@xacos.dev',
|
|
36
|
+
});
|
|
37
|
+
break;
|
|
38
|
+
case 'mailgun':
|
|
39
|
+
this.mailer = new MailgunMailer({
|
|
40
|
+
apiKey: process.env['MAILGUN_API_KEY'] ?? '',
|
|
41
|
+
domain: process.env['MAILGUN_DOMAIN'] ?? '',
|
|
42
|
+
from: config.from ?? 'noreply@xacos.dev',
|
|
43
|
+
host: process.env['MAILGUN_HOST'] ?? undefined,
|
|
44
|
+
});
|
|
45
|
+
break;
|
|
46
|
+
case 'postmark':
|
|
47
|
+
this.mailer = new PostmarkMailer({
|
|
48
|
+
serverToken: process.env['POSTMARK_SERVER_TOKEN'] ?? '',
|
|
49
|
+
from: config.from ?? 'noreply@xacos.dev',
|
|
50
|
+
});
|
|
51
|
+
break;
|
|
52
|
+
case 'resend':
|
|
53
|
+
this.mailer = new ResendMailer({
|
|
54
|
+
apiKey: process.env['RESEND_API_KEY'] ?? '',
|
|
55
|
+
from: config.from ?? 'noreply@xacos.dev',
|
|
56
|
+
});
|
|
57
|
+
break;
|
|
58
|
+
case 'log':
|
|
59
|
+
default:
|
|
60
|
+
this.mailer = new LogMailer(config.from);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
return this.mailer;
|
|
64
|
+
}
|
|
65
|
+
async send(message) {
|
|
66
|
+
return this.getMailer().send(message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=MailManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../src/MailManager.ts"],"names":[],"mappings":"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"}
|
package/dist/Mailer.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface MailMessage {
|
|
2
|
+
from?: string;
|
|
3
|
+
to: string | string[];
|
|
4
|
+
subject: string;
|
|
5
|
+
template?: string;
|
|
6
|
+
data?: Record<string, any>;
|
|
7
|
+
text?: string;
|
|
8
|
+
html?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MailResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
messageId?: string | undefined;
|
|
13
|
+
error?: string | undefined;
|
|
14
|
+
provider: string;
|
|
15
|
+
}
|
|
16
|
+
export declare abstract class Mailer {
|
|
17
|
+
abstract send(message: MailMessage): Promise<MailResult>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=Mailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mailer.d.ts","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,8BAAsB,MAAM;IAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CACzD"}
|
package/dist/Mailer.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mailer.js","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAgB,MAAM;CAE3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/LogMailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,qBAAa,SAAU,YAAW,MAAM;IAC1B,OAAO,CAAC,IAAI;gBAAJ,IAAI,GAAE,MAA4B;IAGhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoBtD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { interpolate } from '../utils/interpolate';
|
|
2
|
+
export class LogMailer {
|
|
3
|
+
from;
|
|
4
|
+
constructor(from = 'noreply@xacos.dev') {
|
|
5
|
+
this.from = from;
|
|
6
|
+
}
|
|
7
|
+
async send(message) {
|
|
8
|
+
const subject = interpolate(message.subject, message.data ?? {});
|
|
9
|
+
const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
|
|
10
|
+
const html = message.template
|
|
11
|
+
? interpolate(message.template, message.data ?? {})
|
|
12
|
+
: (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
|
|
13
|
+
console.log('\n--- [MAIL LOG] ---');
|
|
14
|
+
console.log('From: ', message.from ?? this.from);
|
|
15
|
+
console.log('To: ', message.to);
|
|
16
|
+
console.log('Subject:', subject);
|
|
17
|
+
if (text)
|
|
18
|
+
console.log('Text: ', text);
|
|
19
|
+
if (html)
|
|
20
|
+
console.log('HTML: ', '[Rendered HTML Content]');
|
|
21
|
+
console.log('------------------\n');
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
provider: 'log',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=LogMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogMailer.js","sourceRoot":"","sources":["../../src/drivers/LogMailer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,OAAe,mBAAmB;QAAlC,SAAI,GAAJ,IAAI,CAA8B;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEpC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Mailer, MailMessage, MailResult } from '../Mailer';
|
|
2
|
+
export interface MailgunConfig {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
domain: string;
|
|
5
|
+
from: string;
|
|
6
|
+
host?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare class MailgunMailer implements Mailer {
|
|
9
|
+
private client;
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: MailgunConfig);
|
|
12
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=MailgunMailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailgunMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/MailgunMailer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,MAAM,CAAqD;IACnE,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAU3B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA4BtD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Mailgun from 'mailgun.js';
|
|
2
|
+
import FormData from 'form-data';
|
|
3
|
+
import { interpolate } from '../utils/interpolate';
|
|
4
|
+
export class MailgunMailer {
|
|
5
|
+
client;
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
const mg = new Mailgun(FormData);
|
|
10
|
+
this.client = mg.client({
|
|
11
|
+
username: 'api',
|
|
12
|
+
key: config.apiKey,
|
|
13
|
+
url: config.host ?? 'https://api.mailgun.net',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async send(message) {
|
|
17
|
+
const html = message.template
|
|
18
|
+
? interpolate(message.template, message.data ?? {})
|
|
19
|
+
: message.html ?? '';
|
|
20
|
+
try {
|
|
21
|
+
const response = await this.client.messages.create(this.config.domain, {
|
|
22
|
+
from: message.from ?? this.config.from,
|
|
23
|
+
to: Array.isArray(message.to) ? message.to : [message.to],
|
|
24
|
+
subject: message.subject,
|
|
25
|
+
html,
|
|
26
|
+
text: message.text,
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
success: true,
|
|
30
|
+
messageId: response.id,
|
|
31
|
+
provider: 'mailgun',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: error.message,
|
|
38
|
+
provider: 'mailgun',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=MailgunMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailgunMailer.js","sourceRoot":"","sources":["../../src/drivers/MailgunMailer.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,OAAO,aAAa;IAChB,MAAM,CAAqD;IAC3D,MAAM,CAAgB;IAE9B,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,MAAM,CAAC,MAAM;YAClB,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,yBAAyB;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACrE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;aACZ,CAAC,CAAC;YAGV,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,QAAQ,EAAE,SAAS;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,SAAS;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Mailer, MailMessage, MailResult } from '../Mailer';
|
|
2
|
+
export interface PostmarkConfig {
|
|
3
|
+
serverToken: string;
|
|
4
|
+
from: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class PostmarkMailer implements Mailer {
|
|
7
|
+
private client;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: PostmarkConfig);
|
|
10
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=PostmarkMailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostmarkMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/PostmarkMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAK5B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAiCtD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ServerClient } from 'postmark';
|
|
2
|
+
import { interpolate } from '../utils/interpolate';
|
|
3
|
+
export class PostmarkMailer {
|
|
4
|
+
client;
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.client = new ServerClient(config.serverToken);
|
|
9
|
+
}
|
|
10
|
+
async send(message) {
|
|
11
|
+
const htmlBody = message.template
|
|
12
|
+
? interpolate(message.template, message.data ?? {})
|
|
13
|
+
: message.html ?? '';
|
|
14
|
+
try {
|
|
15
|
+
const messageData = {
|
|
16
|
+
From: message.from ?? this.config.from,
|
|
17
|
+
To: Array.isArray(message.to) ? message.to.join(',') : message.to,
|
|
18
|
+
Subject: message.subject,
|
|
19
|
+
MessageStream: 'outbound',
|
|
20
|
+
};
|
|
21
|
+
if (htmlBody)
|
|
22
|
+
messageData.HtmlBody = htmlBody;
|
|
23
|
+
if (message.text)
|
|
24
|
+
messageData.TextBody = message.text;
|
|
25
|
+
const response = await this.client.sendEmail(messageData);
|
|
26
|
+
return {
|
|
27
|
+
success: true,
|
|
28
|
+
messageId: response.MessageID,
|
|
29
|
+
provider: 'postmark',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: error.message,
|
|
36
|
+
provider: 'postmark',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=PostmarkMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostmarkMailer.js","sourceRoot":"","sources":["../../src/drivers/PostmarkMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOnD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAe;IACrB,MAAM,CAAiB;IAE/B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;YAC/B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,WAAW,GAAQ;gBACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBACjE,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,aAAa,EAAE,UAAU;aAC1B,CAAC;YAEF,IAAI,QAAQ;gBAAE,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC9C,IAAI,OAAO,CAAC,IAAI;gBAAE,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAEtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAI1D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,UAAU;aACrB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,UAAU;aACrB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Mailer, MailMessage, MailResult } from '../Mailer';
|
|
2
|
+
export interface ResendConfig {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
from: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ResendMailer implements Mailer {
|
|
7
|
+
private client;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: ResendConfig);
|
|
10
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ResendMailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResendMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/ResendMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAK1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoCtD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Resend } from 'resend';
|
|
2
|
+
import { interpolate } from '../utils/interpolate';
|
|
3
|
+
export class ResendMailer {
|
|
4
|
+
client;
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.client = new Resend(config.apiKey);
|
|
9
|
+
}
|
|
10
|
+
async send(message) {
|
|
11
|
+
const html = message.template
|
|
12
|
+
? interpolate(message.template, message.data ?? {})
|
|
13
|
+
: message.html ?? '';
|
|
14
|
+
try {
|
|
15
|
+
const response = await this.client.emails.send({
|
|
16
|
+
from: message.from ?? this.config.from,
|
|
17
|
+
to: Array.isArray(message.to) ? message.to : [message.to],
|
|
18
|
+
subject: message.subject,
|
|
19
|
+
html,
|
|
20
|
+
text: message.text,
|
|
21
|
+
});
|
|
22
|
+
if (response.error) {
|
|
23
|
+
return {
|
|
24
|
+
success: false,
|
|
25
|
+
error: response.error.message,
|
|
26
|
+
provider: 'resend',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
success: true,
|
|
31
|
+
messageId: response.data?.id,
|
|
32
|
+
provider: 'resend',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: error.message,
|
|
39
|
+
provider: 'resend',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ResendMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResendMailer.js","sourceRoot":"","sources":["../../src/drivers/ResendMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOnD,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,MAAM,CAAe;IAE7B,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;aACZ,CAAC,CAAC;YAGV,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;oBAC7B,QAAQ,EAAE,QAAQ;iBACnB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE;gBAC5B,QAAQ,EAAE,QAAQ;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,QAAQ;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Mailer, MailMessage, MailResult } from '../Mailer';
|
|
2
|
+
export interface SesConfig {
|
|
3
|
+
region: string;
|
|
4
|
+
key: string;
|
|
5
|
+
secret: string;
|
|
6
|
+
from: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SesMailer implements Mailer {
|
|
9
|
+
private client;
|
|
10
|
+
private defaultFrom;
|
|
11
|
+
constructor(config: SesConfig);
|
|
12
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=SesMailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SesMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/SesMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,SAAU,YAAW,MAAM;IACtC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,SAAS;IAWvB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoCtD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
|
|
2
|
+
import { interpolate } from '../utils/interpolate';
|
|
3
|
+
export class SesMailer {
|
|
4
|
+
client;
|
|
5
|
+
defaultFrom;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.defaultFrom = config.from;
|
|
8
|
+
this.client = new SESClient({
|
|
9
|
+
region: config.region,
|
|
10
|
+
credentials: {
|
|
11
|
+
accessKeyId: config.key,
|
|
12
|
+
secretAccessKey: config.secret,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async send(message) {
|
|
17
|
+
const subject = interpolate(message.subject, message.data ?? {});
|
|
18
|
+
const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
|
|
19
|
+
const html = message.template
|
|
20
|
+
? interpolate(message.template, message.data ?? {})
|
|
21
|
+
: (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
|
|
22
|
+
const command = new SendEmailCommand({
|
|
23
|
+
Source: message.from ?? this.defaultFrom,
|
|
24
|
+
Destination: {
|
|
25
|
+
ToAddresses: Array.isArray(message.to) ? message.to : [message.to],
|
|
26
|
+
},
|
|
27
|
+
Message: {
|
|
28
|
+
Subject: { Data: subject },
|
|
29
|
+
Body: {
|
|
30
|
+
Text: text ? { Data: text } : undefined,
|
|
31
|
+
Html: html ? { Data: html } : undefined,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
const response = await this.client.send(command);
|
|
37
|
+
return {
|
|
38
|
+
success: true,
|
|
39
|
+
messageId: response.MessageId,
|
|
40
|
+
provider: 'ses',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
error: error.message,
|
|
47
|
+
provider: 'ses',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=SesMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SesMailer.js","sourceRoot":"","sources":["../../src/drivers/SesMailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,OAAO,SAAS;IACZ,MAAM,CAAY;IAClB,WAAW,CAAS;IAE5B,YAAY,MAAiB;QAC3B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,GAAG;gBACvB,eAAe,EAAE,MAAM,CAAC,MAAM;aAC/B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;YACxC,WAAW,EAAE;gBACX,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;aACnE;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC1B,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;oBACvC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;iBACxC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Mailer, MailMessage, MailResult } from '../Mailer';
|
|
2
|
+
export interface SmtpConfig {
|
|
3
|
+
host: string;
|
|
4
|
+
port: number;
|
|
5
|
+
user: string;
|
|
6
|
+
pass: string;
|
|
7
|
+
from: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class SmtpMailer implements Mailer {
|
|
10
|
+
private transporter;
|
|
11
|
+
private defaultFrom;
|
|
12
|
+
constructor(config: SmtpConfig);
|
|
13
|
+
send(message: MailMessage): Promise<MailResult>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=SmtpMailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmtpMailer.d.ts","sourceRoot":"","sources":["../../src/drivers/SmtpMailer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAW,YAAW,MAAM;IACvC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,UAAU;IAYxB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA6BtD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import nodemailer from 'nodemailer';
|
|
2
|
+
import { interpolate } from '../utils/interpolate';
|
|
3
|
+
export class SmtpMailer {
|
|
4
|
+
transporter;
|
|
5
|
+
defaultFrom;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.defaultFrom = config.from;
|
|
8
|
+
this.transporter = nodemailer.createTransport({
|
|
9
|
+
host: config.host,
|
|
10
|
+
port: config.port,
|
|
11
|
+
auth: {
|
|
12
|
+
user: config.user,
|
|
13
|
+
pass: config.pass,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async send(message) {
|
|
18
|
+
const subject = interpolate(message.subject, message.data ?? {});
|
|
19
|
+
const text = message.text ? interpolate(message.text, message.data ?? {}) : undefined;
|
|
20
|
+
const html = message.template
|
|
21
|
+
? interpolate(message.template, message.data ?? {})
|
|
22
|
+
: (message.html ? interpolate(message.html, message.data ?? {}) : undefined);
|
|
23
|
+
try {
|
|
24
|
+
const response = await this.transporter.sendMail({
|
|
25
|
+
from: message.from ?? this.defaultFrom,
|
|
26
|
+
to: Array.isArray(message.to) ? message.to.join(', ') : message.to,
|
|
27
|
+
subject,
|
|
28
|
+
text,
|
|
29
|
+
html,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
success: true,
|
|
33
|
+
messageId: response.messageId,
|
|
34
|
+
provider: 'smtp',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
error: error.message,
|
|
41
|
+
provider: 'smtp',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=SmtpMailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmtpMailer.js","sourceRoot":"","sources":["../../src/drivers/SmtpMailer.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD,MAAM,OAAO,UAAU;IACb,WAAW,CAAyB;IACpC,WAAW,CAAS;IAE5B,YAAY,MAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC;YAC5C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;gBACtC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;gBAClE,OAAO;gBACP,IAAI;gBACJ,IAAI;aACL,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,MAAM;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,QAAQ,EAAE,MAAM;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drivers.test.d.ts","sourceRoot":"","sources":["../../src/drivers/drivers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from "bun:test";
|
|
2
|
+
import { MailgunMailer } from "./MailgunMailer";
|
|
3
|
+
import { PostmarkMailer } from "./PostmarkMailer";
|
|
4
|
+
import { ResendMailer } from "./ResendMailer";
|
|
5
|
+
describe("MailgunMailer", () => {
|
|
6
|
+
it("constructs without throwing", () => {
|
|
7
|
+
expect(() => new MailgunMailer({
|
|
8
|
+
apiKey: "key-test",
|
|
9
|
+
domain: "test.example.com",
|
|
10
|
+
from: "test@example.com",
|
|
11
|
+
})).not.toThrow();
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
describe("PostmarkMailer", () => {
|
|
15
|
+
it("constructs without throwing", () => {
|
|
16
|
+
expect(() => new PostmarkMailer({
|
|
17
|
+
serverToken: "token-test",
|
|
18
|
+
from: "test@example.com",
|
|
19
|
+
})).not.toThrow();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe("ResendMailer", () => {
|
|
23
|
+
it("constructs without throwing", () => {
|
|
24
|
+
expect(() => new ResendMailer({
|
|
25
|
+
apiKey: "re_test",
|
|
26
|
+
from: "test@example.com",
|
|
27
|
+
})).not.toThrow();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=drivers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drivers.test.js","sourceRoot":"","sources":["../../src/drivers/drivers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC;YAC9B,WAAW,EAAE,YAAY;YACzB,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC;YAC5B,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './Mailer';
|
|
2
|
+
export * from './MailManager';
|
|
3
|
+
export * from './drivers/LogMailer';
|
|
4
|
+
export * from './drivers/SmtpMailer';
|
|
5
|
+
export * from './drivers/SesMailer';
|
|
6
|
+
export * from './drivers/MailgunMailer';
|
|
7
|
+
export * from './drivers/PostmarkMailer';
|
|
8
|
+
export * from './drivers/ResendMailer';
|
|
9
|
+
export * from './utils/interpolate';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './Mailer';
|
|
2
|
+
export * from './MailManager';
|
|
3
|
+
export * from './drivers/LogMailer';
|
|
4
|
+
export * from './drivers/SmtpMailer';
|
|
5
|
+
export * from './drivers/SesMailer';
|
|
6
|
+
export * from './drivers/MailgunMailer';
|
|
7
|
+
export * from './drivers/PostmarkMailer';
|
|
8
|
+
export * from './drivers/ResendMailer';
|
|
9
|
+
export * from './utils/interpolate';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|