mail2dns
v1.0.0
Published
CLI that automates DNS setup for email.
Maintainers
Keywords
Readme
CLI that automatically creates MX, SPF, DKIM, DMARC and verification DNS records for email providers. Supports multiple DNS providers.
👍 Stop manually copy-pasting DNS records for email!
⭐ Currently Supports 12 email providers and 10 DNS providers in any combination.
🔗 See website for setup guides for every provider combination
Example
mail2dns setup example.com googleworkspace cloudflareCreates:
- MX records
- SPF record
- DKIM records
- DMARC record
- Domain verification records
📦 Installation
Requires Node.js 18+.
npm install -g mail2dns⚙️ Usage
Setup
Create DNS records for an email provider
mail2dns setup [options] <domain> <email-provider> <dns-provider>Email Providers
migadu, googleworkspace, ms365, outlook, fastmail, mailgun, proton, zoho, sendgrid, resend, postmark, ses
DNS Providers
cloudflare, digitalocean, godaddy, gcloud, netlify, route53, vercel, hetzner, spaceship, azure
Provider Options
Provider-specific options are prompted interactively if not provided via flag or environment variable. See the providers reference below.
Options
| Flag | Description | Default |
|------|-------------|---------|
| -o, --no-mx | Skip MX records (set up DNS for outbound email only) | false |
| -n, --skip-verify | Skip domain verification step (use if domain is already verified) | false |
| -y, --yes | Skip confirmation prompts (the command will error if any required inputs are missing) | false |
| --allow-insecure-flags | Allow secrets to be passed via command-line flags (not recommended) | false |
| -d, --dry-run | Show records that would be created without applying them | false |
| -z, --zone | DNS zone that contains the domain (overrides auto-detection) | undefined |
| -p, --dmarc-policy | DMARC policy to use in the _dmarc TXT record (none, quarantine, reject) | none |
Verify
Check that expected DNS records for an email provider are present via public DNS lookup
mail2dns verify [options] <domain> <email-provider>Email Providers
migadu, googleworkspace, ms365, outlook, fastmail, mailgun, proton, zoho, sendgrid, resend, postmark, ses
Provider Options
Provider-specific options are prompted interactively if not provided via flag or environment variable. See the providers reference below.
Options
| Flag | Description | Default |
|------|-------------|---------|
| -o, --no-mx | Skip MX records (verify DNS for outbound email only) | false |
| -p, --dmarc-policy | Expected DMARC policy in the _dmarc TXT record (none, quarantine, reject) | none |
List
Show existing DNS records for a domain via the DNS provider API
mail2dns list [options] <domain> <dns-provider>DNS Providers
cloudflare, digitalocean, godaddy, gcloud, netlify, route53, vercel, hetzner, spaceship, azure
Provider Options
Provider-specific options are prompted interactively if not provided via flag or environment variable. See the providers reference below.
Options
| Flag | Description | Default |
|------|-------------|---------|
| --allow-insecure-flags | Allow secrets to be passed via command-line flags (not recommended) | false |
| -z, --zone | DNS zone that contains the domain (overrides auto-detection) | undefined |
💻 Examples
Interactive — prompts for any required inputs
mail2dns setup example.com migadu cloudflareNon-interactive - inputs provided via flags
mail2dns setup example.com migadu cloudflare --verify-txt "hosted-email-verify=YOUR_KEY" --token YOUR_CF_TOKENNon-interactive - inputs provided via environment variables
MIGADU_VERIFY_TXT="hosted-email-verify=YOUR_KEY" \
CLOUDFLARE_API_TOKEN=YOUR_CF_TOKEN \
mail2dns setup example.com migadu cloudflare✅ Supported Email providers
| Provider | Key |
|----------|-----|
| Migadu | migadu |
| Google Workspace | googleworkspace |
| Microsoft 365 | ms365 |
| Microsoft Outlook | outlook |
| Fastmail | fastmail |
| Mailgun | mailgun |
| Proton Mail | proton |
| Zoho Mail | zoho |
| Twilio SendGrid | sendgrid |
| Resend | resend |
| Postmark | postmark |
| Amazon SES | ses |
✅ Supported DNS providers
| Provider | Key |
|----------|-----|
| Cloudflare | cloudflare |
| DigitalOcean | digitalocean |
| GoDaddy | godaddy |
| Google Cloud | gcloud |
| Netlify | netlify |
| Amazon Route 53 | route53 |
| Vercel | vercel |
| Hetzner | hetzner |
| Spaceship | spaceship |
| Azure DNS | azure |
📧 Email providers
Migadu
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | MIGADU_VERIFY_TXT | Migadu verification TXT value | hosted-email-verify=abc123 |
Google Workspace
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | GOOGLE_VERIFY_TXT | Google Workspace verification TXT value | google-site-verification=abc123 |
| --dkim-key | GOOGLE_DKIM_KEY | Google Workspace DKIM key | v=DKIM1; k=rsa; p=... |
Microsoft 365
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | MS365_VERIFY_TXT | Microsoft 365 domain verification TXT value | MS=ms12345678 |
| --dkim-selector1-target | MS365_DKIM_SELECTOR1 | DKIM selector1 CNAME target | selector1-example-com._domainkey.example.onmicrosoft.com |
| --dkim-selector2-target | MS365_DKIM_SELECTOR2 | DKIM selector2 CNAME target | selector2-example-com._domainkey.example.onmicrosoft.com |
Microsoft Outlook
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | MS365_VERIFY_TXT | Microsoft 365 domain verification TXT value | MS=ms12345678 |
| --dkim-selector1-target | MS365_DKIM_SELECTOR1 | DKIM selector1 CNAME target | selector1-example-com._domainkey.example.onmicrosoft.com |
| --dkim-selector2-target | MS365_DKIM_SELECTOR2 | DKIM selector2 CNAME target | selector2-example-com._domainkey.example.onmicrosoft.com |
Fastmail
Mailgun
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --dkim-txt | MAILGUN_DKIM_TXT | DKIM TXT value | k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4... |
Proton Mail
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | PROTON_VERIFY_TXT | Proton Mail domain verification TXT value | protonmail-verification=abc123 |
| --dkim-cname1 | PROTON_DKIM_CNAME1 | DKIM CNAME 1 target | protonmail.domainkey.abc123.domains.proton.ch |
| --dkim-cname2 | PROTON_DKIM_CNAME2 | DKIM CNAME 2 target | protonmail2.domainkey.abc123.domains.proton.ch |
| --dkim-cname3 | PROTON_DKIM_CNAME3 | DKIM CNAME 3 target | protonmail3.domainkey.abc123.domains.proton.ch |
Zoho Mail
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --verify-txt | ZOHO_VERIFY_TXT | Zoho Mail domain verification TXT value | zoho-verification=zb12345678.zmverify.zoho.com |
| --dkim-name | ZOHO_DKIM_NAME | Zoho Mail DKIM record hostname | zmail._domainkey |
| --dkim-key | ZOHO_DKIM_KEY | Zoho Mail DKIM TXT value | v=DKIM1; k=rsa; p=... |
| --zoho-region | ZOHO_REGION | Zoho Mail region | |
Twilio SendGrid
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --return-path-name | SENDGRID_RETURN_PATH_NAME | SendGrid return path CNAME hostname | em1234.yourdomain.com |
| --return-path-value | SENDGRID_RETURN_PATH_VALUE | SendGrid return path CNAME value | u12345.wl123.sendgrid.net |
| --dkim1 | SENDGRID_DKIM1 | DKIM CNAME 1 value | s1.domainkey.u12345.wl123.sendgrid.net |
| --dkim2 | SENDGRID_DKIM2 | DKIM CNAME 2 value | s2.domainkey.u12345.wl123.sendgrid.net |
Resend
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --dkim-key | RESEND_DKIM_KEY | Resend DKIM TXT value | p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ... |
| --resend-region | RESEND_REGION | Resend region | |
Postmark
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --dkim-name | POSTMARK_DKIM_NAME | DKIM TXT record hostname | 202060101010101pm._domainkey |
| --dkim-value | POSTMARK_DKIM_VALUE | DKIM TXT record value | k=rsa;p=MIGfMA0... |
Amazon SES
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --aws-profile | AWS_PROFILE | AWS profile to use | my-profile |
⬛ DNS providers
Cloudflare
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --token | CLOUDFLARE_API_TOKEN | Cloudflare API token | |
DigitalOcean
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --token | DIGITALOCEAN_TOKEN | DigitalOcean API token | |
GoDaddy
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --key | GODADDY_API_KEY | GoDaddy API key | |
| --secret | GODADDY_API_SECRET | GoDaddy API secret | |
Google Cloud
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --project | CLOUDSDK_CORE_PROJECT | Google Cloud project ID to use | my-project-123 |
Netlify
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --token | NETLIFY_AUTH_TOKEN | Netlify personal access token | |
Amazon Route 53
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --aws-profile | AWS_PROFILE | AWS profile to use | my-profile |
Vercel
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --token | VERCEL_TOKEN | Vercel API token | |
| --team-id | VERCEL_TEAM_ID | Vercel team ID | |
Hetzner
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --token | HCLOUD_TOKEN | Hetzner Cloud API token | |
Spaceship
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --api-key | SPACESHIP_API_KEY | Spaceship API key | |
| --api-secret | SPACESHIP_API_SECRET | Spaceship API secret | |
Azure DNS
Inputs
| Flag | Env var | Description | Example |
|------|---------|-------------|---------|
| --subscription | AZURE_SUBSCRIPTION_ID | Azure subscription ID to use | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
