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 = getConfigFromEnv('EMAIL_SES_'); const sesClient = new SESv2Client(sesOptions); transporter = nodemailer.createTransport({ SES: { sesClient, SendEmailCommand }, } as Record); } 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 = 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); } 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 = 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; }