@bernierllc/email-sender 0.2.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 +7 -0
- package/README.md +430 -0
- package/dist/core/email-sender.d.ts +71 -0
- package/dist/core/email-sender.d.ts.map +1 -0
- package/dist/core/email-sender.js +125 -0
- package/dist/core/email-sender.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +63 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +132 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/mailgun.d.ts +40 -0
- package/dist/providers/mailgun.d.ts.map +1 -0
- package/dist/providers/mailgun.js +525 -0
- package/dist/providers/mailgun.js.map +1 -0
- package/dist/providers/postmark.d.ts +37 -0
- package/dist/providers/postmark.d.ts.map +1 -0
- package/dist/providers/postmark.js +482 -0
- package/dist/providers/postmark.js.map +1 -0
- package/dist/providers/sendgrid.d.ts +80 -0
- package/dist/providers/sendgrid.d.ts.map +1 -0
- package/dist/providers/sendgrid.js +407 -0
- package/dist/providers/sendgrid.js.map +1 -0
- package/dist/providers/ses.d.ts +38 -0
- package/dist/providers/ses.d.ts.map +1 -0
- package/dist/providers/ses.js +404 -0
- package/dist/providers/ses.js.map +1 -0
- package/dist/providers/smtp.d.ts +61 -0
- package/dist/providers/smtp.d.ts.map +1 -0
- package/dist/providers/smtp.js +201 -0
- package/dist/providers/smtp.js.map +1 -0
- package/dist/types/index.d.ts +99 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,482 @@
|
|
|
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.PostmarkProvider = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Postmark Email Provider
|
|
13
|
+
* Handles email sending through Postmark API
|
|
14
|
+
*/
|
|
15
|
+
const base_1 = require("./base");
|
|
16
|
+
class PostmarkProvider extends base_1.EmailProvider {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
super(config);
|
|
19
|
+
this.baseUrl = this.config.endpoint || 'https://api.postmarkapp.com';
|
|
20
|
+
}
|
|
21
|
+
async sendEmail(message) {
|
|
22
|
+
try {
|
|
23
|
+
const postmarkMessage = this.convertToPostmarkMessage(message);
|
|
24
|
+
const response = await fetch(`${this.baseUrl}/email`, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
'X-Postmark-Server-Token': this.config.apiKey
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify(postmarkMessage)
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const errorData = await response.json();
|
|
34
|
+
throw new Error(`Postmark API error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
35
|
+
}
|
|
36
|
+
const result = await response.json();
|
|
37
|
+
return {
|
|
38
|
+
success: true,
|
|
39
|
+
messageId: result.MessageID,
|
|
40
|
+
providerResponse: result,
|
|
41
|
+
metadata: {
|
|
42
|
+
provider: 'postmark',
|
|
43
|
+
submittedAt: result.SubmittedAt,
|
|
44
|
+
timestamp: new Date().toISOString()
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return {
|
|
50
|
+
success: false,
|
|
51
|
+
errorMessage: this.formatPostmarkError(error),
|
|
52
|
+
providerResponse: error,
|
|
53
|
+
metadata: {
|
|
54
|
+
provider: 'postmark',
|
|
55
|
+
timestamp: new Date().toISOString()
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async sendBatch(emails) {
|
|
61
|
+
try {
|
|
62
|
+
const batchSize = Math.min(emails.length, this.getCapabilities().maxBatchSize);
|
|
63
|
+
const results = [];
|
|
64
|
+
// Process emails in batches
|
|
65
|
+
for (let i = 0; i < emails.length; i += batchSize) {
|
|
66
|
+
const batch = emails.slice(i, i + batchSize);
|
|
67
|
+
const batchResults = await this.sendBatchChunk(batch);
|
|
68
|
+
results.push(...batchResults);
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
// If batch fails, return individual error results
|
|
74
|
+
return emails.map(() => ({
|
|
75
|
+
success: false,
|
|
76
|
+
errorMessage: this.formatPostmarkError(error),
|
|
77
|
+
metadata: {
|
|
78
|
+
provider: 'postmark',
|
|
79
|
+
timestamp: new Date().toISOString()
|
|
80
|
+
}
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async sendBatchChunk(emails) {
|
|
85
|
+
try {
|
|
86
|
+
const postmarkMessages = emails.map(email => this.convertToPostmarkMessage(email));
|
|
87
|
+
const response = await fetch(`${this.baseUrl}/email/batch`, {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
headers: {
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
'X-Postmark-Server-Token': this.config.apiKey
|
|
92
|
+
},
|
|
93
|
+
body: JSON.stringify(postmarkMessages)
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
const errorData = await response.json();
|
|
97
|
+
throw new Error(`Postmark batch API error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
98
|
+
}
|
|
99
|
+
const results = await response.json();
|
|
100
|
+
return results.map((result) => ({
|
|
101
|
+
success: result.ErrorCode === 0,
|
|
102
|
+
messageId: result.MessageID,
|
|
103
|
+
errorMessage: result.ErrorCode !== 0 ? result.Message : undefined,
|
|
104
|
+
providerResponse: result,
|
|
105
|
+
metadata: {
|
|
106
|
+
provider: 'postmark',
|
|
107
|
+
submittedAt: result.SubmittedAt,
|
|
108
|
+
timestamp: new Date().toISOString()
|
|
109
|
+
}
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return emails.map(() => ({
|
|
114
|
+
success: false,
|
|
115
|
+
errorMessage: this.formatPostmarkError(error),
|
|
116
|
+
metadata: {
|
|
117
|
+
provider: 'postmark',
|
|
118
|
+
timestamp: new Date().toISOString()
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async sendTemplateEmail(templateId, toEmail, variables) {
|
|
124
|
+
try {
|
|
125
|
+
const postmarkMessage = {
|
|
126
|
+
From: this.config.fromEmail,
|
|
127
|
+
To: toEmail,
|
|
128
|
+
TemplateId: parseInt(templateId),
|
|
129
|
+
TemplateModel: variables,
|
|
130
|
+
MessageStream: 'outbound'
|
|
131
|
+
};
|
|
132
|
+
const response = await fetch(`${this.baseUrl}/email/withTemplate`, {
|
|
133
|
+
method: 'POST',
|
|
134
|
+
headers: {
|
|
135
|
+
'Content-Type': 'application/json',
|
|
136
|
+
'X-Postmark-Server-Token': this.config.apiKey
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify(postmarkMessage)
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorData = await response.json();
|
|
142
|
+
throw new Error(`Postmark template API error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
143
|
+
}
|
|
144
|
+
const result = await response.json();
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
messageId: result.MessageID,
|
|
148
|
+
providerResponse: result,
|
|
149
|
+
metadata: {
|
|
150
|
+
provider: 'postmark',
|
|
151
|
+
templateId,
|
|
152
|
+
submittedAt: result.SubmittedAt,
|
|
153
|
+
timestamp: new Date().toISOString()
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return {
|
|
159
|
+
success: false,
|
|
160
|
+
errorMessage: this.formatPostmarkError(error),
|
|
161
|
+
providerResponse: error,
|
|
162
|
+
metadata: {
|
|
163
|
+
provider: 'postmark',
|
|
164
|
+
templateId,
|
|
165
|
+
timestamp: new Date().toISOString()
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async createTemplate(template) {
|
|
171
|
+
try {
|
|
172
|
+
const postmarkTemplate = {
|
|
173
|
+
Name: template.name,
|
|
174
|
+
Subject: template.subject,
|
|
175
|
+
HtmlBody: template.htmlContent,
|
|
176
|
+
TextBody: template.textContent,
|
|
177
|
+
AssociatedServerId: 0 // Use default server
|
|
178
|
+
};
|
|
179
|
+
const response = await fetch(`${this.baseUrl}/templates`, {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
headers: {
|
|
182
|
+
'Content-Type': 'application/json',
|
|
183
|
+
'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
|
|
184
|
+
},
|
|
185
|
+
body: JSON.stringify(postmarkTemplate)
|
|
186
|
+
});
|
|
187
|
+
if (!response.ok) {
|
|
188
|
+
const errorData = await response.json();
|
|
189
|
+
throw new Error(`Postmark template creation error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
190
|
+
}
|
|
191
|
+
const result = await response.json();
|
|
192
|
+
return result.TemplateID.toString();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
throw new Error(`Failed to create Postmark template: ${this.formatPostmarkError(error)}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async updateTemplate(template) {
|
|
199
|
+
try {
|
|
200
|
+
const postmarkTemplate = {
|
|
201
|
+
Name: template.name,
|
|
202
|
+
Subject: template.subject,
|
|
203
|
+
HtmlBody: template.htmlContent,
|
|
204
|
+
TextBody: template.textContent
|
|
205
|
+
};
|
|
206
|
+
const response = await fetch(`${this.baseUrl}/templates/${template.id}`, {
|
|
207
|
+
method: 'PUT',
|
|
208
|
+
headers: {
|
|
209
|
+
'Content-Type': 'application/json',
|
|
210
|
+
'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
|
|
211
|
+
},
|
|
212
|
+
body: JSON.stringify(postmarkTemplate)
|
|
213
|
+
});
|
|
214
|
+
if (!response.ok) {
|
|
215
|
+
const errorData = await response.json();
|
|
216
|
+
throw new Error(`Postmark template update error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw new Error(`Failed to update Postmark template: ${this.formatPostmarkError(error)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async deleteTemplate(templateId) {
|
|
224
|
+
try {
|
|
225
|
+
const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
|
|
226
|
+
method: 'DELETE',
|
|
227
|
+
headers: {
|
|
228
|
+
'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
if (!response.ok) {
|
|
232
|
+
const errorData = await response.json();
|
|
233
|
+
throw new Error(`Postmark template deletion error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
throw new Error(`Failed to delete Postmark template: ${this.formatPostmarkError(error)}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async getTemplate(templateId) {
|
|
241
|
+
try {
|
|
242
|
+
const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
|
|
243
|
+
method: 'GET',
|
|
244
|
+
headers: {
|
|
245
|
+
'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
if (!response.ok) {
|
|
249
|
+
if (response.status === 404) {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
const errorData = await response.json();
|
|
253
|
+
throw new Error(`Postmark template fetch error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
254
|
+
}
|
|
255
|
+
const result = await response.json();
|
|
256
|
+
const template = result;
|
|
257
|
+
return {
|
|
258
|
+
id: template.TemplateID.toString(),
|
|
259
|
+
name: template.Name,
|
|
260
|
+
subject: template.Subject,
|
|
261
|
+
htmlContent: template.HtmlBody,
|
|
262
|
+
textContent: template.TextBody,
|
|
263
|
+
variables: [], // Postmark doesn't provide variable list
|
|
264
|
+
createdAt: new Date(template.CreatedAt),
|
|
265
|
+
updatedAt: new Date(template.UpdatedAt)
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
throw new Error(`Failed to get Postmark template: ${this.formatPostmarkError(error)}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async listTemplates() {
|
|
273
|
+
try {
|
|
274
|
+
const response = await fetch(`${this.baseUrl}/templates`, {
|
|
275
|
+
method: 'GET',
|
|
276
|
+
headers: {
|
|
277
|
+
'X-Postmark-Account-Token': (this.config.accountToken || this.config.apiKey)
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
if (!response.ok) {
|
|
281
|
+
const errorData = await response.json();
|
|
282
|
+
throw new Error(`Postmark templates list error: ${response.status} - ${JSON.stringify(errorData)}`);
|
|
283
|
+
}
|
|
284
|
+
const result = await response.json();
|
|
285
|
+
const templates = [];
|
|
286
|
+
for (const template of result.Templates || []) {
|
|
287
|
+
const fullTemplate = await this.getTemplate(template.TemplateID.toString());
|
|
288
|
+
if (fullTemplate) {
|
|
289
|
+
templates.push(fullTemplate);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return templates;
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
throw new Error(`Failed to list Postmark templates: ${this.formatPostmarkError(error)}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async getDeliveryStatus(messageId) {
|
|
299
|
+
try {
|
|
300
|
+
const response = await fetch(`${this.baseUrl}/messages/outbound/${messageId}/details`, {
|
|
301
|
+
method: 'GET',
|
|
302
|
+
headers: {
|
|
303
|
+
'X-Postmark-Server-Token': this.config.apiKey
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
if (!response.ok) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
const result = await response.json();
|
|
310
|
+
const message = result;
|
|
311
|
+
const status = this.mapPostmarkStatusToDeliveryStatus(message.Status);
|
|
312
|
+
return {
|
|
313
|
+
messageId,
|
|
314
|
+
status,
|
|
315
|
+
...(status === 'delivered' && { deliveredAt: new Date(message.DeliveredAt) }),
|
|
316
|
+
metadata: {
|
|
317
|
+
provider: 'postmark',
|
|
318
|
+
status: message.Status,
|
|
319
|
+
recipient: message.Recipient
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async processWebhook(_payload, _signature) {
|
|
328
|
+
// Implement Postmark webhook processing
|
|
329
|
+
// This would validate the signature and parse the webhook payload
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
332
|
+
async testConnection() {
|
|
333
|
+
try {
|
|
334
|
+
// Test by getting server info
|
|
335
|
+
const response = await fetch(`${this.baseUrl}/server`, {
|
|
336
|
+
method: 'GET',
|
|
337
|
+
headers: {
|
|
338
|
+
'X-Postmark-Server-Token': this.config.apiKey
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
return response.ok;
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
validateConfiguration() {
|
|
348
|
+
const errors = [];
|
|
349
|
+
const warnings = [];
|
|
350
|
+
if (!this.config.apiKey) {
|
|
351
|
+
errors.push('Postmark API key is required');
|
|
352
|
+
}
|
|
353
|
+
if (!this.config.fromEmail) {
|
|
354
|
+
errors.push('From email is required');
|
|
355
|
+
}
|
|
356
|
+
if (!this.config.accountToken && this.config.apiKey) {
|
|
357
|
+
warnings.push('Account token not provided - template operations may be limited');
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
isValid: errors.length === 0,
|
|
361
|
+
errors,
|
|
362
|
+
warnings
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
validateEmailMessage(message) {
|
|
366
|
+
const errors = [];
|
|
367
|
+
const warnings = [];
|
|
368
|
+
if (!message.toEmail) {
|
|
369
|
+
errors.push('Recipient email is required');
|
|
370
|
+
}
|
|
371
|
+
else if (!this.isValidEmail(message.toEmail)) {
|
|
372
|
+
errors.push('Invalid recipient email format');
|
|
373
|
+
}
|
|
374
|
+
if (!message.subject) {
|
|
375
|
+
errors.push('Email subject is required');
|
|
376
|
+
}
|
|
377
|
+
if (!message.htmlContent && !message.textContent) {
|
|
378
|
+
errors.push('Either HTML or text content is required');
|
|
379
|
+
}
|
|
380
|
+
if (message.attachments && message.attachments.length > 0) {
|
|
381
|
+
const totalSize = message.attachments.reduce((sum, attachment) => {
|
|
382
|
+
return sum + (attachment.content ? Buffer.from(attachment.content, 'base64').length : 0);
|
|
383
|
+
}, 0);
|
|
384
|
+
if (totalSize > this.getCapabilities().maxAttachmentSize) {
|
|
385
|
+
errors.push(`Total attachment size exceeds maximum allowed size`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return {
|
|
389
|
+
isValid: errors.length === 0,
|
|
390
|
+
errors,
|
|
391
|
+
warnings
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
getCapabilities() {
|
|
395
|
+
return {
|
|
396
|
+
supportsBatch: true,
|
|
397
|
+
supportsTemplates: true,
|
|
398
|
+
supportsWebhooks: true,
|
|
399
|
+
supportsAttachments: true,
|
|
400
|
+
supportsDeliveryTracking: true,
|
|
401
|
+
maxBatchSize: 500,
|
|
402
|
+
maxAttachmentSize: 10 * 1024 * 1024 // 10MB
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
convertToPostmarkMessage(message) {
|
|
406
|
+
const postmarkMessage = {
|
|
407
|
+
From: message.fromEmail || this.config.fromEmail,
|
|
408
|
+
To: message.toEmail,
|
|
409
|
+
Subject: message.subject
|
|
410
|
+
};
|
|
411
|
+
if (message.htmlContent) {
|
|
412
|
+
postmarkMessage.HtmlBody = message.htmlContent;
|
|
413
|
+
}
|
|
414
|
+
if (message.textContent) {
|
|
415
|
+
postmarkMessage.TextBody = message.textContent;
|
|
416
|
+
}
|
|
417
|
+
if (message.replyTo) {
|
|
418
|
+
postmarkMessage.ReplyTo = message.replyTo;
|
|
419
|
+
}
|
|
420
|
+
if (message.headers) {
|
|
421
|
+
postmarkMessage.Headers = Object.entries(message.headers).map(([key, value]) => ({
|
|
422
|
+
Name: key,
|
|
423
|
+
Value: value
|
|
424
|
+
}));
|
|
425
|
+
}
|
|
426
|
+
if (message.attachments && message.attachments.length > 0) {
|
|
427
|
+
postmarkMessage.Attachments = message.attachments.map(attachment => ({
|
|
428
|
+
Name: attachment.filename,
|
|
429
|
+
Content: attachment.content,
|
|
430
|
+
ContentType: attachment.contentType || 'application/octet-stream'
|
|
431
|
+
}));
|
|
432
|
+
}
|
|
433
|
+
if (message.metadata) {
|
|
434
|
+
postmarkMessage.Metadata = message.metadata;
|
|
435
|
+
}
|
|
436
|
+
return postmarkMessage;
|
|
437
|
+
}
|
|
438
|
+
mapPostmarkStatusToDeliveryStatus(status) {
|
|
439
|
+
switch (status?.toLowerCase()) {
|
|
440
|
+
case 'delivered':
|
|
441
|
+
return 'delivered';
|
|
442
|
+
case 'bounced':
|
|
443
|
+
return 'bounced';
|
|
444
|
+
case 'failed':
|
|
445
|
+
return 'failed';
|
|
446
|
+
case 'pending':
|
|
447
|
+
return 'pending';
|
|
448
|
+
case 'sent':
|
|
449
|
+
return 'sent';
|
|
450
|
+
case 'opened':
|
|
451
|
+
return 'opened';
|
|
452
|
+
case 'clicked':
|
|
453
|
+
return 'clicked';
|
|
454
|
+
case 'spam':
|
|
455
|
+
return 'spam';
|
|
456
|
+
case 'unsubscribed':
|
|
457
|
+
return 'unsubscribed';
|
|
458
|
+
default:
|
|
459
|
+
return 'sent';
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
formatPostmarkError(error) {
|
|
463
|
+
if (error.message) {
|
|
464
|
+
if (error.message.includes('401')) {
|
|
465
|
+
return 'Invalid Postmark API key';
|
|
466
|
+
}
|
|
467
|
+
if (error.message.includes('403')) {
|
|
468
|
+
return 'Access denied - check API key permissions';
|
|
469
|
+
}
|
|
470
|
+
if (error.message.includes('422')) {
|
|
471
|
+
return 'Invalid email parameters';
|
|
472
|
+
}
|
|
473
|
+
if (error.message.includes('429')) {
|
|
474
|
+
return 'Rate limit exceeded';
|
|
475
|
+
}
|
|
476
|
+
return error.message;
|
|
477
|
+
}
|
|
478
|
+
return 'Unknown Postmark error';
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
exports.PostmarkProvider = PostmarkProvider;
|
|
482
|
+
//# sourceMappingURL=postmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postmark.js","sourceRoot":"","sources":["../../src/providers/postmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SendGrid Email Provider implementation
|
|
3
|
+
*/
|
|
4
|
+
import { EmailProvider } from './base';
|
|
5
|
+
import { EmailMessage, SendResult, DeliveryStatus, WebhookEvent, EmailProviderConfig } from '../types';
|
|
6
|
+
export declare class SendGridProvider extends EmailProvider {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private baseUrl;
|
|
9
|
+
constructor(config: EmailProviderConfig);
|
|
10
|
+
/**
|
|
11
|
+
* Send a single email
|
|
12
|
+
*/
|
|
13
|
+
sendEmail(email: EmailMessage): Promise<SendResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Send multiple emails
|
|
16
|
+
*/
|
|
17
|
+
sendBatch(emails: EmailMessage[]): Promise<SendResult[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Get delivery status for a message
|
|
20
|
+
*/
|
|
21
|
+
getDeliveryStatus(messageId: string): Promise<DeliveryStatus | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Process webhook events from SendGrid
|
|
24
|
+
*/
|
|
25
|
+
processWebhook(payload: any, signature: string): Promise<WebhookEvent[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Override capabilities for SendGrid
|
|
28
|
+
*/
|
|
29
|
+
getCapabilities(): {
|
|
30
|
+
supportsBatch: boolean;
|
|
31
|
+
supportsTemplates: boolean;
|
|
32
|
+
supportsWebhooks: boolean;
|
|
33
|
+
supportsAttachments: boolean;
|
|
34
|
+
supportsDeliveryTracking: boolean;
|
|
35
|
+
maxBatchSize: number;
|
|
36
|
+
maxAttachmentSize: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Create a template in SendGrid
|
|
40
|
+
*/
|
|
41
|
+
createTemplate(templateData: {
|
|
42
|
+
name: string;
|
|
43
|
+
subject: string;
|
|
44
|
+
htmlContent: string;
|
|
45
|
+
textContent?: string;
|
|
46
|
+
}): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Send an email using a SendGrid template
|
|
49
|
+
*/
|
|
50
|
+
sendTemplateEmail(templateId: string, toEmail: string, templateData: Record<string, any>, toName?: string): Promise<SendResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Test the SendGrid connection
|
|
53
|
+
*/
|
|
54
|
+
testConnection(): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Override configuration validation for SendGrid
|
|
57
|
+
*/
|
|
58
|
+
validateConfiguration(): {
|
|
59
|
+
isValid: boolean;
|
|
60
|
+
errors: string[];
|
|
61
|
+
warnings: string[];
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Make API request to SendGrid
|
|
65
|
+
*/
|
|
66
|
+
private makeApiRequest;
|
|
67
|
+
/**
|
|
68
|
+
* Verify webhook signature
|
|
69
|
+
*/
|
|
70
|
+
private verifyWebhookSignature;
|
|
71
|
+
/**
|
|
72
|
+
* Map SendGrid status to our status enum
|
|
73
|
+
*/
|
|
74
|
+
private mapSendGridStatus;
|
|
75
|
+
/**
|
|
76
|
+
* Generate a message ID for tracking
|
|
77
|
+
*/
|
|
78
|
+
private generateMessageId;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sendgrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendgrid.d.ts","sourceRoot":"","sources":["../../src/providers/sendgrid.ts"],"names":[],"mappings":"AAQA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA0BvG,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,MAAM,EAAE,mBAAmB;IAUvC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAqHzD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAW9D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuC1E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiC9E;;OAEG;IACM,eAAe;;;;;;;;;IAYxB;;OAEG;IACY,cAAc,CAAC,YAAY,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCnB;;OAEG;IACY,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAoDtB;;OAEG;IACY,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWjD;;OAEG;IACM,qBAAqB;;;;;IAmB9B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
|