Your app's emails, from your own address.
Order confirmations, password resets and sign-in codes, sent by your shop, website or app through an API or SMTP. They go out from your own domain, from our servers in Europe, and you see what happened to every one.

One request, in the language you already use.
No library to install. A sending key and one POST, from any language that speaks HTTP.
const res = await fetch('https://send.email.eu/api/v1/send', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EMAIL_EU_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: 'Shop <orders@yourshop.nl>',
to: 'anna@example.com',
subject: 'Your order is on its way',
text: 'Hi Anna, your order left our warehouse today.',
}),
});
const { id } = await res.json(); // see what happened to it in the log
import os
import requests
res = requests.post(
"https://send.email.eu/api/v1/send",
headers={"Authorization": f"Bearer {os.environ['EMAIL_EU_KEY']}"},
json={
"from": "Shop <orders@yourshop.nl>",
"to": "anna@example.com",
"subject": "Your order is on its way",
"text": "Hi Anna, your order left our warehouse today.",
},
)
message_id = res.json()["id"] # see what happened to it in the log
require "net/http"
require "json"
res = Net::HTTP.post(
URI("https://send.email.eu/api/v1/send"),
{
from: "Shop <orders@yourshop.nl>",
to: "anna@example.com",
subject: "Your order is on its way",
text: "Hi Anna, your order left our warehouse today."
}.to_json,
"Authorization" => "Bearer #{ENV.fetch("EMAIL_EU_KEY")}",
"Content-Type" => "application/json"
)
id = JSON.parse(res.body)["id"] # see what happened to it in the log
$ch = curl_init('https://send.email.eu/api/v1/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('EMAIL_EU_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'from' => 'Shop <orders@yourshop.nl>',
'to' => 'anna@example.com',
'subject' => 'Your order is on its way',
'text' => 'Hi Anna, your order left our warehouse today.',
]),
]);
$id = json_decode(curl_exec($ch), true)['id']; // see what happened to it in the log
body, _ := json.Marshal(map[string]string{
"from": "Shop <orders@yourshop.nl>",
"to": "anna@example.com",
"subject": "Your order is on its way",
"text": "Hi Anna, your order left our warehouse today.",
})
req, _ := http.NewRequest("POST", "https://send.email.eu/api/v1/send", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("EMAIL_EU_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req) // 202: queued, with its id
let res = reqwest::Client::new()
.post("https://send.email.eu/api/v1/send")
.bearer_auth(std::env::var("EMAIL_EU_KEY")?)
.json(&serde_json::json!({
"from": "Shop <orders@yourshop.nl>",
"to": "anna@example.com",
"subject": "Your order is on its way",
"text": "Hi Anna, your order left our warehouse today.",
}))
.send()
.await?; // 202: queued, with its id
%{"id" => id} =
Req.post!("https://send.email.eu/api/v1/send",
auth: {:bearer, System.fetch_env!("EMAIL_EU_KEY")},
json: %{
from: "Shop <orders@yourshop.nl>",
to: "anna@example.com",
subject: "Your order is on its way",
text: "Hi Anna, your order left our warehouse today."
}
).body # see what happened to it in the log
curl https://send.email.eu/api/v1/send \
-H "Authorization: Bearer $EMAIL_EU_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Shop <orders@yourshop.nl>",
"to": "anna@example.com",
"subject": "Your order is on its way",
"text": "Hi Anna, your order left our warehouse today."
}'
Already sending mail? Change five settings.
- Any app that sends over SMTP works: smtp.email.eu, port 465, the user key and your sending key as the password.
- Your shop or website too, with WordPress, WooCommerce or any plugin that asks for an SMTP server.
- Port 587 or 2525 if your host blocks 465.
MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=smtp.email.eu
MAIL_PORT=465
MAIL_USERNAME=key
MAIL_PASSWORD=eu_…
MAIL_FROM_ADDRESS=orders@yourshop.nl
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.email.eu",
port: 465,
tls: true,
user_name: "key",
password: ENV.fetch("EMAIL_EU_KEY"),
authentication: :plain
}
EMAIL_HOST = "smtp.email.eu"
EMAIL_PORT = 465
EMAIL_USE_SSL = True
EMAIL_HOST_USER = "key"
EMAIL_HOST_PASSWORD = os.environ["EMAIL_EU_KEY"]
DEFAULT_FROM_EMAIL = "orders@yourshop.nl"
const transport = nodemailer.createTransport({
host: 'smtp.email.eu',
port: 465,
secure: true,
auth: { user: 'key', pass: process.env.EMAIL_EU_KEY },
});
config :my_app, MyApp.Mailer,
adapter: Swoosh.Adapters.SMTP,
relay: "smtp.email.eu",
port: 465,
ssl: true,
username: "key",
password: System.fetch_env!("EMAIL_EU_KEY"),
auth: :always
spring.mail.host=smtp.email.eu
spring.mail.port=465
spring.mail.username=key
spring.mail.password=${EMAIL_EU_KEY}
spring.mail.properties.mail.smtp.ssl.enable=true
SMTP Host=smtp.email.eu
Encryption=SSL
SMTP Port=465
Authentication=On
SMTP Username=key
SMTP Password=eu_…
See what happened to every email.
- A log of every email, searchable: delivered, bounced or waiting, with the receiving server's own answer.
- Webhooks for each event, signed, and tried again for three days if your app is down.
- Bounced addresses are skipped next time, so a typo doesn't hurt how your mail arrives.
- Statistics per key and per month, and Prometheus metrics if you watch your own systems.
Signed, encrypted, and never tracked.
Your app's emails go out the way your own mail does: from our servers in Europe, signed for your domain, and with nothing added to watch who reads them.
Pay for what you send.
It comes with every plan, at no extra fee. The first 1.000 emails a month are free. After that:
| Emails in a month | Per 1.000 |
|---|---|
| The first 1.000 | Free |
| 1.000 to 100.000 | €0,90 |
| 100.000 to 1.000.000 | €0,70 |
| Above 1.000.000 | €0,50 |
Each price only counts for the emails in its band. It's on the same monthly invoice as your workspace.
What it comes to
A month of sending, without VAT.
- A small shop800 order emails
- €0
- A busy webshop40.000 orders, shipping notes and resets
- €35,10
- A software company300.000 sign-in codes and notices
- €229,10
- A platform1.500.000 emails for its customers
- €969,10
Good to know.
Something else on your mind? Write to us and you will hear back from a person.
Which plan do I need?
Any of them, from Solo at €9 a month. Sending comes with every plan, and you pay for what you send on top, with the first 1.000 a month free.
Is there a library for my language?
You don't need one. The API is one POST with JSON, so the HTTP client your language already has will do, as in the examples above. Frameworks that send mail over SMTP only need the settings.
Is this for newsletters too?
Newsletters have their own app, next door in Sending, with sign-up forms and one-click unsubscribe. This is for emails one person gets because of something they did.
What happens if my app sends to many bad addresses?
The key pauses itself and your admins get an email, so a broken import can't spoil your domain's name. You resume it when it's fixed.
Where is my mail stored, and for how long?
On our own servers in Europe. The email itself is kept for 30 days, so you can look back at what went out. The log of what happened to it stays for a year, and your monthly totals for good.
Send your first email today.
The first 1.000 a month are free. Your app's emails, from your own address, and you see every one.