Email for your product, sent from your own domain.
Receipts, sign-in links and newsletters through one API or SMTP. Every message is signed with your domain and tracked until it lands. Hosted in Frankfurt.
Northwindorders@northwind.gr
Maria Papadopouloumaria@example.com
Send with a single request
Post a message to the API, or point your framework's mailer at our SMTP server with your API key as the password. Both go through the same queue, the same checks and the same tracking.
- Idempotency keys, so a retried request never sends twice.
- Stored templates, or your own HTML and text.
- Tags on every message to filter and count by.
- Cc, Bcc, Reply-To, attachments and your own headers.
curl https://api.mailto.gr/v1/emails \
-H "Authorization: Bearer $MAILTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": { "email": "orders@northwind.gr", "name": "Northwind" },
"to": ["maria@example.com"],
"template": { "id": "order-shipped", "data": { "order": "4821" } },
"idempotency_key": "order-4821-shipped"
}'const res = await fetch("https://api.mailto.gr/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MAILTO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: { email: "orders@northwind.gr", name: "Northwind" },
to: ["maria@example.com"],
subject: "Your order 4821 has shipped",
html: "<p>It is on its way.</p>",
tags: { flow: "shipping" },
}),
});
const message = await res.json(); // { id: "msg_…", status: "queued" }# Any SMTP client or framework mailer
SMTP_HOST=smtp.mailto.gr
SMTP_PORT=587 # STARTTLS
SMTP_USERNAME=northwind # any value
SMTP_PASSWORD=$MAILTO_API_KEY
# Optional headers
X-Tag-Flow: shipping
X-Idempotency-Key: order-4821-shippedYour domain, set up in one click
Add your domain and you get five DNS records. If your DNS is at Cloudflare, connect your account and we publish them for you. Otherwise copy them over; we check every few minutes and tell you when it is done.
Your mail is then signed with your own DKIM key and bounces return through your own subdomain, so SPF and DMARC pass for your name, not ours.
Every message, accounted for
Each message keeps its own timeline, in the dashboard and through the API. When something goes wrong, the address is taken care of before it can hurt your domain.
Queued
Accepted by the API or SMTP, stored before we answer.
Sent
Handed to the delivery network, with retries if it is busy.
Delivered
The recipient's server accepted it.
Opened
The message was displayed.
Clicked
A link was followed, recorded per link.
Bounced
A hard bounce puts the address on your suppression list. It is never mailed again unless you remove it.
Marked as spam
The contact is unsubscribed from everything, and the complaint counts toward your complaint rate.
Paused before it gets worse
If more than 8% of recent mail bounces, or 0.4% is marked as spam, sending pauses and we tell you why. One bad list does not ruin your domain.
Also included
- Receive mail
- Turn on receiving for a domain and route each address to mailboxes, to your webhook, or both.
- Contacts and lists
- Import a CSV or sync from your app. Double opt-in when you want it. People who unsubscribed are never added back by an import.
- Newsletters
- Send a campaign to one or more lists at a steady pace, with one-click unsubscribe in every message and click counts per link.
- Templates
- Write a template once and use it from the API and from campaigns, filled with each contact's details.
- Signed webhooks
- Received mail is posted to your endpoint with a signature you can verify, and retried until your server answers.
- Dashboard
- Every message with its delivery timeline, domain health, bounce and complaint rates, and your API keys.
mailto.gr is in early access
Tell us what you send and roughly how much, and we will set up your account and help you move your first domain. Data and delivery stay in the EU.
Request early accessOpens your mail app with a message to hello@mailto.gr.