Your app
Any SMTP client, any framework.
sendMail() toEight stages, one endpoint, every event logged. Below is the full journey — how one line of SMTP code becomes a verified, ISP-routed, provider-diversified send with a reply that comes back as a parsed contact.
sendMail() and their inbox.Verified, routed, delivered — then replies harvested for contacts you would otherwise lose.
Any SMTP client, any framework.
smtp.sendrules.net, TLS on both submission ports.
Every recipient scored in the send path, before your provider sees them.
Pick a strategy. Fail over automatically.
Your accounts. Your reputation. Your quota.
Gmail, Yahoo, Outlook, Apple, or anywhere else.
Turns OOO replies into contact lists — new colleagues, referrals, forwarded contacts.
Everything logged, signed, and searchable.
Any SMTP client, any framework.
smtp.sendrules.net, TLS on both submission ports.
Every recipient scored in the send path, before your provider sees them.
Pick a strategy. Fail over automatically.
Your accounts. Your reputation. Your quota.
Gmail, Yahoo, Outlook, Apple, or anywhere else.
Turns OOO replies into contact lists — new colleagues, referrals, forwarded contacts.
Everything logged, signed, and searchable.
The walkthrough follows one message the whole way down the diagram above — verified, routed by real MX, delivered through your own provider, and back again as a parsed contact. It is silent-safe, so you can watch it in an open-plan office.
Point any SMTP client at smtp.sendrules.net. TLS on both submission ports, real Let’s Encrypt certificate, no self-signed workarounds. Every credential can be locked to a specific list of network ranges — a leaked password from outside your infrastructure cannot authenticate, even with the correct value.
import nodemailer from "nodemailer";
const t = nodemailer.createTransport({
host: "smtp.sendrules.net",
port: 587,
secure: false, // STARTTLS negotiated in-band
auth: {
user: process.env.SENDRULES_USER, // per rule
pass: process.env.SENDRULES_PASS,
},
});
await t.sendMail({
from: "[email protected]",
to: "[email protected]",
subject: "Your order #1042 is on its way",
html: renderOrderEmail(order),
});Before the message ever leaves for a provider, every recipient is scored — in the send path itself, on a two-second budget. Bad addresses never spend your ESP quota. Risky ones are flagged. The policy is per rule, so you can reject on outbound cold email and only flag on transactional.
Every rule picks a strategy. The rule editor tells you which ISPs your attached providers cover — and warns before you save if there’s a Yahoo-shaped gap.
Rotate through every attached provider evenly. Simple, predictable, hard to hurt yourself with.
Assign a percentage per provider. 70% through SES, 25% through Postmark, 5% through the fallback.
Try provider one; if it errors, try provider two; and so on. The classical failover pattern.
Uniform-random pick — useful for A/B testing two providers on identical traffic.
First delivery to a recipient pins a sender. Every follow-up uses that same sender — reply-rate stays clean.
Resolve the recipient's live MX record. Gmail buyer → your Gmail-friendly provider; Yahoo → your Yahoo-friendly one.
sendrules holds your provider credentials encrypted per tenant, but never bills you for the mail — the send goes through your account with your provider. When one provider rate-limits or errors, the next attached provider picks up automatically.
We resolve the recipient’s live MX record, so “[email protected]” that fronts on Google Workspace is correctly routed as a Gmail recipient. Every provider webhook is normalized into the same event shape — delivered, bounced, complained, deferred — with the underlying provider preserved for drilldown.
Ten to twenty percent of campaign replies are autoresponders — and most of them carry the exact contact info you were trying to reach: “I’m on leave until Monday, please contact [email protected] for procurement questions.” sendrules parses every one, harvests every address, captures every named field, and drops the result into a list you can trigger a webhook from or download as CSV.
Thanks for your note — I’m on parental leave until 15 January 2026. For procurement, please reach [email protected]. Legal + contracts: [email protected] (direct: +44 20 7946 0123).
{
"event": "parser.contact",
"list": "acme-warm",
"email": "[email protected]",
"fields": {
"role": "procurement",
"return_date": "2026-01-15"
},
"source_msg": "01f9...abcd",
"ts": "2026-11-04T08:14:32Z"
}Seven filtered activity inboxes. Row-level trend sparklines. Period-comparison cards. Share links that make any filtered slice a read-only URL you can send to your team. Behind it all: a normalized event stream your webhooks subscribe to — signed, verifiable, and replayable from the UI when something needs a second run.
Free plan — 5,000 messages/month, every feature on this page included. Attach one provider and watch the flow light up in the Activity view.