@bernierllc/email-sender 5.2.0 → 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 +4 -1
- package/dist/providers/mailgun.d.ts.map +1 -1
- package/dist/providers/mailgun.js +27 -0
- package/dist/providers/mailgun.js.map +1 -1
- package/dist/providers/mandrill.d.ts.map +1 -1
- package/dist/providers/mandrill.js +18 -0
- package/dist/providers/mandrill.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 +3 -1
- package/dist/providers/postmark.d.ts.map +1 -1
- package/dist/providers/postmark.js +19 -1
- 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 +88 -5
- 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 +42 -5
- package/dist/providers/ses.js.map +1 -1
- package/dist/providers/smtp.d.ts.map +1 -1
- package/dist/providers/smtp.js +20 -1
- package/dist/providers/smtp.js.map +1 -1
- package/dist/providers/smtp2go.d.ts +1 -1
- package/dist/providers/smtp2go.d.ts.map +1 -1
- package/dist/providers/smtp2go.js +15 -0
- package/dist/providers/smtp2go.js.map +1 -1
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +10 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,518 @@
|
|
|
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.PostmarkSenderManager = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Postmark Sender Signature Manager
|
|
13
|
+
*
|
|
14
|
+
* Manages sender signatures (verified senders) through the Postmark Account API.
|
|
15
|
+
* Uses account-level authentication (X-Postmark-Account-Token) for all operations.
|
|
16
|
+
*
|
|
17
|
+
* Postmark API reference: https://postmarkapp.com/developer/api/signatures-api
|
|
18
|
+
*/
|
|
19
|
+
const errors_1 = require("../../errors");
|
|
20
|
+
class PostmarkSenderManager {
|
|
21
|
+
constructor(accountToken, baseUrl, logger) {
|
|
22
|
+
this.accountToken = accountToken;
|
|
23
|
+
this.baseUrl = baseUrl;
|
|
24
|
+
this.logger = logger;
|
|
25
|
+
}
|
|
26
|
+
// ==========================================
|
|
27
|
+
// Core CRUD Operations
|
|
28
|
+
// ==========================================
|
|
29
|
+
/**
|
|
30
|
+
* Create a sender signature in Postmark.
|
|
31
|
+
* POST /senders
|
|
32
|
+
*/
|
|
33
|
+
async createSender(input) {
|
|
34
|
+
try {
|
|
35
|
+
const body = {
|
|
36
|
+
FromEmail: input.fromEmail,
|
|
37
|
+
Name: input.fromName,
|
|
38
|
+
};
|
|
39
|
+
if (input.replyToEmail !== undefined) {
|
|
40
|
+
body['ReplyToEmail'] = input.replyToEmail;
|
|
41
|
+
}
|
|
42
|
+
// Merge any provider-specific fields
|
|
43
|
+
if (input.providerFields) {
|
|
44
|
+
for (const [key, value] of Object.entries(input.providerFields)) {
|
|
45
|
+
body[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const response = await this.request('POST', '/senders', body);
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
51
|
+
const errorBody = await this.safeParseJson(response);
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
providerSenderId: '',
|
|
55
|
+
email: input.fromEmail,
|
|
56
|
+
verificationStatus: 'not_started',
|
|
57
|
+
error: {
|
|
58
|
+
code: errorCode,
|
|
59
|
+
message: this.extractErrorMessage(errorBody, response.status),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
this.logger?.info(`Created sender signature ${data.ID} for ${input.fromEmail}`);
|
|
65
|
+
return {
|
|
66
|
+
success: true,
|
|
67
|
+
providerSenderId: String(data.ID),
|
|
68
|
+
email: data.FromEmail,
|
|
69
|
+
verificationStatus: data.Confirmed ? 'verified' : 'pending',
|
|
70
|
+
metadata: {
|
|
71
|
+
domain: data.Domain,
|
|
72
|
+
dkimVerified: data.DKIMVerified,
|
|
73
|
+
returnPathVerified: data.ReturnPathDomainVerified,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return this.handleFetchError('createSender', input.fromEmail, error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Update an existing sender signature in Postmark.
|
|
83
|
+
* PUT /senders/{signatureId}
|
|
84
|
+
*/
|
|
85
|
+
async updateSender(input) {
|
|
86
|
+
try {
|
|
87
|
+
const body = {};
|
|
88
|
+
if (input.fromName !== undefined) {
|
|
89
|
+
body['Name'] = input.fromName;
|
|
90
|
+
}
|
|
91
|
+
if (input.replyToEmail !== undefined) {
|
|
92
|
+
body['ReplyToEmail'] = input.replyToEmail;
|
|
93
|
+
}
|
|
94
|
+
// Merge any provider-specific fields
|
|
95
|
+
if (input.providerFields) {
|
|
96
|
+
for (const [key, value] of Object.entries(input.providerFields)) {
|
|
97
|
+
body[key] = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const response = await this.request('PUT', `/senders/${input.providerSenderId}`, body);
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
103
|
+
const errorBody = await this.safeParseJson(response);
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
providerSenderId: input.providerSenderId,
|
|
107
|
+
email: '',
|
|
108
|
+
verificationStatus: 'not_started',
|
|
109
|
+
error: {
|
|
110
|
+
code: errorCode,
|
|
111
|
+
message: this.extractErrorMessage(errorBody, response.status),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const data = await response.json();
|
|
116
|
+
this.logger?.info(`Updated sender signature ${input.providerSenderId}`);
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
providerSenderId: String(data.ID),
|
|
120
|
+
email: data.FromEmail,
|
|
121
|
+
verificationStatus: data.Confirmed ? 'verified' : 'pending',
|
|
122
|
+
metadata: {
|
|
123
|
+
domain: data.Domain,
|
|
124
|
+
dkimVerified: data.DKIMVerified,
|
|
125
|
+
returnPathVerified: data.ReturnPathDomainVerified,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return this.handleFetchError('updateSender', input.providerSenderId, error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Delete a sender signature from Postmark.
|
|
135
|
+
* DELETE /senders/{signatureId}
|
|
136
|
+
*/
|
|
137
|
+
async deleteSender(providerSenderId) {
|
|
138
|
+
try {
|
|
139
|
+
const response = await this.request('DELETE', `/senders/${providerSenderId}`);
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
142
|
+
const errorBody = await this.safeParseJson(response);
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
providerSenderId,
|
|
146
|
+
error: {
|
|
147
|
+
code: errorCode,
|
|
148
|
+
message: this.extractErrorMessage(errorBody, response.status),
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
this.logger?.info(`Deleted sender signature ${providerSenderId}`);
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
providerSenderId,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
throw new errors_1.EmailSenderError('Failed to delete sender signature', {
|
|
163
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
164
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
165
|
+
context: { providerSenderId },
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ==========================================
|
|
170
|
+
// Verification Operations
|
|
171
|
+
// ==========================================
|
|
172
|
+
/**
|
|
173
|
+
* Postmark uses signature-based verification (confirmation email).
|
|
174
|
+
*/
|
|
175
|
+
getVerificationType() {
|
|
176
|
+
return 'signature';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Initiate verification by resending the confirmation email.
|
|
180
|
+
* POST /senders/{signatureId}/resend
|
|
181
|
+
*/
|
|
182
|
+
async initiateVerification(providerSenderId) {
|
|
183
|
+
try {
|
|
184
|
+
const response = await this.request('POST', `/senders/${providerSenderId}/resend`);
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
187
|
+
const errorBody = await this.safeParseJson(response);
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
providerSenderId,
|
|
191
|
+
status: 'pending',
|
|
192
|
+
verificationType: 'signature',
|
|
193
|
+
error: {
|
|
194
|
+
code: errorCode,
|
|
195
|
+
message: this.extractErrorMessage(errorBody, response.status),
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
this.logger?.info(`Resent verification email for sender ${providerSenderId}`);
|
|
200
|
+
return {
|
|
201
|
+
success: true,
|
|
202
|
+
providerSenderId,
|
|
203
|
+
status: 'pending',
|
|
204
|
+
verificationType: 'signature',
|
|
205
|
+
message: 'Verification email resent; awaiting confirmation',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
throw new errors_1.EmailSenderError('Failed to initiate sender verification', {
|
|
213
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
214
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
215
|
+
context: { providerSenderId },
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check the verification status of a sender signature.
|
|
221
|
+
* GET /senders/{signatureId}
|
|
222
|
+
*/
|
|
223
|
+
async checkVerificationStatus(providerSenderId) {
|
|
224
|
+
try {
|
|
225
|
+
const response = await this.request('GET', `/senders/${providerSenderId}`);
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
const errorCode = this.mapStatusToErrorCode(response.status);
|
|
228
|
+
const errorBody = await this.safeParseJson(response);
|
|
229
|
+
return {
|
|
230
|
+
success: false,
|
|
231
|
+
providerSenderId,
|
|
232
|
+
status: 'not_started',
|
|
233
|
+
verificationType: 'signature',
|
|
234
|
+
error: {
|
|
235
|
+
code: errorCode,
|
|
236
|
+
message: this.extractErrorMessage(errorBody, response.status),
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const data = await response.json();
|
|
241
|
+
const status = data.Confirmed ? 'verified' : 'pending';
|
|
242
|
+
return {
|
|
243
|
+
success: true,
|
|
244
|
+
providerSenderId,
|
|
245
|
+
status,
|
|
246
|
+
verificationType: 'signature',
|
|
247
|
+
message: data.Confirmed
|
|
248
|
+
? 'Sender signature is verified'
|
|
249
|
+
: 'Awaiting confirmation; check email inbox',
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
throw new errors_1.EmailSenderError('Failed to check verification status', {
|
|
257
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
258
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
259
|
+
context: { providerSenderId },
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get DNS requirements for a sender signature.
|
|
265
|
+
* GET /senders/{signatureId}
|
|
266
|
+
* Extracts DKIM (TXT) and Return-Path (CNAME) records.
|
|
267
|
+
*/
|
|
268
|
+
async getDnsRequirements(providerSenderId) {
|
|
269
|
+
try {
|
|
270
|
+
const response = await this.request('GET', `/senders/${providerSenderId}`);
|
|
271
|
+
if (!response.ok) {
|
|
272
|
+
throw new errors_1.EmailSenderError(`Failed to fetch sender signature ${providerSenderId}`, {
|
|
273
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
274
|
+
context: { providerSenderId, status: response.status },
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
const data = await response.json();
|
|
278
|
+
const records = [];
|
|
279
|
+
// DKIM record (TXT)
|
|
280
|
+
if (data.DKIMHost && data.DKIMTextValue) {
|
|
281
|
+
records.push({
|
|
282
|
+
type: 'TXT',
|
|
283
|
+
host: data.DKIMHost,
|
|
284
|
+
value: data.DKIMTextValue,
|
|
285
|
+
ttl: 3600,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
// Pending DKIM record (TXT) - when DKIM rotation is in progress
|
|
289
|
+
if (data.DKIMPendingHost && data.DKIMPendingTextValue) {
|
|
290
|
+
records.push({
|
|
291
|
+
type: 'TXT',
|
|
292
|
+
host: data.DKIMPendingHost,
|
|
293
|
+
value: data.DKIMPendingTextValue,
|
|
294
|
+
ttl: 3600,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// Return-Path record (CNAME)
|
|
298
|
+
if (data.ReturnPathDomain && data.ReturnPathDomainCNAMEValue) {
|
|
299
|
+
records.push({
|
|
300
|
+
type: 'CNAME',
|
|
301
|
+
host: data.ReturnPathDomain,
|
|
302
|
+
value: data.ReturnPathDomainCNAMEValue,
|
|
303
|
+
ttl: 3600,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return records;
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
throw new errors_1.EmailSenderError('Failed to get DNS requirements', {
|
|
313
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
314
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
315
|
+
context: { providerSenderId },
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// ==========================================
|
|
320
|
+
// Query Operations
|
|
321
|
+
// ==========================================
|
|
322
|
+
/**
|
|
323
|
+
* List all verified senders from Postmark.
|
|
324
|
+
* GET /senders?count=500&offset=0
|
|
325
|
+
* Maps SenderSignatures array to ProviderSender[].
|
|
326
|
+
*/
|
|
327
|
+
async getVerifiedSenders() {
|
|
328
|
+
try {
|
|
329
|
+
const response = await this.request('GET', '/senders?count=500&offset=0');
|
|
330
|
+
if (!response.ok) {
|
|
331
|
+
throw new errors_1.EmailSenderError('Failed to fetch sender signatures', {
|
|
332
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
333
|
+
context: { status: response.status },
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
const data = await response.json();
|
|
337
|
+
this.logger?.info(`Fetched ${data.SenderSignatures.length} sender signatures from Postmark`);
|
|
338
|
+
return data.SenderSignatures.map((sig) => ({
|
|
339
|
+
id: String(sig.ID),
|
|
340
|
+
email: sig.FromEmail,
|
|
341
|
+
name: sig.Name,
|
|
342
|
+
isVerified: sig.Confirmed,
|
|
343
|
+
verificationStatus: sig.Confirmed ? 'verified' : 'pending',
|
|
344
|
+
domain: sig.Domain,
|
|
345
|
+
metadata: {
|
|
346
|
+
replyToEmail: sig.ReplyToEmail,
|
|
347
|
+
dkimVerified: sig.DKIMVerified,
|
|
348
|
+
returnPathDomainVerified: sig.ReturnPathDomainVerified,
|
|
349
|
+
},
|
|
350
|
+
}));
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
throw new errors_1.EmailSenderError('Failed to get verified senders', {
|
|
357
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
358
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Validate whether a sender email is verified in Postmark.
|
|
364
|
+
* Searches the list of senders for an exact email match and checks Confirmed status.
|
|
365
|
+
*/
|
|
366
|
+
async validateSender(email) {
|
|
367
|
+
try {
|
|
368
|
+
const senders = await this.getVerifiedSenders();
|
|
369
|
+
const match = senders.find((s) => s.email.toLowerCase() === email.toLowerCase());
|
|
370
|
+
if (!match) {
|
|
371
|
+
return {
|
|
372
|
+
isVerified: false,
|
|
373
|
+
verificationStatus: 'not_found',
|
|
374
|
+
lastChecked: new Date(),
|
|
375
|
+
metadata: { email, senderCount: senders.length },
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
isVerified: match.isVerified,
|
|
380
|
+
verificationStatus: match.verificationStatus,
|
|
381
|
+
lastChecked: new Date(),
|
|
382
|
+
metadata: {
|
|
383
|
+
senderId: match.id,
|
|
384
|
+
domain: match.domain,
|
|
385
|
+
...match.metadata,
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
throw new errors_1.EmailSenderError('Failed to validate sender', {
|
|
394
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
395
|
+
code: errors_1.EmailSenderErrorCode.PROVIDER_ERROR,
|
|
396
|
+
context: { email },
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Sync a local sender configuration with Postmark.
|
|
402
|
+
* Checks whether the signature still exists and returns sync result.
|
|
403
|
+
*/
|
|
404
|
+
async syncSender(sender) {
|
|
405
|
+
try {
|
|
406
|
+
if (!sender.providerSenderId) {
|
|
407
|
+
return {
|
|
408
|
+
success: false,
|
|
409
|
+
senderId: sender.id,
|
|
410
|
+
synced: false,
|
|
411
|
+
message: 'No providerSenderId on sender configuration',
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
const response = await this.request('GET', `/senders/${sender.providerSenderId}`);
|
|
415
|
+
if (!response.ok) {
|
|
416
|
+
if (response.status === 404) {
|
|
417
|
+
return {
|
|
418
|
+
success: true,
|
|
419
|
+
senderId: sender.id,
|
|
420
|
+
synced: false,
|
|
421
|
+
message: `Sender signature ${sender.providerSenderId} not found in Postmark`,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
success: false,
|
|
426
|
+
senderId: sender.id,
|
|
427
|
+
synced: false,
|
|
428
|
+
error: `Postmark API returned ${response.status}`,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
const data = await response.json();
|
|
432
|
+
return {
|
|
433
|
+
success: true,
|
|
434
|
+
senderId: sender.id,
|
|
435
|
+
synced: true,
|
|
436
|
+
message: data.Confirmed
|
|
437
|
+
? 'Sender signature exists and is confirmed'
|
|
438
|
+
: 'Sender signature exists but is not yet confirmed',
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
return {
|
|
443
|
+
success: false,
|
|
444
|
+
senderId: sender.id,
|
|
445
|
+
synced: false,
|
|
446
|
+
error: error instanceof Error ? error.message : String(error),
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Postmark sender signature capabilities.
|
|
452
|
+
*/
|
|
453
|
+
getCapabilities() {
|
|
454
|
+
return ['send', 'signature_verification', 'dkim', 'return_path'];
|
|
455
|
+
}
|
|
456
|
+
// ==========================================
|
|
457
|
+
// Private Helpers
|
|
458
|
+
// ==========================================
|
|
459
|
+
async request(method, path, body) {
|
|
460
|
+
const url = `${this.baseUrl}${path}`;
|
|
461
|
+
const headers = {
|
|
462
|
+
'Accept': 'application/json',
|
|
463
|
+
'Content-Type': 'application/json',
|
|
464
|
+
'X-Postmark-Account-Token': this.accountToken,
|
|
465
|
+
};
|
|
466
|
+
this.logger?.debug(`Postmark ${method} ${path}`);
|
|
467
|
+
const options = { method, headers };
|
|
468
|
+
if (body !== undefined) {
|
|
469
|
+
options.body = JSON.stringify(body);
|
|
470
|
+
}
|
|
471
|
+
return fetch(url, options);
|
|
472
|
+
}
|
|
473
|
+
mapStatusToErrorCode(statusCode) {
|
|
474
|
+
switch (statusCode) {
|
|
475
|
+
case 400: return 'INVALID_EMAIL';
|
|
476
|
+
case 401: return 'AUTHENTICATION_FAILED';
|
|
477
|
+
case 403: return 'AUTHENTICATION_FAILED';
|
|
478
|
+
case 404: return 'SENDER_NOT_FOUND';
|
|
479
|
+
case 409: return 'SENDER_ALREADY_EXISTS';
|
|
480
|
+
case 422: return 'INVALID_EMAIL';
|
|
481
|
+
case 429: return 'RATE_LIMITED';
|
|
482
|
+
default: return 'PROVIDER_ERROR';
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
async safeParseJson(response) {
|
|
486
|
+
try {
|
|
487
|
+
return await response.json();
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
extractErrorMessage(body, status) {
|
|
494
|
+
if (body && typeof body['Message'] === 'string') {
|
|
495
|
+
return body['Message'];
|
|
496
|
+
}
|
|
497
|
+
if (body && typeof body['message'] === 'string') {
|
|
498
|
+
return body['message'];
|
|
499
|
+
}
|
|
500
|
+
return `Postmark API returned ${status}`;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Handle fetch-level errors (network failures, etc.) for create/update
|
|
504
|
+
* operations that return ProviderSenderResult instead of throwing.
|
|
505
|
+
*/
|
|
506
|
+
handleFetchError(_operation, identifier, error) {
|
|
507
|
+
if (error instanceof errors_1.EmailSenderError) {
|
|
508
|
+
throw error;
|
|
509
|
+
}
|
|
510
|
+
throw new errors_1.EmailSenderError(`Postmark sender operation failed`, {
|
|
511
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
512
|
+
code: errors_1.EmailSenderErrorCode.NETWORK_ERROR,
|
|
513
|
+
context: { identifier },
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
exports.PostmarkSenderManager = PostmarkSenderManager;
|
|
518
|
+
//# sourceMappingURL=sender-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-manager.js","sourceRoot":"","sources":["../../../src/providers/postmark/sender-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Handles email sending through Postmark API
|
|
4
4
|
*/
|
|
5
5
|
import { EmailProvider } from './base';
|
|
6
|
-
import type
|
|
6
|
+
import { type EmailMessage, type SendResult, type EmailProviderConfig, type EmailProviderCapabilities, type EmailValidationResult, type EmailTemplate, type DeliveryStatus, type WebhookEvent } from '../types';
|
|
7
|
+
import { PostmarkSenderManager } from './postmark/sender-manager';
|
|
7
8
|
interface PostmarkConfig extends EmailProviderConfig {
|
|
8
9
|
provider: 'postmark';
|
|
9
10
|
apiKey: string;
|
|
@@ -13,6 +14,7 @@ interface PostmarkConfig extends EmailProviderConfig {
|
|
|
13
14
|
}
|
|
14
15
|
export declare class PostmarkProvider extends EmailProvider {
|
|
15
16
|
private baseUrl;
|
|
17
|
+
readonly senderManager: PostmarkSenderManager;
|
|
16
18
|
constructor(config: PostmarkConfig);
|
|
17
19
|
sendEmail(message: EmailMessage): Promise<SendResult>;
|
|
18
20
|
sendBatch(emails: EmailMessage[]): Promise<SendResult[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../src/providers/postmark.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../src/providers/postmark.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,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,UAAU,cAAe,SAAQ,mBAAmB;IAClD,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2BD,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,SAAgB,aAAa,EAAE,qBAAqB,CAAC;gBAEzC,MAAM,EAAE,cAAc;IAO5B,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA2CrD,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YA0BhD,cAAc;IAwDb,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC;IAuDP,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BzG,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA2C9D,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA8BhC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiCpE,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;IAuB9C,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB;IAmClE,eAAe,IAAI,yBAAyB;IA4BrD,OAAO,CAAC,wBAAwB;IA4DhC,OAAO,CAAC,iCAAiC;IAyBzC,OAAO,CAAC,mBAAmB;CAqB5B"}
|
|
@@ -13,10 +13,14 @@ exports.PostmarkProvider = void 0;
|
|
|
13
13
|
* Handles email sending through Postmark API
|
|
14
14
|
*/
|
|
15
15
|
const base_1 = require("./base");
|
|
16
|
+
const types_1 = require("../types");
|
|
17
|
+
const sender_manager_1 = require("./postmark/sender-manager");
|
|
16
18
|
class PostmarkProvider extends base_1.EmailProvider {
|
|
17
19
|
constructor(config) {
|
|
18
20
|
super(config);
|
|
19
21
|
this.baseUrl = this.config.endpoint || 'https://api.postmarkapp.com';
|
|
22
|
+
const accountToken = (this.config.accountToken || this.config.apiKey);
|
|
23
|
+
this.senderManager = new sender_manager_1.PostmarkSenderManager(accountToken, this.baseUrl);
|
|
20
24
|
}
|
|
21
25
|
async sendEmail(message) {
|
|
22
26
|
try {
|
|
@@ -437,6 +441,12 @@ class PostmarkProvider extends base_1.EmailProvider {
|
|
|
437
441
|
if (message.replyTo) {
|
|
438
442
|
postmarkMessage.ReplyTo = message.replyTo;
|
|
439
443
|
}
|
|
444
|
+
if (message.cc && message.cc.length > 0) {
|
|
445
|
+
postmarkMessage.Cc = message.cc.map(types_1.formatEmailContact).join(', ');
|
|
446
|
+
}
|
|
447
|
+
if (message.bcc && message.bcc.length > 0) {
|
|
448
|
+
postmarkMessage.Bcc = message.bcc.map(types_1.formatEmailContact).join(', ');
|
|
449
|
+
}
|
|
440
450
|
if (message.headers) {
|
|
441
451
|
postmarkMessage.Headers = Object.entries(message.headers).map(([key, value]) => ({
|
|
442
452
|
Name: key,
|
|
@@ -451,7 +461,15 @@ class PostmarkProvider extends base_1.EmailProvider {
|
|
|
451
461
|
}));
|
|
452
462
|
}
|
|
453
463
|
if (message.metadata) {
|
|
454
|
-
postmarkMessage.Metadata = message.metadata;
|
|
464
|
+
postmarkMessage.Metadata = Object.fromEntries(Object.entries(message.metadata).map(([k, v]) => [k, String(v)]));
|
|
465
|
+
}
|
|
466
|
+
if (message.priority) {
|
|
467
|
+
const p = types_1.EMAIL_PRIORITY_MAP[message.priority];
|
|
468
|
+
postmarkMessage.Headers = [
|
|
469
|
+
...(postmarkMessage.Headers ?? []),
|
|
470
|
+
{ Name: 'X-Priority', Value: p.xp },
|
|
471
|
+
{ Name: 'X-MSMail-Priority', Value: p.ms },
|
|
472
|
+
];
|
|
455
473
|
}
|
|
456
474
|
return postmarkMessage;
|
|
457
475
|
}
|