@impruthvi/nodemail 0.2.0 â 0.3.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/CHANGELOG.md +27 -0
- package/README.md +79 -14
- package/dist/core/MailManager.d.ts.map +1 -1
- package/dist/core/MailManager.js +9 -0
- package/dist/core/MailManager.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/providers/MailgunProvider.d.ts +15 -0
- package/dist/providers/MailgunProvider.d.ts.map +1 -0
- package/dist/providers/MailgunProvider.js +103 -0
- package/dist/providers/MailgunProvider.js.map +1 -0
- package/dist/providers/PostmarkProvider.d.ts +11 -0
- package/dist/providers/PostmarkProvider.d.ts.map +1 -0
- package/dist/providers/PostmarkProvider.js +84 -0
- package/dist/providers/PostmarkProvider.js.map +1 -0
- package/dist/providers/ResendProvider.d.ts +11 -0
- package/dist/providers/ResendProvider.d.ts.map +1 -0
- package/dist/providers/ResendProvider.js +82 -0
- package/dist/providers/ResendProvider.js.map +1 -0
- package/examples/mailgun.ts +26 -0
- package/examples/postmark.ts +25 -0
- package/examples/resend.ts +25 -0
- package/package.json +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.0] - 2025-11-25
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **New email providers** (3 additional providers)
|
|
14
|
+
- MailgunProvider with dynamic loading
|
|
15
|
+
- ResendProvider with dynamic loading
|
|
16
|
+
- PostmarkProvider with dynamic loading
|
|
17
|
+
- Example files for new providers
|
|
18
|
+
- examples/mailgun.ts
|
|
19
|
+
- examples/resend.ts
|
|
20
|
+
- examples/postmark.ts
|
|
21
|
+
- Support for all provider-specific features
|
|
22
|
+
- Mailgun: EU region support, custom headers
|
|
23
|
+
- Resend: Tags and custom headers
|
|
24
|
+
- Postmark: Message streams and tags
|
|
25
|
+
- Updated MailManager to support 6 total providers
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Updated README with documentation for Mailgun, Resend, and Postmark
|
|
29
|
+
- Updated package.json to version 0.3.0
|
|
30
|
+
- Added form-data as peer dependency for Mailgun
|
|
31
|
+
- Updated provider installation instructions
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- TypeScript strict mode compliance for new providers
|
|
35
|
+
- ESLint warnings with proper annotations
|
|
36
|
+
|
|
10
37
|
## [0.2.0] - 2025-11-23
|
|
11
38
|
|
|
12
39
|
### Added
|
package/README.md
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
# nodemail
|
|
1
|
+
# @impruthvi/nodemail
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@impruthvi/nodemail)
|
|
3
4
|
[](https://opensource.org/licenses/MIT)
|
|
4
5
|
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](https://github.com/impruthvi/nodemail)
|
|
7
|
+
[](https://github.com/impruthvi/nodemail)
|
|
5
8
|
|
|
6
9
|
> ð§ **Work in Progress** - A unified mail service for Node.js/TypeScript inspired by Laravel's elegant Mail system.
|
|
7
10
|
|
|
8
|
-
|
|
11
|
+
**@impruthvi/nodemail** aims to bring the simplicity and elegance of Laravel's Mail system to the Node.js ecosystem with full TypeScript support.
|
|
9
12
|
|
|
10
13
|
## ðŊ Vision
|
|
11
14
|
|
|
@@ -20,7 +23,7 @@ Inspired by [Laravel's Mail system](https://laravel.com/docs/mail).
|
|
|
20
23
|
## âĻ Features
|
|
21
24
|
|
|
22
25
|
### â
Available Now
|
|
23
|
-
- ðŊ **Multiple Providers** - SMTP (Nodemailer), SendGrid, AWS SES
|
|
26
|
+
- ðŊ **Multiple Providers** - SMTP (Nodemailer), SendGrid, AWS SES, Mailgun, Resend, Postmark
|
|
24
27
|
- ðŠķ **Lightweight** - Only ~25MB with SMTP, install additional providers as needed
|
|
25
28
|
- ð **Type-Safe** - Full TypeScript support with strict typing
|
|
26
29
|
- ðĻ **Fluent API** - Chainable, Laravel-inspired interface
|
|
@@ -35,12 +38,17 @@ Inspired by [Laravel's Mail system](https://laravel.com/docs/mail).
|
|
|
35
38
|
- ðĶ **Queue Support** - Background email sending (Bull/BullMQ)
|
|
36
39
|
- ðĻ **Template Engines** - Handlebars, EJS, Pug
|
|
37
40
|
- ð **i18n Support** - Multi-language emails
|
|
38
|
-
- ð **More Providers** -
|
|
41
|
+
- ð **More Providers** - Mailtrap and others
|
|
39
42
|
|
|
40
43
|
## ðĶ Installation
|
|
41
44
|
|
|
42
45
|
```bash
|
|
43
|
-
npm install nodemail
|
|
46
|
+
npm install @impruthvi/nodemail@beta
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Or for the latest stable (when v1.0.0 is released):
|
|
50
|
+
```bash
|
|
51
|
+
npm install @impruthvi/nodemail
|
|
44
52
|
```
|
|
45
53
|
|
|
46
54
|
**Lightweight by default!** Only includes SMTP support (~25MB).
|
|
@@ -54,17 +62,14 @@ npm install @sendgrid/mail
|
|
|
54
62
|
|
|
55
63
|
# AWS SES (â
Implemented)
|
|
56
64
|
npm install @aws-sdk/client-ses
|
|
57
|
-
```
|
|
58
65
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# Mailgun
|
|
62
|
-
npm install mailgun.js
|
|
66
|
+
# Mailgun (â
Implemented)
|
|
67
|
+
npm install mailgun.js form-data
|
|
63
68
|
|
|
64
|
-
# Resend
|
|
69
|
+
# Resend (â
Implemented)
|
|
65
70
|
npm install resend
|
|
66
71
|
|
|
67
|
-
# Postmark
|
|
72
|
+
# Postmark (â
Implemented)
|
|
68
73
|
npm install postmark
|
|
69
74
|
```
|
|
70
75
|
|
|
@@ -105,6 +110,8 @@ await Mail.to('user@example.com')
|
|
|
105
110
|
|
|
106
111
|
```typescript
|
|
107
112
|
// npm install @sendgrid/mail
|
|
113
|
+
import { Mail } from '@impruthvi/nodemail';
|
|
114
|
+
|
|
108
115
|
Mail.configure({
|
|
109
116
|
default: 'sendgrid',
|
|
110
117
|
from: { address: 'noreply@example.com', name: 'My App' },
|
|
@@ -121,6 +128,8 @@ Mail.configure({
|
|
|
121
128
|
|
|
122
129
|
```typescript
|
|
123
130
|
// npm install @aws-sdk/client-ses
|
|
131
|
+
import { Mail } from '@impruthvi/nodemail';
|
|
132
|
+
|
|
124
133
|
Mail.configure({
|
|
125
134
|
default: 'ses',
|
|
126
135
|
from: { address: 'noreply@example.com', name: 'My App' },
|
|
@@ -135,6 +144,62 @@ Mail.configure({
|
|
|
135
144
|
});
|
|
136
145
|
```
|
|
137
146
|
|
|
147
|
+
### Mailgun
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// npm install mailgun.js form-data
|
|
151
|
+
import { Mail } from '@impruthvi/nodemail';
|
|
152
|
+
|
|
153
|
+
Mail.configure({
|
|
154
|
+
default: 'mailgun',
|
|
155
|
+
from: { address: 'noreply@yourdomain.com', name: 'My App' },
|
|
156
|
+
mailers: {
|
|
157
|
+
mailgun: {
|
|
158
|
+
driver: 'mailgun',
|
|
159
|
+
domain: process.env.MAILGUN_DOMAIN,
|
|
160
|
+
apiKey: process.env.MAILGUN_API_KEY,
|
|
161
|
+
region: 'us', // or 'eu'
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Resend
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// npm install resend
|
|
171
|
+
import { Mail } from '@impruthvi/nodemail';
|
|
172
|
+
|
|
173
|
+
Mail.configure({
|
|
174
|
+
default: 'resend',
|
|
175
|
+
from: { address: 'noreply@yourdomain.com', name: 'My App' },
|
|
176
|
+
mailers: {
|
|
177
|
+
resend: {
|
|
178
|
+
driver: 'resend',
|
|
179
|
+
apiKey: process.env.RESEND_API_KEY,
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Postmark
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// npm install postmark
|
|
189
|
+
import { Mail } from '@impruthvi/nodemail';
|
|
190
|
+
|
|
191
|
+
Mail.configure({
|
|
192
|
+
default: 'postmark',
|
|
193
|
+
from: { address: 'noreply@yourdomain.com', name: 'My App' },
|
|
194
|
+
mailers: {
|
|
195
|
+
postmark: {
|
|
196
|
+
driver: 'postmark',
|
|
197
|
+
serverToken: process.env.POSTMARK_SERVER_TOKEN,
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
138
203
|
**Advanced usage (coming soon):**
|
|
139
204
|
|
|
140
205
|
```typescript
|
|
@@ -281,10 +346,10 @@ If you've used Laravel's Mail system, you know how elegant it is:
|
|
|
281
346
|
Mail::to($user->email)->send(new WelcomeEmail($user));
|
|
282
347
|
```
|
|
283
348
|
|
|
284
|
-
|
|
349
|
+
**@impruthvi/nodemail** brings this same elegance to Node.js/TypeScript:
|
|
285
350
|
|
|
286
351
|
```typescript
|
|
287
|
-
// nodemail (TypeScript)
|
|
352
|
+
// @impruthvi/nodemail (TypeScript)
|
|
288
353
|
await Mail.to(user.email).send(new WelcomeEmail(user));
|
|
289
354
|
```
|
|
290
355
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,YAAY,EAEb,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"MailManager.d.ts","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,YAAY,EAEb,MAAM,UAAU,CAAC;AAQlB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAwC;gBAE7C,MAAM,EAAE,UAAU;IAO9B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,WAAW;IAyBnB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAO7B,MAAM,CAAC,IAAI,EAAE,MAAM;IAab,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAQvD,gBAAgB,IAAI,MAAM;CAG3B;AAKD,qBAAa,cAAc;IAIvB,OAAO,CAAC,OAAO;IAHV,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;gBAGhC,OAAO,EAAE,WAAW,EAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE;IAKvB,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAKX,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;CAOpC"}
|
package/dist/core/MailManager.js
CHANGED
|
@@ -4,6 +4,9 @@ exports.MessageBuilder = exports.MailManager = void 0;
|
|
|
4
4
|
const SmtpProvider_1 = require("../providers/SmtpProvider");
|
|
5
5
|
const SendGridProvider_1 = require("../providers/SendGridProvider");
|
|
6
6
|
const SesProvider_1 = require("../providers/SesProvider");
|
|
7
|
+
const MailgunProvider_1 = require("../providers/MailgunProvider");
|
|
8
|
+
const ResendProvider_1 = require("../providers/ResendProvider");
|
|
9
|
+
const PostmarkProvider_1 = require("../providers/PostmarkProvider");
|
|
7
10
|
class MailManager {
|
|
8
11
|
config;
|
|
9
12
|
providers = new Map();
|
|
@@ -18,6 +21,12 @@ class MailManager {
|
|
|
18
21
|
return new SendGridProvider_1.SendGridProvider(mailerConfig);
|
|
19
22
|
case 'ses':
|
|
20
23
|
return new SesProvider_1.SesProvider(mailerConfig);
|
|
24
|
+
case 'mailgun':
|
|
25
|
+
return new MailgunProvider_1.MailgunProvider(mailerConfig);
|
|
26
|
+
case 'resend':
|
|
27
|
+
return new ResendProvider_1.ResendProvider(mailerConfig);
|
|
28
|
+
case 'postmark':
|
|
29
|
+
return new PostmarkProvider_1.PostmarkProvider(mailerConfig);
|
|
21
30
|
default:
|
|
22
31
|
throw new Error(`Unsupported mail driver: ${mailerConfig.driver}`);
|
|
23
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":";;;AAYA,4DAAyD;AACzD,oEAAiE;AACjE,0DAAuD;
|
|
1
|
+
{"version":3,"file":"MailManager.js","sourceRoot":"","sources":["../../src/core/MailManager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ export { Message } from './core/Message';
|
|
|
5
5
|
export { SmtpProvider } from './providers/SmtpProvider';
|
|
6
6
|
export { SendGridProvider } from './providers/SendGridProvider';
|
|
7
7
|
export { SesProvider } from './providers/SesProvider';
|
|
8
|
+
export { MailgunProvider } from './providers/MailgunProvider';
|
|
9
|
+
export { ResendProvider } from './providers/ResendProvider';
|
|
10
|
+
export { PostmarkProvider } from './providers/PostmarkProvider';
|
|
8
11
|
export * from './types';
|
|
9
|
-
export declare const VERSION = "0.
|
|
12
|
+
export declare const VERSION = "0.3.0";
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.VERSION = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.Message = exports.Mailable = exports.MailManager = exports.Mail = void 0;
|
|
17
|
+
exports.VERSION = exports.PostmarkProvider = exports.ResendProvider = exports.MailgunProvider = exports.SesProvider = exports.SendGridProvider = exports.SmtpProvider = exports.Message = exports.Mailable = exports.MailManager = exports.Mail = void 0;
|
|
18
18
|
var MailFacade_1 = require("./core/MailFacade");
|
|
19
19
|
Object.defineProperty(exports, "Mail", { enumerable: true, get: function () { return MailFacade_1.Mail; } });
|
|
20
20
|
var MailManager_1 = require("./core/MailManager");
|
|
@@ -29,6 +29,12 @@ var SendGridProvider_1 = require("./providers/SendGridProvider");
|
|
|
29
29
|
Object.defineProperty(exports, "SendGridProvider", { enumerable: true, get: function () { return SendGridProvider_1.SendGridProvider; } });
|
|
30
30
|
var SesProvider_1 = require("./providers/SesProvider");
|
|
31
31
|
Object.defineProperty(exports, "SesProvider", { enumerable: true, get: function () { return SesProvider_1.SesProvider; } });
|
|
32
|
+
var MailgunProvider_1 = require("./providers/MailgunProvider");
|
|
33
|
+
Object.defineProperty(exports, "MailgunProvider", { enumerable: true, get: function () { return MailgunProvider_1.MailgunProvider; } });
|
|
34
|
+
var ResendProvider_1 = require("./providers/ResendProvider");
|
|
35
|
+
Object.defineProperty(exports, "ResendProvider", { enumerable: true, get: function () { return ResendProvider_1.ResendProvider; } });
|
|
36
|
+
var PostmarkProvider_1 = require("./providers/PostmarkProvider");
|
|
37
|
+
Object.defineProperty(exports, "PostmarkProvider", { enumerable: true, get: function () { return PostmarkProvider_1.PostmarkProvider; } });
|
|
32
38
|
__exportStar(require("./types"), exports);
|
|
33
|
-
exports.VERSION = '0.
|
|
39
|
+
exports.VERSION = '0.3.0';
|
|
34
40
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,gDAAyC;AAAhC,kGAAA,IAAI,OAAA;AACb,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,4CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AACjB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAGhB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AACrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,gDAAyC;AAAhC,kGAAA,IAAI,OAAA;AACb,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,4CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AACjB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAGhB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AACrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AACxB,6DAA4D;AAAnD,gHAAA,cAAc,OAAA;AACvB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AAGzB,0CAAwB;AAGX,QAAA,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MailProvider, MailOptions, MailResponse } from '../types';
|
|
2
|
+
export declare class MailgunProvider implements MailProvider {
|
|
3
|
+
private client;
|
|
4
|
+
private domain;
|
|
5
|
+
constructor(config: {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
domain: string;
|
|
8
|
+
region?: 'us' | 'eu';
|
|
9
|
+
host?: string;
|
|
10
|
+
});
|
|
11
|
+
send(options: MailOptions): Promise<MailResponse>;
|
|
12
|
+
private formatAddress;
|
|
13
|
+
private formatRecipients;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=MailgunProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailgunProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MailgunProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,eAAgB,YAAW,YAAY;IAElD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAsCK,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0EvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAQzB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MailgunProvider = void 0;
|
|
4
|
+
class MailgunProvider {
|
|
5
|
+
client;
|
|
6
|
+
domain;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
if (!config.apiKey) {
|
|
9
|
+
throw new Error('Mailgun API key is required');
|
|
10
|
+
}
|
|
11
|
+
if (!config.domain) {
|
|
12
|
+
throw new Error('Mailgun domain is required');
|
|
13
|
+
}
|
|
14
|
+
this.domain = config.domain;
|
|
15
|
+
try {
|
|
16
|
+
const Mailgun = require('mailgun.js');
|
|
17
|
+
const formData = require('form-data');
|
|
18
|
+
const mailgun = new Mailgun(formData);
|
|
19
|
+
const clientOptions = {
|
|
20
|
+
key: config.apiKey,
|
|
21
|
+
};
|
|
22
|
+
if (config.region === 'eu') {
|
|
23
|
+
clientOptions.url = 'https://api.eu.mailgun.net';
|
|
24
|
+
}
|
|
25
|
+
else if (config.host) {
|
|
26
|
+
clientOptions.url = config.host;
|
|
27
|
+
}
|
|
28
|
+
this.client = mailgun.client(clientOptions);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error('Mailgun provider requires "mailgun.js" and "form-data" packages. ' +
|
|
32
|
+
'Install with: npm install mailgun.js form-data');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async send(options) {
|
|
36
|
+
try {
|
|
37
|
+
const mailgunMessage = {
|
|
38
|
+
from: options.from ? this.formatAddress(options.from) : undefined,
|
|
39
|
+
to: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]),
|
|
40
|
+
subject: options.subject,
|
|
41
|
+
};
|
|
42
|
+
if (options.cc) {
|
|
43
|
+
const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
|
|
44
|
+
mailgunMessage.cc = this.formatRecipients(cc);
|
|
45
|
+
}
|
|
46
|
+
if (options.bcc) {
|
|
47
|
+
const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
|
|
48
|
+
mailgunMessage.bcc = this.formatRecipients(bcc);
|
|
49
|
+
}
|
|
50
|
+
if (options.html) {
|
|
51
|
+
mailgunMessage.html = options.html;
|
|
52
|
+
}
|
|
53
|
+
if (options.text) {
|
|
54
|
+
mailgunMessage.text = options.text;
|
|
55
|
+
}
|
|
56
|
+
if (options.replyTo) {
|
|
57
|
+
mailgunMessage['h:Reply-To'] = this.formatAddress(options.replyTo);
|
|
58
|
+
}
|
|
59
|
+
if (options.headers) {
|
|
60
|
+
for (const [key, value] of Object.entries(options.headers)) {
|
|
61
|
+
mailgunMessage[`h:${key}`] = value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (options.attachments && options.attachments.length > 0) {
|
|
65
|
+
mailgunMessage.attachment = options.attachments.map((att) => ({
|
|
66
|
+
filename: att.filename,
|
|
67
|
+
data: att.content ? Buffer.from(att.content) : undefined,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
const result = await this.client.messages.create(this.domain, mailgunMessage);
|
|
71
|
+
return {
|
|
72
|
+
success: true,
|
|
73
|
+
messageId: result?.id,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof Error) {
|
|
78
|
+
return {
|
|
79
|
+
success: false,
|
|
80
|
+
error: `Mailgun send failed: ${error.message}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: 'Mailgun send failed with unknown error',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
formatAddress(address) {
|
|
90
|
+
if (typeof address === 'string') {
|
|
91
|
+
return address;
|
|
92
|
+
}
|
|
93
|
+
return address.name ? `${address.name} <${address.address}>` : address.address;
|
|
94
|
+
}
|
|
95
|
+
formatRecipients(addresses) {
|
|
96
|
+
if (addresses.length === 1 && addresses[0]) {
|
|
97
|
+
return this.formatAddress(addresses[0]);
|
|
98
|
+
}
|
|
99
|
+
return addresses.map((addr) => this.formatAddress(addr));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.MailgunProvider = MailgunProvider;
|
|
103
|
+
//# sourceMappingURL=MailgunProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MailgunProvider.js","sourceRoot":"","sources":["../../src/providers/MailgunProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MailProvider, MailOptions, MailResponse } from '../types';
|
|
2
|
+
export declare class PostmarkProvider implements MailProvider {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(config: {
|
|
5
|
+
serverToken: string;
|
|
6
|
+
});
|
|
7
|
+
send(options: MailOptions): Promise<MailResponse>;
|
|
8
|
+
private formatAddress;
|
|
9
|
+
private formatRecipients;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=PostmarkProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostmarkProvider.d.ts","sourceRoot":"","sources":["../../src/providers/PostmarkProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,gBAAiB,YAAW,YAAY;IAEnD,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAmBrC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4EvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostmarkProvider = void 0;
|
|
4
|
+
class PostmarkProvider {
|
|
5
|
+
client;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
if (!config.serverToken) {
|
|
8
|
+
throw new Error('Postmark server token is required');
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const postmark = require('postmark');
|
|
12
|
+
this.client = new postmark.ServerClient(config.serverToken);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error('Postmark provider requires "postmark" package. ' +
|
|
16
|
+
'Install with: npm install postmark');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async send(options) {
|
|
20
|
+
try {
|
|
21
|
+
const postmarkMessage = {
|
|
22
|
+
From: options.from ? this.formatAddress(options.from) : undefined,
|
|
23
|
+
To: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]).join(', '),
|
|
24
|
+
Subject: options.subject,
|
|
25
|
+
};
|
|
26
|
+
if (options.cc) {
|
|
27
|
+
const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
|
|
28
|
+
postmarkMessage.Cc = this.formatRecipients(cc).join(', ');
|
|
29
|
+
}
|
|
30
|
+
if (options.bcc) {
|
|
31
|
+
const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
|
|
32
|
+
postmarkMessage.Bcc = this.formatRecipients(bcc).join(', ');
|
|
33
|
+
}
|
|
34
|
+
if (options.html) {
|
|
35
|
+
postmarkMessage.HtmlBody = options.html;
|
|
36
|
+
}
|
|
37
|
+
if (options.text) {
|
|
38
|
+
postmarkMessage.TextBody = options.text;
|
|
39
|
+
}
|
|
40
|
+
if (options.replyTo) {
|
|
41
|
+
postmarkMessage.ReplyTo = this.formatAddress(options.replyTo);
|
|
42
|
+
}
|
|
43
|
+
if (options.headers) {
|
|
44
|
+
postmarkMessage.Headers = Object.entries(options.headers).map(([Name, Value]) => ({ Name, Value }));
|
|
45
|
+
}
|
|
46
|
+
if (options.attachments && options.attachments.length > 0) {
|
|
47
|
+
postmarkMessage.Attachments = options.attachments.map((att) => ({
|
|
48
|
+
Name: att.filename,
|
|
49
|
+
Content: att.content,
|
|
50
|
+
ContentType: att.contentType || 'application/octet-stream',
|
|
51
|
+
ContentID: att.cid,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
const result = await this.client.sendEmail(postmarkMessage);
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
messageId: result?.MessageID,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
error: `Postmark send failed: ${error.message}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
error: 'Postmark send failed with unknown error',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
formatAddress(address) {
|
|
74
|
+
if (typeof address === 'string') {
|
|
75
|
+
return address;
|
|
76
|
+
}
|
|
77
|
+
return address.name ? `${address.name} <${address.address}>` : address.address;
|
|
78
|
+
}
|
|
79
|
+
formatRecipients(addresses) {
|
|
80
|
+
return addresses.map((addr) => this.formatAddress(addr));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.PostmarkProvider = PostmarkProvider;
|
|
84
|
+
//# sourceMappingURL=PostmarkProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostmarkProvider.js","sourceRoot":"","sources":["../../src/providers/PostmarkProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MailProvider, MailOptions, MailResponse } from '../types';
|
|
2
|
+
export declare class ResendProvider implements MailProvider {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(config: {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
});
|
|
7
|
+
send(options: MailOptions): Promise<MailResponse>;
|
|
8
|
+
private formatAddress;
|
|
9
|
+
private formatRecipients;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ResendProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResendProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ResendProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAMrF,qBAAa,cAAe,YAAW,YAAY;IAEjD,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAmBhC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuEvD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResendProvider = void 0;
|
|
4
|
+
class ResendProvider {
|
|
5
|
+
client;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
if (!config.apiKey) {
|
|
8
|
+
throw new Error('Resend API key is required');
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const { Resend } = require('resend');
|
|
12
|
+
this.client = new Resend(config.apiKey);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error('Resend provider requires "resend" package. ' +
|
|
16
|
+
'Install with: npm install resend');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async send(options) {
|
|
20
|
+
try {
|
|
21
|
+
const resendMessage = {
|
|
22
|
+
from: options.from ? this.formatAddress(options.from) : undefined,
|
|
23
|
+
to: this.formatRecipients(Array.isArray(options.to) ? options.to : [options.to]),
|
|
24
|
+
subject: options.subject,
|
|
25
|
+
};
|
|
26
|
+
if (options.cc) {
|
|
27
|
+
const cc = Array.isArray(options.cc) ? options.cc : [options.cc];
|
|
28
|
+
resendMessage.cc = this.formatRecipients(cc);
|
|
29
|
+
}
|
|
30
|
+
if (options.bcc) {
|
|
31
|
+
const bcc = Array.isArray(options.bcc) ? options.bcc : [options.bcc];
|
|
32
|
+
resendMessage.bcc = this.formatRecipients(bcc);
|
|
33
|
+
}
|
|
34
|
+
if (options.html) {
|
|
35
|
+
resendMessage.html = options.html;
|
|
36
|
+
}
|
|
37
|
+
else if (options.text) {
|
|
38
|
+
resendMessage.text = options.text;
|
|
39
|
+
}
|
|
40
|
+
if (options.replyTo) {
|
|
41
|
+
resendMessage.reply_to = this.formatAddress(options.replyTo);
|
|
42
|
+
}
|
|
43
|
+
if (options.headers) {
|
|
44
|
+
resendMessage.headers = options.headers;
|
|
45
|
+
}
|
|
46
|
+
if (options.attachments && options.attachments.length > 0) {
|
|
47
|
+
resendMessage.attachments = options.attachments.map((att) => ({
|
|
48
|
+
filename: att.filename,
|
|
49
|
+
content: att.content ? Buffer.from(att.content) : undefined,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
const result = await this.client.emails.send(resendMessage);
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
messageId: result?.data?.id,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: `Resend send failed: ${error.message}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: 'Resend send failed with unknown error',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
formatAddress(address) {
|
|
72
|
+
if (typeof address === 'string') {
|
|
73
|
+
return address;
|
|
74
|
+
}
|
|
75
|
+
return address.name ? `${address.name} <${address.address}>` : address.address;
|
|
76
|
+
}
|
|
77
|
+
formatRecipients(addresses) {
|
|
78
|
+
return addresses.map((addr) => this.formatAddress(addr));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.ResendProvider = ResendProvider;
|
|
82
|
+
//# sourceMappingURL=ResendProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResendProvider.js","sourceRoot":"","sources":["../../src/providers/ResendProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
import { Mail } from '../src';
|
|
3
|
+
|
|
4
|
+
// Load environment variables
|
|
5
|
+
config();
|
|
6
|
+
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
console.log('ð§ Sending email via Mailgun...\n');
|
|
10
|
+
|
|
11
|
+
const response = await Mail.to('recipient@example.com')
|
|
12
|
+
.subject('Test Email from Mailgun Provider')
|
|
13
|
+
.html('<h1>Hello from Mailgun!</h1><p>This email was sent using @impruthvi/nodemail with Mailgun.</p>')
|
|
14
|
+
.text('Hello from Mailgun! This email was sent using @impruthvi/nodemail with Mailgun.')
|
|
15
|
+
.cc('cc@example.com')
|
|
16
|
+
.send();
|
|
17
|
+
|
|
18
|
+
console.log('â
Email sent successfully!');
|
|
19
|
+
console.log('Response:', response);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.error('â Error sending email:', error);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
main();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
import { Mail } from '../src';
|
|
3
|
+
|
|
4
|
+
// Load environment variables
|
|
5
|
+
config();
|
|
6
|
+
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
console.log('ð§ Sending email via Postmark...\n');
|
|
10
|
+
|
|
11
|
+
const response = await Mail.to('recipient@example.com')
|
|
12
|
+
.subject('Test Email from Postmark Provider')
|
|
13
|
+
.html('<h1>Hello from Postmark!</h1><p>This email was sent using @impruthvi/nodemail with Postmark.</p>')
|
|
14
|
+
.text('Hello from Postmark! This email was sent using @impruthvi/nodemail with Postmark.')
|
|
15
|
+
.send();
|
|
16
|
+
|
|
17
|
+
console.log('â
Email sent successfully!');
|
|
18
|
+
console.log('Response:', response);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error('â Error sending email:', error);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
main();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
import { Mail } from '../src';
|
|
3
|
+
|
|
4
|
+
// Load environment variables
|
|
5
|
+
config();
|
|
6
|
+
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
console.log('ð§ Sending email via Resend...\n');
|
|
10
|
+
|
|
11
|
+
const response = await Mail.to('recipient@example.com')
|
|
12
|
+
.subject('Test Email from Resend Provider')
|
|
13
|
+
.html('<h1>Hello from Resend!</h1><p>This email was sent using @impruthvi/nodemail with Resend.</p>')
|
|
14
|
+
.text('Hello from Resend! This email was sent using @impruthvi/nodemail with Resend.')
|
|
15
|
+
.send();
|
|
16
|
+
|
|
17
|
+
console.log('â
Email sent successfully!');
|
|
18
|
+
console.log('Response:', response);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error('â Error sending email:', error);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@impruthvi/nodemail",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A unified mail service for Node.js/TypeScript with Laravel-like simplicity. Support for multiple providers (SMTP, SendGrid, AWS SES, Mailgun, Resend,
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "A unified mail service for Node.js/TypeScript with Laravel-like simplicity. Support for multiple providers (SMTP, SendGrid, AWS SES, Mailgun, Resend, Postmark) - just change environment variables, no code changes needed.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"bin": {
|
|
8
|
-
},
|
|
9
7
|
"scripts": {
|
|
10
8
|
"build": "tsc",
|
|
11
9
|
"dev": "tsx watch src/index.ts",
|
|
@@ -66,6 +64,7 @@
|
|
|
66
64
|
"peerDependencies": {
|
|
67
65
|
"@aws-sdk/client-ses": "^3.699.0",
|
|
68
66
|
"@sendgrid/mail": "^8.1.4",
|
|
67
|
+
"form-data": "^4.0.1",
|
|
69
68
|
"mailgun.js": "^10.2.3",
|
|
70
69
|
"postmark": "^4.0.5",
|
|
71
70
|
"resend": "^4.0.1"
|
|
@@ -77,6 +76,9 @@
|
|
|
77
76
|
"@aws-sdk/client-ses": {
|
|
78
77
|
"optional": true
|
|
79
78
|
},
|
|
79
|
+
"form-data": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
80
82
|
"mailgun.js": {
|
|
81
83
|
"optional": true
|
|
82
84
|
},
|