Groundmail with AdonisJS
Use adonisjs-groundmail as a mail transport for @adonisjs/mail. Your mail classes and mail.send() calls stay the same; delivery goes through the Groundmail HTTP API. It works with @adonisjs/mail 9 (AdonisJS 6) and 10 (AdonisJS 7).
1. Install
npm install adonisjs-groundmailGROUNDMAIL_API_KEY=gm_your_key_hereAdd the key to start/env.ts:
GROUNDMAIL_API_KEY: Env.schema.string(),2. Add the mailer
// config/mail.ts
import env from '#start/env'
import { defineConfig } from '@adonisjs/mail'
import { groundmailTransport } from 'adonisjs-groundmail'
const mailConfig = defineConfig({
default: 'groundmail',
mailers: {
groundmail: groundmailTransport({
apiKey: env.get('GROUNDMAIL_API_KEY'),
}),
},
})
export default mailConfig
declare module '@adonisjs/mail/types' {
export interface MailersList extends InferMailers<typeof mailConfig> {}
}3. Send an email
import mail from '@adonisjs/mail/services/main'
await mail.send((message) => {
message
.from('noreply@yourdomain.com')
.to(user.email)
.subject('Verify your email address')
.htmlView('emails/verify_email', { user })
})The From address must be on a domain you have verified in Groundmail. Attachments from message.attach(), attachData() and embed() are read and sent with the message, and queued mail (mail.sendLater) uses the same transport.
Groundmail headers
message.header('X-Groundmail-Tag', 'flow=signup')
message.header('X-Groundmail-Idempotency-Key', `verify-${user.id}`)| Header | Purpose |
|---|---|
X-Groundmail-Tag |
name=value tag (repeatable) |
X-Groundmail-Idempotency-Key |
Send once, even when your code retries |
X-Groundmail-Scheduled-At |
ISO 8601 time to send later |