How to Send 10,000 Emails Without Landing in Spam
Bulk email that actually arrives. SPF, DKIM and DMARC explained simply, why your server IP will fail, list warm-up, and the rules that keep you off blacklists.
Sending 10,000 emails is easy. Getting 10,000 emails delivered is the hard part, and it has almost nothing to do with the sending software.
Gmail, Outlook and Yahoo decide whether to show your message, and they decide before they read a word of it. This guide is about passing that check.
Start here: do not send from your own server
The single most common mistake. Someone installs a mailing script on their VPS, sends 10,000 emails, and almost none arrive.
Here is why:
- Your server IP has no sending reputation. Gmail has never seen it. An unknown IP suddenly sending thousands of messages looks exactly like a compromised machine.
- Cheap VPS IP ranges are often already blacklisted because of what a previous tenant did.
- Most providers block port 25 outright.
- Building a sending reputation takes months of consistent, low-volume, complaint-free sending.
Use a sending service. They maintain the IP reputation, handle the technical negotiation with inbox providers, and tell you what happened to each message.
Which service?
| Service | Free tier | Best for |
|---|---|---|
| Brevo (ex-Sendinblue) | 300 / day | Newsletters, good free tier |
| Amazon SES | — | Cheapest at volume, about $0.10 per 1,000 |
| Mailgun | Trial | Developers, strong API |
| SendGrid | 100 / day | Transactional email |
| Mailchimp | 500 contacts | Marketing, easiest editor |
For 10,000 emails: Brevo if you want a visual editor and simple pricing. Amazon SES if you are comfortable with configuration and want the lowest cost — 10,000 messages costs about one dollar.
The three DNS records that decide everything
These prove you are allowed to send as your domain. Without them your mail goes to spam no matter which service you use. All three are DNS records added at your domain registrar or host.
SPF — who may send for this domain
A list of servers permitted to send your mail.
Type: TXT
Name: @
Value: v=spf1 include:spf.brevo.com ~all
Your sending service tells you the exact include: value.
You may only have one SPF record. Two records means both fail. If you already have one, merge the includes into it:
v=spf1 include:spf.brevo.com include:_spf.google.com ~all
DKIM — a signature proving the mail was not altered
Your service generates a key and gives you a record to publish:
Type: TXT
Name: mail._domainkey
Value: k=rsa; p=MIGfMA0GCSq... (a long string)
Copy it exactly. One missing character and the signature fails silently.
DMARC — what to do when a check fails
Type: TXT
Name: _dmarc
Value: v=DMARC1; p=none; rua=mailto:you@yourdomain.com
Start with p=none, which means "report but deliver". You receive reports showing who is sending as your domain. After a few weeks of clean reports, tighten to p=quarantine and later p=reject.
Do not start at p=reject. If anything is misconfigured you will block your own mail and not know why.
Check all three
Send one message to mail-tester.com. It gives a score out of ten and names exactly what is missing. Do not send a campaign below 8/10.
Warm up before you send in bulk
A domain that has never sent email suddenly sending 10,000 messages is the clearest spam signal there is. Build up gradually:
| Day | Send about |
|---|---|
| 1–3 | 50 per day |
| 4–7 | 200 per day |
| 8–14 | 1,000 per day |
| 15–21 | 3,000 per day |
| 22+ | 10,000 per day |
Send to your most engaged contacts first. Opens and replies teach the inbox providers that your mail is wanted, which is what reputation actually is.
Your list matters more than your content
Spam filters weigh behaviour more heavily than words. Three numbers decide your fate:
- Bounce rate. Keep under 2%. Above 5% and services will suspend you.
- Complaint rate. Keep under 0.1% — that is one complaint per thousand.
- Open rate. Consistently low opens signal an unwanted list.
Clean the list before the first send
- Run it through a verification service. ZeroBounce, NeverBounce and similar cost a few dollars per thousand and remove dead addresses before they bounce.
- Delete role addresses —
info@,admin@,support@. They complain more and engage less. - Remove anyone who has not opened anything in a year. Painful, and it will improve your delivery immediately.
Never buy a list
Purchased lists are full of spam traps — addresses that exist only to catch people who buy lists. Hitting one gets your domain blacklisted, and unlike a suspended account, a blacklisted domain follows you. You cannot fix it by changing service.
The message itself
Less important than reputation, but it still matters:
- Send from a real person —
habib@yourdomain.com, notnoreply@. Reply-to addresses that work improve reputation. - A plain subject line. No ALL CAPS, no rows of exclamation marks, no "FREE!!!".
- Include a plain-text version. HTML-only mail scores worse.
- Keep images to a minimum. An email that is one big image is a classic spam pattern.
- A visible unsubscribe link. Legally required in many places, and hiding it produces complaints, which are far more damaging than unsubscribes.
- Avoid link shorteners. bit.ly links are heavily abused and filtered.
The legal side
Bulk email is regulated in most markets, and the rules are simple enough:
- Only email people who agreed. Signing up for your service is consent; having a business card is not.
- Include a working unsubscribe link and honour it within a few days.
- Include a real postal address — required by CAN-SPAM in the US.
- Do not disguise who you are in the from field or subject.
If you email anyone in the EU or UK, GDPR applies: explicit opt-in, a record of when they consented, and easy deletion on request.
Sending from WordPress
WordPress uses the PHP mail() function by default, which shared hosts frequently block or flag. This is why order confirmations and password resets vanish.
Fix it with an SMTP plugin — WP Mail SMTP or FluentSMTP. Point it at your sending service, and even ordinary site email starts arriving.
For newsletters from inside WordPress, Newsletter or MailPoet both send through an external service rather than your server.
Common problems
Everything goes to spam
Check SPF, DKIM and DMARC first — it is nearly always one of them. Test at mail-tester.com and fix whatever it names.
Gmail delivers, Outlook does not
Outlook is stricter and keeps its own reputation list. Register at the Smart Network Data Service and check whether your sending IP is flagged.
"Message rejected: 550 5.7.1"
The receiving server refused it, usually because of SPF failure or a blacklist. The bounce message normally names the reason — read it rather than resending.
The sending account was suspended
Bounce or complaint rate went too high. Clean the list properly and contact support with what you changed. Services usually reinstate once.
My domain is on a blacklist
Check at MXToolbox. Each blacklist has its own delisting form. Fix the cause first, because relisting is faster the second time.
WordPress emails do not send at all
PHP mail() is blocked. Install an SMTP plugin.
A realistic plan for 10,000 emails
- Week 1 — set up the service, add SPF, DKIM and DMARC, score 9+ at mail-tester
- Week 1 — verify and clean the list
- Weeks 2–4 — warm up on the schedule above
- Week 4 — send to the full list in batches of 2,000, a few hours apart
- After — watch bounces and complaints, and remove non-openers before the next send
Rushing this is what causes the "I sent 10,000 emails and nobody got them" outcome.