api/src/mailer.ts
Rama main · réplica de lectura del repositorio original.
import { createRequire } from 'node:module';
import { useEnv } from '@directus/env';
import type { Transporter } from 'nodemailer';
import nodemailer from 'nodemailer';
import { useLogger } from './logger/index.js';
import { getConfigFromEnv } from './utils/get-config-from-env.js';
const require = createRequire(import.meta.url);
let transporter: Transporter;
export default function getMailer(): Transporter {
if (transporter) return transporter;
const env = useEnv();
const logger = useLogger();
const transportName = env.EMAIL_TRANSPORT.toLowerCase();
if (transportName === 'sendmail') {
transporter = nodemailer.createTransport({
sendmail: true,
newline: env.EMAIL_SENDMAIL_NEW_LINE,
path: env.EMAIL_SENDMAIL_PATH,
});
} else if (transportName === 'ses') {
const { SESv2Client, SendEmailCommand } = require('@aws-sdk/client-sesv2');
const sesOptions: Record<string, unknown> = getConfigFromEnv('EMAIL_SES_');
const sesClient = new SESv2Client(sesOptions);
transporter = nodemailer.createTransport({
SES: { sesClient, SendEmailCommand },
} as Record<string, unknown>);
} else if (transportName === 'smtp') {
let auth: boolean | { user: string | undefined; pass: string | undefined } = false;
if (env.EMAIL_SMTP_USER || env.EMAIL_SMTP_PASSWORD) {
auth = {
user: env.EMAIL_SMTP_USER!,
pass: env.EMAIL_SMTP_PASSWORD!,
};
}
const tls: Record<string, unknown> = getConfigFromEnv('EMAIL_SMTP_TLS_');
transporter = nodemailer.createTransport({
name: env['EMAIL_SMTP_NAME'],
pool: env['EMAIL_SMTP_POOL'],
host: env['EMAIL_SMTP_HOST'],
port: env['EMAIL_SMTP_PORT'],
secure: env['EMAIL_SMTP_SECURE'],
ignoreTLS: env['EMAIL_SMTP_IGNORE_TLS'],
auth,
tls,
} as Record<string, unknown>);
} else if (transportName === 'mailgun') {
const mg = require('nodemailer-mailgun-transport');
transporter = nodemailer.createTransport(
mg({
auth: {
api_key: env['EMAIL_MAILGUN_API_KEY'],
domain: env['EMAIL_MAILGUN_DOMAIN'],
},
host: env['EMAIL_MAILGUN_HOST'] || 'api.mailgun.net',
}) as any,
);
} else if (transportName === 'mailtrap') {
const { MailtrapTransport } = require('mailtrap');
const mailtrapOptions: Record<string, unknown> = getConfigFromEnv('EMAIL_MAILTRAP_');
// mailtrap's transport has no verify(), so an absent token would only surface on the first send
if (!mailtrapOptions['token']) {
throw new Error('The EMAIL_MAILTRAP_TOKEN env var is required for the mailtrap transport');
}
transporter = nodemailer.createTransport(MailtrapTransport(mailtrapOptions));
} else {
logger.warn('Illegal transport given for email. Check the EMAIL_TRANSPORT env var.');
}
return transporter;
}