Skip to content

Instantly share code, notes, and snippets.

@jrdn91
Created January 23, 2026 00:42
Show Gist options
  • Select an option

  • Save jrdn91/47377ff7acd5515103752e71ba3d4ca3 to your computer and use it in GitHub Desktop.

Select an option

Save jrdn91/47377ff7acd5515103752e71ba3d4ca3 to your computer and use it in GitHub Desktop.
Basic dev email client
import { createDevEmailClient } from '@/lib/email/dev-email-client'
import { createProductionEmailClient } from '@/lib/email/production-email-client'
export function createEmailClient(environment: 'development' | 'production') {
if (environment === 'development') {
return createDevEmailClient()
}
return createProductionEmailClient()
}
import nodemailer from 'nodemailer'
import type { Transporter } from 'nodemailer'
import type { EmailClient } from '@/lib/email/email-client-types'
// Email configuration
const emailConfig = {
host: 'localhost',
port: 1025,
secure: false,
}
export function createDevEmailClient(): EmailClient {
const transporter: Transporter = nodemailer.createTransport({
host: emailConfig.host,
port: emailConfig.port,
secure: emailConfig.secure,
})
return {
async sendEmail({ from, to, subject, content }) {
await transporter.sendMail({
from,
to,
subject,
html: content,
})
},
}
}
version: "3.9"
services:
mailpit:
image: axllent/mailpit:latest
container_name: dev-mailpit
ports:
- "1025:1025" # SMTP
- "8025:8025" # Web UI
# Add a small named volume if you want messages to survive container restarts
volumes:
- mailpit_data:/data
environment:
MP_DATABASE: /data/mailpit.db
volumes:
mailpit_data:
export interface EmailClient {
sendEmail: (args: {
from: string
to: string
subject: string
content: string
replyTo?: string
}) => Promise<void>
}
const emailHTML = await renderSomeEmailHTML(data.otp)
const emailClient = createEmailClient(
process.env.NODE_ENV as 'development' | 'production',
)
await emailClient.sendEmail({
from: 'onboarding@example.com',
to: data.email,
subject: 'Here is your verification code',
content: emailHTML,
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment