Swoosh adapter for Cloudflare Email Service.
Note: Cloudflare Email Service is currently in beta. The API may change before general availability. Check the official documentation for the latest updates.
Installation
def deps do
[
{:swoosh_cloudflare, "~> 0.2"}
]
endGetting your Cloudflare credentials
You need two values: an Account ID and an API Token.
Account ID
- Log in to the Cloudflare dashboard
- Select any domain (or go to the account home page)
- Your Account ID is shown on the right sidebar under "Account ID"
API Token
You need a token with permission to send emails via the Email Service API.
- Go to My Profile → API Tokens
- Click Create Token
- Use Create Custom Token
- Add the permission: Account → Email Sending — Send
- Under Account Resources, select your account
- Click Continue to summary → Create Token
- Copy the token — it is shown only once
Set both values as environment variables:
CLOUDFLARE_EMAIL_TOKEN=your_api_token_here
CLOUDFLARE_ACCOUNT_ID=your_account_id_here
Configuration
config :my_app, MyApp.Mailer,
adapter: Swoosh.Adapters.Cloudflare,
api_token: System.get_env("CLOUDFLARE_EMAIL_TOKEN"),
account_id: System.get_env("CLOUDFLARE_ACCOUNT_ID")Define your mailer module:
defmodule MyApp.Mailer do
use Swoosh.Mailer, otp_app: :my_app
endUsage
import Swoosh.Email
new()
|> to({"Alice", "alice@example.com"})
|> from({"My App", "noreply@yourdomain.com"})
|> subject("Welcome!")
|> html_body("<h1>Hello, Alice!</h1>")
|> MyApp.Mailer.deliver()Success response
deliver/2 returns a map with three fields:
{:ok, %{
delivered: ["alice@example.com"],
permanent_bounces: [],
queued: []
}}Error handling
deliver/2 returns {:error, {http_status, reason}} on most errors.
For 429 rate limiting, a third element carries the Retry-After value in seconds (or nil if the header was absent):
{:error, {429, :rate_limited, 60}}Full error table:
| Reason | HTTP | Cloudflare code |
|---|---|---|
:authentication_error | 401 | 10000 |
:invalid_request | 400 | 10001 |
:message_too_large | 400/413 | 10202 |
:sending_disabled | 403 | 10203 |
:rate_limited | 429 | 10004 |
:server_error | 500 | 10002 |
:unknown_error | any | — |
If you receive :authentication_error, verify that:
- The API token has the Email Sending — Send permission
- The token is scoped to the correct account
Limitations
- Verified addresses only: New accounts can only send to addresses verified in your Cloudflare dashboard. Paid plans unlock general sending.
- Domain requirement: The
fromaddress must belong to a domain with Email Routing active in your Cloudflare account. - 50 recipients max per email (combined to/cc/bcc).
- 5 MiB max total message size (25 MiB for verified accounts).
- Transactional only: Bulk/marketing sending is not supported.
Resources
License
MIT