@bernierllc/email-sender 5.2.1 → 5.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/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/mailgun/sender-manager.d.ts +85 -0
- package/dist/providers/mailgun/sender-manager.d.ts.map +1 -0
- package/dist/providers/mailgun/sender-manager.js +615 -0
- package/dist/providers/mailgun/sender-manager.js.map +1 -0
- package/dist/providers/mailgun.d.ts +3 -0
- package/dist/providers/mailgun.d.ts.map +1 -1
- package/dist/providers/mailgun.js +10 -0
- package/dist/providers/mailgun.js.map +1 -1
- package/dist/providers/postmark/sender-manager.d.ts +108 -0
- package/dist/providers/postmark/sender-manager.d.ts.map +1 -0
- package/dist/providers/postmark/sender-manager.js +518 -0
- package/dist/providers/postmark/sender-manager.js.map +1 -0
- package/dist/providers/postmark.d.ts +2 -0
- package/dist/providers/postmark.d.ts.map +1 -1
- package/dist/providers/postmark.js +3 -0
- package/dist/providers/postmark.js.map +1 -1
- package/dist/providers/sendgrid/sender-manager.d.ts +37 -0
- package/dist/providers/sendgrid/sender-manager.d.ts.map +1 -1
- package/dist/providers/sendgrid/sender-manager.js +318 -0
- package/dist/providers/sendgrid/sender-manager.js.map +1 -1
- package/dist/providers/sendgrid.d.ts +31 -0
- package/dist/providers/sendgrid.d.ts.map +1 -1
- package/dist/providers/sendgrid.js +69 -0
- package/dist/providers/sendgrid.js.map +1 -1
- package/dist/providers/ses/sender-manager.d.ts +48 -0
- package/dist/providers/ses/sender-manager.d.ts.map +1 -0
- package/dist/providers/ses/sender-manager.js +437 -0
- package/dist/providers/ses/sender-manager.js.map +1 -0
- package/dist/providers/ses.d.ts +23 -0
- package/dist/providers/ses.d.ts.map +1 -1
- package/dist/providers/ses.js +30 -0
- package/dist/providers/ses.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MailgunSenderManager = exports.MailgunSenderError = void 0;
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Mailgun-specific error
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
class MailgunSenderError extends Error {
|
|
15
|
+
constructor(message, options) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'MailgunSenderError';
|
|
18
|
+
this.cause = options?.cause;
|
|
19
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.MailgunSenderError = MailgunSenderError;
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// MailgunSenderManager
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
class MailgunSenderManager {
|
|
27
|
+
constructor(apiKey, baseUrl, logger) {
|
|
28
|
+
this.apiKey = apiKey;
|
|
29
|
+
this.baseUrl = baseUrl;
|
|
30
|
+
this.logger = logger;
|
|
31
|
+
}
|
|
32
|
+
// ========================================================================
|
|
33
|
+
// Auth helper
|
|
34
|
+
// ========================================================================
|
|
35
|
+
getAuthHeader() {
|
|
36
|
+
return `Basic ${Buffer.from(`api:${this.apiKey}`).toString('base64')}`;
|
|
37
|
+
}
|
|
38
|
+
// ========================================================================
|
|
39
|
+
// Domain extraction helper
|
|
40
|
+
// ========================================================================
|
|
41
|
+
extractDomain(email) {
|
|
42
|
+
const parts = email.split('@');
|
|
43
|
+
const domain = parts[1];
|
|
44
|
+
if (!domain) {
|
|
45
|
+
throw new Error(`Cannot extract domain from email: ${email}`);
|
|
46
|
+
}
|
|
47
|
+
return domain;
|
|
48
|
+
}
|
|
49
|
+
// ========================================================================
|
|
50
|
+
// State mapping
|
|
51
|
+
// ========================================================================
|
|
52
|
+
mapMailgunState(state) {
|
|
53
|
+
switch (state) {
|
|
54
|
+
case 'active':
|
|
55
|
+
return 'verified';
|
|
56
|
+
case 'unverified':
|
|
57
|
+
return 'pending';
|
|
58
|
+
case 'disabled':
|
|
59
|
+
return 'failed';
|
|
60
|
+
default:
|
|
61
|
+
return 'pending';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ========================================================================
|
|
65
|
+
// HTTP status to error code mapping
|
|
66
|
+
// ========================================================================
|
|
67
|
+
mapStatusToErrorCode(statusCode) {
|
|
68
|
+
switch (statusCode) {
|
|
69
|
+
case 400: return 'INVALID_DOMAIN';
|
|
70
|
+
case 401: return 'AUTHENTICATION_FAILED';
|
|
71
|
+
case 403: return 'AUTHENTICATION_FAILED';
|
|
72
|
+
case 404: return 'SENDER_NOT_FOUND';
|
|
73
|
+
case 409: return 'SENDER_ALREADY_EXISTS';
|
|
74
|
+
case 429: return 'RATE_LIMITED';
|
|
75
|
+
default: return 'PROVIDER_ERROR';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ========================================================================
|
|
79
|
+
// DNS record type mapping
|
|
80
|
+
// ========================================================================
|
|
81
|
+
mapDnsRecordType(type) {
|
|
82
|
+
const upper = type.toUpperCase();
|
|
83
|
+
switch (upper) {
|
|
84
|
+
case 'MX': return 'MX';
|
|
85
|
+
case 'TXT': return 'TXT';
|
|
86
|
+
case 'CNAME': return 'CNAME';
|
|
87
|
+
case 'SPF': return 'SPF';
|
|
88
|
+
case 'DKIM': return 'DKIM';
|
|
89
|
+
case 'DMARC': return 'DMARC';
|
|
90
|
+
default: return 'TXT';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ========================================================================
|
|
94
|
+
// Managed Sender Operations
|
|
95
|
+
// ========================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Create a sender by registering a domain in Mailgun.
|
|
98
|
+
* The providerSenderId is the domain name itself.
|
|
99
|
+
*/
|
|
100
|
+
async createSender(input) {
|
|
101
|
+
if (!input.fromEmail) {
|
|
102
|
+
return {
|
|
103
|
+
success: false,
|
|
104
|
+
providerSenderId: '',
|
|
105
|
+
email: input.fromEmail,
|
|
106
|
+
verificationStatus: 'not_started',
|
|
107
|
+
error: {
|
|
108
|
+
code: 'MISSING_REQUIRED_FIELD',
|
|
109
|
+
message: 'fromEmail is required',
|
|
110
|
+
field: 'fromEmail',
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
let domain;
|
|
115
|
+
try {
|
|
116
|
+
domain = this.extractDomain(input.fromEmail);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return {
|
|
120
|
+
success: false,
|
|
121
|
+
providerSenderId: '',
|
|
122
|
+
email: input.fromEmail,
|
|
123
|
+
verificationStatus: 'not_started',
|
|
124
|
+
error: {
|
|
125
|
+
code: 'INVALID_EMAIL',
|
|
126
|
+
message: `Invalid email address: ${input.fromEmail}`,
|
|
127
|
+
field: 'fromEmail',
|
|
128
|
+
cause: err instanceof Error ? err : new Error(String(err)),
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const formData = new URLSearchParams();
|
|
134
|
+
formData.append('name', domain);
|
|
135
|
+
const response = await fetch(`${this.baseUrl}/domains`, {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: {
|
|
138
|
+
'Authorization': this.getAuthHeader(),
|
|
139
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
140
|
+
},
|
|
141
|
+
body: formData.toString(),
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
145
|
+
const errorText = await response.text();
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
providerSenderId: domain,
|
|
149
|
+
email: input.fromEmail,
|
|
150
|
+
verificationStatus: 'not_started',
|
|
151
|
+
error: {
|
|
152
|
+
code: errorCode,
|
|
153
|
+
message: `Mailgun API returned ${response.status}: ${errorText}`,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const data = await response.json();
|
|
158
|
+
this.logger?.info(`Created domain ${domain} in Mailgun`);
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
providerSenderId: domain,
|
|
162
|
+
email: input.fromEmail,
|
|
163
|
+
verificationStatus: this.mapMailgunState(data.domain.state),
|
|
164
|
+
metadata: {
|
|
165
|
+
type: data.domain.type,
|
|
166
|
+
fromName: input.fromName,
|
|
167
|
+
replyToEmail: input.replyToEmail,
|
|
168
|
+
replyToName: input.replyToName,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
174
|
+
throw new MailgunSenderError('Failed to create Mailgun domain', { cause });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Update a domain in Mailgun.
|
|
179
|
+
* Only DKIM key size and web scheme are supported via providerFields.
|
|
180
|
+
* Standard fields (fromName, replyToEmail, replyToName) return UNSUPPORTED_FIELD
|
|
181
|
+
* because Mailgun manages senders at the domain level, not individual identity.
|
|
182
|
+
*/
|
|
183
|
+
async updateSender(input) {
|
|
184
|
+
const domain = input.providerSenderId;
|
|
185
|
+
// Mailgun domain updates only support specific provider fields
|
|
186
|
+
const supportedFields = new Set(['dkim_key_size', 'web_scheme']);
|
|
187
|
+
const providerFields = input.providerFields ?? {};
|
|
188
|
+
// Check for unsupported standard fields
|
|
189
|
+
if (input.fromName !== undefined || input.replyToEmail !== undefined || input.replyToName !== undefined) {
|
|
190
|
+
return {
|
|
191
|
+
success: false,
|
|
192
|
+
providerSenderId: domain,
|
|
193
|
+
email: '',
|
|
194
|
+
verificationStatus: 'not_started',
|
|
195
|
+
error: {
|
|
196
|
+
code: 'UNSUPPORTED_FIELD',
|
|
197
|
+
message: 'Mailgun manages senders at the domain level. fromName, replyToEmail, and replyToName cannot be updated via domain API.',
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// Check for unsupported provider fields
|
|
202
|
+
for (const key of Object.keys(providerFields)) {
|
|
203
|
+
if (!supportedFields.has(key)) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
providerSenderId: domain,
|
|
207
|
+
email: '',
|
|
208
|
+
verificationStatus: 'not_started',
|
|
209
|
+
error: {
|
|
210
|
+
code: 'UNSUPPORTED_FIELD',
|
|
211
|
+
message: `Mailgun does not support updating field '${key}'. Supported fields: ${[...supportedFields].join(', ')}`,
|
|
212
|
+
field: key,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const formData = new URLSearchParams();
|
|
219
|
+
for (const [key, value] of Object.entries(providerFields)) {
|
|
220
|
+
formData.append(key, String(value));
|
|
221
|
+
}
|
|
222
|
+
const response = await fetch(`${this.baseUrl}/domains/${domain}`, {
|
|
223
|
+
method: 'PUT',
|
|
224
|
+
headers: {
|
|
225
|
+
'Authorization': this.getAuthHeader(),
|
|
226
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
227
|
+
},
|
|
228
|
+
body: formData.toString(),
|
|
229
|
+
});
|
|
230
|
+
if (!response.ok) {
|
|
231
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
232
|
+
const errorText = await response.text();
|
|
233
|
+
return {
|
|
234
|
+
success: false,
|
|
235
|
+
providerSenderId: domain,
|
|
236
|
+
email: '',
|
|
237
|
+
verificationStatus: 'not_started',
|
|
238
|
+
error: {
|
|
239
|
+
code: errorCode,
|
|
240
|
+
message: `Mailgun API returned ${response.status}: ${errorText}`,
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const data = await response.json();
|
|
245
|
+
this.logger?.info(`Updated domain ${domain} in Mailgun`);
|
|
246
|
+
return {
|
|
247
|
+
success: true,
|
|
248
|
+
providerSenderId: domain,
|
|
249
|
+
email: '',
|
|
250
|
+
verificationStatus: this.mapMailgunState(data.domain.state),
|
|
251
|
+
metadata: {
|
|
252
|
+
type: data.domain.type,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
258
|
+
throw new MailgunSenderError('Failed to update Mailgun domain', { cause });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Delete a domain from Mailgun.
|
|
263
|
+
*/
|
|
264
|
+
async deleteSender(providerSenderId) {
|
|
265
|
+
try {
|
|
266
|
+
const response = await fetch(`${this.baseUrl}/domains/${providerSenderId}`, {
|
|
267
|
+
method: 'DELETE',
|
|
268
|
+
headers: {
|
|
269
|
+
'Authorization': this.getAuthHeader(),
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
if (!response.ok) {
|
|
273
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
274
|
+
const errorText = await response.text();
|
|
275
|
+
return {
|
|
276
|
+
success: false,
|
|
277
|
+
providerSenderId,
|
|
278
|
+
error: {
|
|
279
|
+
code: errorCode,
|
|
280
|
+
message: `Mailgun API returned ${response.status}: ${errorText}`,
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
this.logger?.info(`Deleted domain ${providerSenderId} from Mailgun`);
|
|
285
|
+
return {
|
|
286
|
+
success: true,
|
|
287
|
+
providerSenderId,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
292
|
+
throw new MailgunSenderError('Failed to delete Mailgun domain', { cause });
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// ========================================================================
|
|
296
|
+
// Verifiable Sender Operations
|
|
297
|
+
// ========================================================================
|
|
298
|
+
/**
|
|
299
|
+
* Mailgun uses domain-based verification.
|
|
300
|
+
*/
|
|
301
|
+
getVerificationType() {
|
|
302
|
+
return 'domain';
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Initiate domain verification by triggering Mailgun's verify endpoint.
|
|
306
|
+
*/
|
|
307
|
+
async initiateVerification(providerSenderId) {
|
|
308
|
+
try {
|
|
309
|
+
const response = await fetch(`${this.baseUrl}/domains/${providerSenderId}/verify`, {
|
|
310
|
+
method: 'PUT',
|
|
311
|
+
headers: {
|
|
312
|
+
'Authorization': this.getAuthHeader(),
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
if (!response.ok) {
|
|
316
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
317
|
+
const errorText = await response.text();
|
|
318
|
+
return {
|
|
319
|
+
success: false,
|
|
320
|
+
providerSenderId,
|
|
321
|
+
status: 'not_started',
|
|
322
|
+
verificationType: 'domain',
|
|
323
|
+
error: {
|
|
324
|
+
code: errorCode,
|
|
325
|
+
message: `Mailgun API returned ${response.status}: ${errorText}`,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const data = await response.json();
|
|
330
|
+
this.logger?.info(`Initiated verification for domain ${providerSenderId}`);
|
|
331
|
+
return {
|
|
332
|
+
success: true,
|
|
333
|
+
providerSenderId,
|
|
334
|
+
status: this.mapMailgunState(data.domain.state),
|
|
335
|
+
verificationType: 'domain',
|
|
336
|
+
message: data.domain.state === 'active'
|
|
337
|
+
? 'Domain is verified'
|
|
338
|
+
: 'Domain verification initiated; configure DNS records and re-verify',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
343
|
+
throw new MailgunSenderError('Failed to initiate Mailgun domain verification', { cause });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Check the verification status of a domain by fetching domain info.
|
|
348
|
+
*/
|
|
349
|
+
async checkVerificationStatus(providerSenderId) {
|
|
350
|
+
try {
|
|
351
|
+
const response = await fetch(`${this.baseUrl}/domains/${providerSenderId}`, {
|
|
352
|
+
method: 'GET',
|
|
353
|
+
headers: {
|
|
354
|
+
'Authorization': this.getAuthHeader(),
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
if (!response.ok) {
|
|
358
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
359
|
+
const errorText = await response.text();
|
|
360
|
+
return {
|
|
361
|
+
success: false,
|
|
362
|
+
providerSenderId,
|
|
363
|
+
status: 'not_started',
|
|
364
|
+
verificationType: 'domain',
|
|
365
|
+
error: {
|
|
366
|
+
code: errorCode,
|
|
367
|
+
message: `Mailgun API returned ${response.status}: ${errorText}`,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
const data = await response.json();
|
|
372
|
+
const status = this.mapMailgunState(data.domain.state);
|
|
373
|
+
// Also extract DNS records for convenience
|
|
374
|
+
const dnsRecords = this.mapDnsRecords(data);
|
|
375
|
+
return {
|
|
376
|
+
success: true,
|
|
377
|
+
providerSenderId,
|
|
378
|
+
status,
|
|
379
|
+
verificationType: 'domain',
|
|
380
|
+
dnsRecords,
|
|
381
|
+
message: status === 'verified'
|
|
382
|
+
? 'Domain is verified'
|
|
383
|
+
: status === 'failed'
|
|
384
|
+
? 'Domain verification failed (disabled)'
|
|
385
|
+
: 'Domain verification pending; configure DNS records',
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
390
|
+
throw new MailgunSenderError('Failed to check Mailgun domain verification status', { cause });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Get DNS requirements for a domain.
|
|
395
|
+
* Fetches domain info and extracts sending_dns_records and receiving_dns_records.
|
|
396
|
+
*/
|
|
397
|
+
async getDnsRequirements(providerSenderId) {
|
|
398
|
+
try {
|
|
399
|
+
const response = await fetch(`${this.baseUrl}/domains/${providerSenderId}`, {
|
|
400
|
+
method: 'GET',
|
|
401
|
+
headers: {
|
|
402
|
+
'Authorization': this.getAuthHeader(),
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
if (!response.ok) {
|
|
406
|
+
throw new MailgunSenderError(`Mailgun API returned ${response.status}`);
|
|
407
|
+
}
|
|
408
|
+
const data = await response.json();
|
|
409
|
+
return this.mapDnsRecords(data);
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
if (error instanceof MailgunSenderError) {
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
416
|
+
throw new MailgunSenderError('Failed to get DNS requirements from Mailgun', { cause });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ========================================================================
|
|
420
|
+
// Provider plugin methods
|
|
421
|
+
// ========================================================================
|
|
422
|
+
/**
|
|
423
|
+
* Get all verified (active) senders (domains) from Mailgun.
|
|
424
|
+
*/
|
|
425
|
+
async getVerifiedSenders() {
|
|
426
|
+
try {
|
|
427
|
+
const response = await fetch(`${this.baseUrl}/domains`, {
|
|
428
|
+
method: 'GET',
|
|
429
|
+
headers: {
|
|
430
|
+
'Authorization': this.getAuthHeader(),
|
|
431
|
+
},
|
|
432
|
+
});
|
|
433
|
+
if (!response.ok) {
|
|
434
|
+
throw new MailgunSenderError(`Mailgun API returned ${response.status}`);
|
|
435
|
+
}
|
|
436
|
+
const data = await response.json();
|
|
437
|
+
return (data.items || []).map(item => ({
|
|
438
|
+
id: item.name,
|
|
439
|
+
email: `postmaster@${item.name}`,
|
|
440
|
+
name: item.name,
|
|
441
|
+
isVerified: item.state === 'active',
|
|
442
|
+
verificationStatus: this.mapMailgunState(item.state),
|
|
443
|
+
domain: item.name,
|
|
444
|
+
metadata: {
|
|
445
|
+
type: item.type,
|
|
446
|
+
state: item.state,
|
|
447
|
+
},
|
|
448
|
+
}));
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
if (error instanceof MailgunSenderError) {
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
454
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
455
|
+
throw new MailgunSenderError('Failed to get verified senders from Mailgun', { cause });
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Validate a sender email by checking if its domain is verified in Mailgun.
|
|
460
|
+
*/
|
|
461
|
+
async validateSender(email) {
|
|
462
|
+
let domain;
|
|
463
|
+
try {
|
|
464
|
+
domain = this.extractDomain(email);
|
|
465
|
+
}
|
|
466
|
+
catch (_err) {
|
|
467
|
+
return {
|
|
468
|
+
isVerified: false,
|
|
469
|
+
verificationStatus: 'not_started',
|
|
470
|
+
lastChecked: new Date(),
|
|
471
|
+
metadata: {
|
|
472
|
+
email,
|
|
473
|
+
error: `Invalid email address: ${email}`,
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
try {
|
|
478
|
+
const response = await fetch(`${this.baseUrl}/domains/${domain}`, {
|
|
479
|
+
method: 'GET',
|
|
480
|
+
headers: {
|
|
481
|
+
'Authorization': this.getAuthHeader(),
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
if (!response.ok) {
|
|
485
|
+
if (response.status === 404) {
|
|
486
|
+
return {
|
|
487
|
+
isVerified: false,
|
|
488
|
+
verificationStatus: 'not_started',
|
|
489
|
+
lastChecked: new Date(),
|
|
490
|
+
metadata: {
|
|
491
|
+
domain,
|
|
492
|
+
error: `Domain ${domain} is not registered in Mailgun`,
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
isVerified: false,
|
|
498
|
+
verificationStatus: 'not_started',
|
|
499
|
+
lastChecked: new Date(),
|
|
500
|
+
metadata: {
|
|
501
|
+
domain,
|
|
502
|
+
error: `Mailgun API returned ${response.status}`,
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
const data = await response.json();
|
|
507
|
+
const state = data.domain.state;
|
|
508
|
+
return {
|
|
509
|
+
isVerified: state === 'active',
|
|
510
|
+
verificationStatus: this.mapMailgunState(state),
|
|
511
|
+
lastChecked: new Date(),
|
|
512
|
+
metadata: {
|
|
513
|
+
domain,
|
|
514
|
+
state,
|
|
515
|
+
type: data.domain.type,
|
|
516
|
+
},
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
if (error instanceof MailgunSenderError) {
|
|
521
|
+
throw error;
|
|
522
|
+
}
|
|
523
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
524
|
+
throw new MailgunSenderError('Failed to validate sender in Mailgun', { cause });
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Sync a sender configuration with Mailgun by checking if the domain exists.
|
|
529
|
+
*/
|
|
530
|
+
async syncSender(sender) {
|
|
531
|
+
const domain = sender.domain;
|
|
532
|
+
try {
|
|
533
|
+
const response = await fetch(`${this.baseUrl}/domains/${domain}`, {
|
|
534
|
+
method: 'GET',
|
|
535
|
+
headers: {
|
|
536
|
+
'Authorization': this.getAuthHeader(),
|
|
537
|
+
},
|
|
538
|
+
});
|
|
539
|
+
if (!response.ok) {
|
|
540
|
+
if (response.status === 404) {
|
|
541
|
+
return {
|
|
542
|
+
success: false,
|
|
543
|
+
senderId: sender.id,
|
|
544
|
+
synced: false,
|
|
545
|
+
message: `Domain ${domain} not found in Mailgun`,
|
|
546
|
+
error: `Domain ${domain} does not exist in Mailgun`,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
return {
|
|
550
|
+
success: false,
|
|
551
|
+
senderId: sender.id,
|
|
552
|
+
synced: false,
|
|
553
|
+
error: `Mailgun API returned ${response.status}`,
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
const data = await response.json();
|
|
557
|
+
const isVerified = data.domain.state === 'active';
|
|
558
|
+
return {
|
|
559
|
+
success: true,
|
|
560
|
+
senderId: sender.id,
|
|
561
|
+
synced: true,
|
|
562
|
+
message: isVerified
|
|
563
|
+
? `Domain ${domain} is verified and active in Mailgun`
|
|
564
|
+
: `Domain ${domain} exists but is not verified (state: ${data.domain.state})`,
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
catch (error) {
|
|
568
|
+
if (error instanceof MailgunSenderError) {
|
|
569
|
+
throw error;
|
|
570
|
+
}
|
|
571
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
572
|
+
throw new MailgunSenderError('Failed to sync sender with Mailgun', { cause });
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Return the capabilities of the Mailgun sender manager.
|
|
577
|
+
*/
|
|
578
|
+
getCapabilities() {
|
|
579
|
+
return ['send', 'domain_verification', 'dkim', 'tracking'];
|
|
580
|
+
}
|
|
581
|
+
// ========================================================================
|
|
582
|
+
// Private helpers
|
|
583
|
+
// ========================================================================
|
|
584
|
+
/**
|
|
585
|
+
* Map Mailgun domain response DNS records to our DNSRecord[] type.
|
|
586
|
+
*/
|
|
587
|
+
mapDnsRecords(data) {
|
|
588
|
+
const records = [];
|
|
589
|
+
const sendingRecords = data.domain.sending_dns_records || [];
|
|
590
|
+
const receivingRecords = data.domain.receiving_dns_records || [];
|
|
591
|
+
for (const rec of sendingRecords) {
|
|
592
|
+
records.push({
|
|
593
|
+
type: this.mapDnsRecordType(rec.record_type),
|
|
594
|
+
host: rec.name ?? data.domain.name,
|
|
595
|
+
value: rec.value,
|
|
596
|
+
ttl: 3600, // Mailgun does not return TTL; use sensible default
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
for (const rec of receivingRecords) {
|
|
600
|
+
const record = {
|
|
601
|
+
type: this.mapDnsRecordType(rec.record_type),
|
|
602
|
+
host: rec.name ?? data.domain.name,
|
|
603
|
+
value: rec.value,
|
|
604
|
+
ttl: 3600,
|
|
605
|
+
};
|
|
606
|
+
if (rec.priority !== undefined) {
|
|
607
|
+
record.priority = parseInt(rec.priority, 10);
|
|
608
|
+
}
|
|
609
|
+
records.push(record);
|
|
610
|
+
}
|
|
611
|
+
return records;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
exports.MailgunSenderManager = MailgunSenderManager;
|
|
615
|
+
//# sourceMappingURL=sender-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-manager.js","sourceRoot":"","sources":["../../../src/providers/mailgun/sender-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { EmailProvider } from './base';
|
|
6
6
|
import { type EmailMessage, type SendResult, type EmailProviderConfig, type EmailProviderCapabilities, type EmailValidationResult, type EmailTemplate, type DeliveryStatus, type WebhookEvent } from '../types';
|
|
7
|
+
import { MailgunSenderManager } from './mailgun/sender-manager';
|
|
7
8
|
interface MailgunConfig extends EmailProviderConfig {
|
|
8
9
|
provider: 'mailgun';
|
|
9
10
|
apiKey: string;
|
|
@@ -13,8 +14,10 @@ interface MailgunConfig extends EmailProviderConfig {
|
|
|
13
14
|
}
|
|
14
15
|
export declare class MailgunProvider extends EmailProvider {
|
|
15
16
|
private baseUrl;
|
|
17
|
+
readonly senderManager: MailgunSenderManager;
|
|
16
18
|
constructor(config: MailgunConfig);
|
|
17
19
|
private buildBaseUrl;
|
|
20
|
+
private buildAccountBaseUrl;
|
|
18
21
|
sendEmail(message: EmailMessage): Promise<SendResult>;
|
|
19
22
|
sendBatch(emails: EmailMessage[]): Promise<SendResult[]>;
|
|
20
23
|
private sendBatchChunk;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailgun.d.ts","sourceRoot":"","sources":["../../src/providers/mailgun.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"mailgun.d.ts","sourceRoot":"","sources":["../../src/providers/mailgun.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,UAAU,aAAc,SAAQ,mBAAmB;IACjD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACtB;AAuDD,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,SAAgB,aAAa,EAAE,oBAAoB,CAAC;gBAExC,MAAM,EAAE,aAAa;IAajC,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,mBAAmB;IAMrB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA2DrD,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YA2BhD,cAAc;IA0Db,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC;IAiDP,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BzG,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAmC9D,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA8BhC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwDpE,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM1E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBxC,qBAAqB,IAAI,qBAAqB;IA2B9C,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB;IAyBlE,eAAe,IAAI,yBAAyB;IA4BrD,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,kBAAkB;CAqB3B"}
|