Your app connects
Your framework mailer, CMS, server or job queue connects to the relay with the username and password we issue. Nothing else in your stack needs to change.
tinyRelay's SMTP relay service lets any application, framework or server that can send over SMTP deliver its transactional email through our email delivery infrastructure. Change the host, port and credentials in your mail settings. There is no new code to write.
# .env
MAIL_MAILER=smtp
MAIL_HOST=[SMTP host]
MAIL_PORT=[port]
MAIL_USERNAME="[issued at onboarding]"
MAIL_PASSWORD="[issued at onboarding]"
# TLS / encryption: [confirm at onboarding]
MAIL_FROM_ADDRESS="no-reply@yourdomain.com"
MAIL_FROM_NAME="${APP_NAME}"# settings.py
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "[SMTP host]"
EMAIL_PORT = [port]
EMAIL_HOST_USER = os.environ["TINYRELAY_SMTP_USER"] # issued at onboarding
EMAIL_HOST_PASSWORD = os.environ["TINYRELAY_SMTP_PASS"] # issued at onboarding
# EMAIL_USE_TLS / EMAIL_USE_SSL: [confirm at onboarding]
DEFAULT_FROM_EMAIL = "no-reply@yourdomain.com"# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "[SMTP host]",
port: [port],
user_name: ENV["TINYRELAY_SMTP_USER"], # issued at onboarding
password: ENV["TINYRELAY_SMTP_PASS"] # issued at onboarding
# authentication / TLS options: [confirm at onboarding]
}import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({
host: "[SMTP host]",
port: [port],
// secure / STARTTLS: [confirm at onboarding]
auth: {
user: process.env.TINYRELAY_SMTP_USER, // issued at onboarding
pass: process.env.TINYRELAY_SMTP_PASS,
},
});
await transporter.sendMail({
from: '"Acme" <no-reply@acme.com>',
to: "ann@example.com",
subject: "Reset your password",
html: "<p>Use this link to reset your password.</p>",
});use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = '[SMTP host]';
$mail->Port = [port];
$mail->SMTPAuth = true;
$mail->Username = getenv('TINYRELAY_SMTP_USER'); // issued at onboarding
$mail->Password = getenv('TINYRELAY_SMTP_PASS');
// $mail->SMTPSecure = [confirm at onboarding];
$mail->setFrom('no-reply@acme.com', 'Acme');
$mail->addAddress('ann@example.com');
$mail->isHTML(true);
$mail->Subject = 'Reset your password';
$mail->Body = '<p>Use this link to reset your password.</p>';
$mail->send();# Any SMTP client
Setting Value
------------- ------------------------------------------
Host [SMTP host]
Port [port]
Encryption [confirm at onboarding]
Username issued at onboarding
Password issued at onboarding
From address a sender on a domain you shared with usIllustrative. Host, port and TLS mode are placeholders until published; username and password are issued at onboarding.
Your software keeps doing what it does today. It opens an SMTP connection and hands over a message. The only thing that changes is where that connection goes.
Your framework mailer, CMS, server or job queue connects to the relay with the username and password we issue. Nothing else in your stack needs to change.
The message is sent from a sender domain you shared with us during setup, on the same email delivery infrastructure that runs tinyEmail.
We deliver to the recipient's mail server, signed for your domain with DKIM. Your app does not have to run or maintain a mail server of its own.
Here is what tinyRelay does with the email you hand to the relay, and the one thing still to confirm.
During setup you share the senders you will use, and we add their domains to our mail servers. Mail then goes out from your own addresses, such as no-reply@yourdomain.com.
Add one record and your mail is signed for your domain:
The API endpoint PUT /domain/dns/check validates DKIM and SPF for a domain and returns the records it expects, so you can confirm setup before your first message. Read about deliverability and domain setup.
Signed webhooks for SEND, DELIVERED, BOUNCED, OPEN, CLICK, UNSUBSCRIBE and SPAM are documented for the REST API. Whether SMTP sends get the same events and metadata is not in the docs yet, so confirm it with our team if you rely on it.
How email webhooks work →You do not have to pick one forever. Both send from the same domains on the same infrastructure. The difference is how your code talks to us.
For software that already sends email.
For code you are writing now.
Flip what is true for your app. The suggestion updates as you go.
Every SMTP client asks for the same handful of settings. These are the values you will plug in, and where each one comes from.
Setup steps for each framework are in our guides. The API reference lives in the tinyRelay docs.
| Setting | Value | Where it comes from |
|---|---|---|
| Host | Value[SMTP host] | Where it comes fromTo confirm |
| Port | Value[port] | Where it comes fromTo confirm |
| Encryption | Value[TLS mode] | Where it comes fromTo confirm |
| Username | ValueIssued to you | Where it comes fromAt onboarding |
| Password | ValueIssued to you | Where it comes fromAt onboarding |
| From address | ValueA sender on a domain you shared with us | Where it comes fromYour DNS |
If your app already generates these emails, the relay can carry them today. Each guide shows what to send and which events to watch.
The reset link, sent the moment it is requested.
Read →Sign-up confirmations and one-time login codes.
Read →Receipts, shipping updates and invoices from your store.
Read →Security alerts, billing notices and plan changes.
Read →tinyRelay is run by the same company and team as tinyEmail. Use it on its own for the email your app triggers, or alongside tinyEmail for campaigns and newsletters. How tinyEmail and tinyRelay fit together.
Straight answers, including what we are still confirming.
Read the tinyRelay docs →An SMTP relay service accepts email from your application over SMTP and delivers it to your recipients' mail servers for you. With tinyRelay you point your app's mail settings at our relay using the credentials we issue, and our email delivery infrastructure does the sending.
Submit the Get started form. Setup is done with our team: we add your sender domains, you add one DKIM CNAME record, and we issue your SMTP credentials.
Your connection details are confirmed with you at onboarding, when your credentials are issued. This page shows them as placeholders, [SMTP host] and [port], until they are published in the docs.
Webhook events (SEND, DELIVERED, BOUNCED, OPEN, CLICK, UNSUBSCRIBE and SPAM) are documented for the REST API. If you need the same events and metadata for SMTP sends, confirm it with our team during setup.
Yes. Any framework or tool that can send through an SMTP server with a host, port, username and password can use the relay. Our guides cover Laravel, Django, Rails and Supabase.
SMTP relay or REST API, standalone or alongside tinyEmail. Tell us what you send and our team sets you up.