@email-service/email-service
Version:
email-service is a versatile npm package designed to simplify the integration and standardization of email communications across multiple Email Service Providers (ESPs).
102 lines (101 loc) • 4.52 kB
JavaScript
import { errorManagement } from "../../utils/error.js";
import { ESP } from "../esp.js";
import { webHookStatus } from "./emailService.status.js";
export class ViewerEmailService extends ESP {
constructor(service) {
super(service);
}
async sendMail(options) {
try {
const body = {
from: formatFromForEmailService(options.from),
to: formatForEmailService(options.to),
cc: options.cc ? formatForEmailService(options.cc) : undefined,
bcc: options.bcc ? formatForEmailService(options.bcc) : undefined,
subject: options.subject,
htmlBody: options.html,
textBody: options.text,
tag: 'email-test',
// Tag: options.tag,
replyTo: 'server@question.direct',
//Headers: options.headers,
metaData: options.metaData,
// TrackOpens: options.trackOpens,
// TrackLinks: options.trackLinks,
// Metadata: options.metadata,
// Attachments: options.attachments
};
const opts = {
method: 'POST', headers: {
'Content-Type': 'application/json',
'X-Mail-Service-Viewer-Token': this.transporter.apiToken,
'X-Mail-Service-Web-Hook': this.transporter.webhook
},
body: JSON.stringify(body)
};
if (this.transporter.logger)
console.log('******** ES-SendMail Email-service-viewer ******** opts', opts);
const uri = this.transporter.esp === 'emailserviceviewerlocal' ? 'http://localhost:3000/sendEmail' : 'https://api.email-service.dev/sendEmail';
const response = await fetch(uri, opts);
if (!response.ok) {
if (this.transporter.logger)
console.log('******** ES-SendMail Email-service-viewer ******** response ko', response.status, response.statusText);
return { success: false, status: response.status, error: { name: response.statusText, category: 'SERVER_EXCEPTION', cause: opts } };
}
const retour = await response.json();
if (this.transporter.logger)
console.log('******** ES-SendMail Email-service-viewer ******** data from fetch', retour);
if (retour.success)
return {
success: true,
status: 200,
data: retour.data
};
else {
return { success: false, status: retour.status, error: retour.error };
}
}
catch (error) {
return { success: false, status: 500, error: errorManagement(error) };
}
}
async webHookManagement(req) {
if (this.transporter.logger)
console.log('******** ES-WebHook Email-service-viewer ******** req', req);
const result = webHookStatus[req.data.type];
if (result) {
if (this.transporter.logger)
console.log('******** ES-WebHook Email-service-viewer ******** result', result);
const data = {
webHookType: result,
message: 'n/a',
messageId: req.data.messageId,
subject: req.data.subject,
from: req.data.from,
to: req.data.to,
metaData: req.data.metaData
};
return { success: true, status: 200, data, espData: req.data };
}
else
return { success: false, status: 500, error: { name: 'NO_STATUS_FOR_WEBHOOK', message: 'No status aviable for webhook' } };
}
}
/**
* Converts recipients to Emailservice format: "John Doe <john@example.com>, Jane Doe <jane@example.com>"
*
* @param recipients - Array of `{ name, email }` objects.
* @returns A string formatted for EmailService.
*/
function formatForEmailService(recipients) {
return recipients.map(r => r.name ? `${r.name} <${r.email}>` : r.email).join(", ");
}
/**
* Converts recipients to Emailservice format: "John Doe <john@example.com>, Jane Doe <jane@example.com>"
*
* @param recipients - Array of `{ name, email }` objects.
* @returns A string formatted for EmailService.
*/
function formatFromForEmailService(recipients) {
return recipients.name ? `${recipients.name} <${recipients.email}>` : recipients.email;
}