1
import { useEnv } from '@directus/env';
2
import type { Transporter } from 'nodemailer';
3
import nodemailer from 'nodemailer';
4
import { useLogger } from './logger.js';
5
import { getConfigFromEnv } from './utils/get-config-from-env.js';
7
import { createRequire } from 'node:module';
9
const require = createRequire(import.meta.url);
11
let transporter: Transporter;
13
export default function getMailer(): Transporter {
14
if (transporter) return transporter;
17
const logger = useLogger();
19
const transportName = (env['EMAIL_TRANSPORT'] as string).toLowerCase();
21
if (transportName === 'sendmail') {
22
transporter = nodemailer.createTransport({
24
newline: (env['EMAIL_SENDMAIL_NEW_LINE'] as string) || 'unix',
25
path: (env['EMAIL_SENDMAIL_PATH'] as string) || '/usr/sbin/sendmail',
27
} else if (transportName === 'ses') {
28
const aws = require('@aws-sdk/client-ses');
30
const sesOptions: Record<string, unknown> = getConfigFromEnv('EMAIL_SES_');
32
const ses = new aws.SES(sesOptions);
34
transporter = nodemailer.createTransport({
36
} as Record<string, unknown>);
37
} else if (transportName === 'smtp') {
38
let auth: boolean | { user?: string; pass?: string } = false;
40
if (env['EMAIL_SMTP_USER'] || env['EMAIL_SMTP_PASSWORD']) {
42
user: env['EMAIL_SMTP_USER'] as string,
43
pass: env['EMAIL_SMTP_PASSWORD'] as string,
47
const tls: Record<string, unknown> = getConfigFromEnv('EMAIL_SMTP_TLS_');
49
transporter = nodemailer.createTransport({
50
name: env['EMAIL_SMTP_NAME'],
51
pool: env['EMAIL_SMTP_POOL'],
52
host: env['EMAIL_SMTP_HOST'],
53
port: env['EMAIL_SMTP_PORT'],
54
secure: env['EMAIL_SMTP_SECURE'],
55
ignoreTLS: env['EMAIL_SMTP_IGNORE_TLS'],
58
} as Record<string, unknown>);
59
} else if (transportName === 'mailgun') {
60
const mg = require('nodemailer-mailgun-transport');
62
transporter = nodemailer.createTransport(
65
api_key: env['EMAIL_MAILGUN_API_KEY'],
66
domain: env['EMAIL_MAILGUN_DOMAIN'],
68
host: env['EMAIL_MAILGUN_HOST'] || 'api.mailgun.net',
71
} else if (transportName === 'sendgrid') {
72
const sg = require('nodemailer-sendgrid');
74
transporter = nodemailer.createTransport(
76
apiKey: env['EMAIL_SENDGRID_API_KEY'],
80
logger.warn('Illegal transport given for email. Check the EMAIL_TRANSPORT env var.');