mailer.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import nodemailer from 'nodemailer'
  2. type SendEmailInput = {
  3. to: string
  4. subject: string
  5. text: string
  6. replyTo?: string
  7. }
  8. let transporter: nodemailer.Transporter | null = null
  9. function getRequiredEnv(name: string): string {
  10. const value = process.env[name]?.trim()
  11. if (!value) {
  12. throw new Error(`Missing required environment variable: ${name}`)
  13. }
  14. return value
  15. }
  16. function getTransporter(): nodemailer.Transporter {
  17. if (transporter) {
  18. return transporter
  19. }
  20. const host = getRequiredEnv('SMTP_HOST')
  21. const port = Number(process.env.SMTP_PORT ?? '587')
  22. const secure = process.env.SMTP_SECURE === 'true'
  23. const user = getRequiredEnv('SMTP_USER')
  24. const pass = getRequiredEnv('SMTP_PASS')
  25. transporter = nodemailer.createTransport({
  26. host,
  27. port,
  28. secure,
  29. auth: {
  30. user,
  31. pass,
  32. },
  33. })
  34. return transporter
  35. }
  36. export async function sendEmail(input: SendEmailInput): Promise<void> {
  37. const fromEmail = process.env.SMTP_FROM_EMAIL?.trim() || getRequiredEnv('SMTP_USER')
  38. await getTransporter().sendMail({
  39. from: fromEmail,
  40. to: input.to,
  41. subject: input.subject,
  42. text: input.text,
  43. replyTo: input.replyTo,
  44. })
  45. }