Tutorial
You have a CSV. A list of emails, a few extra columns, and a message you want to send. You don’t want to import it into Mailchimp, pay per contact, or watch a browser extension choke at row 200.
This is the no-bullshit guide to sending a CSV newsletter — bulk email straight from a spreadsheet — through your own SMTP (Gmail, Microsoft 365, Amazon SES, Mailjet), with real personalization and without wrecking your deliverability.
Most “newsletter platforms” want you to upload your CSV into them, where it becomes a billable “audience.” Add 5,000 contacts and your monthly bill jumps — even if you email them once a quarter. That’s the Subscriber Tax.
A CSV is already the universal export format. It comes out of your CRM, your Stripe customer list, your event signup, your n8n/Make workflow. Sending bulk email from a CSV directly means:
The first row of your CSV is the contract. Every header turns into a Payload/Variable you can reference as {{header}} in your email. Keep headers lowercase and free of spaces.
email,first_name,company,plan,renewal_date
jane@acme.com,Jane,Acme,Pro,2026-07-15
sam@north.io,Sam,North,Starter,2026-08-02
lee@orbit.dev,Lee,Orbit,Pro,2026-07-28 The only truly required column is email. Everything else is optional fuel for personalization. A few rules that save you from silent failures:
"double quotes".This is where a CSV newsletter beats every Gmail-only extension: you bring your SMTP. ListMailer connects directly to your provider via server-side SMTP — no browser tab that has to stay open, no shaky extension that breaks on the next Chrome update.
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=you@yourdomain.com
SMTP_PASSWORD=your_app_passwordSMTP_HOST=smtp.office365.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=you@yourdomain.com
SMTP_PASSWORD=your_app_passwordSMTP_HOST=email-smtp.eu-west-1.amazonaws.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=AKIA...YOUR_SMTP_USER
SMTP_PASSWORD=...YOUR_SMTP_PASSWORDBecause the mail leaves through your own account or relay, recipients see your domain and sending identity. No “sent via” tag in the headers, no third-party branding eating your trust. For a CSV newsletter that should look like it came from you, that’s the whole game.
Warm-up note: a brand-new mailbox or domain shouldn’t blast a 10k CSV on day one — even on SES. Account age and gradual volume ramps matter for Inbox Placement.
Now wire the headers from Step 1 into the email. Anything in {{ }} gets replaced per row. Don’t stop at {{first_name}} — that’s table stakes and spam filters know it. The columns that signal a real 1:1 message are the contextual ones: {{company}}, {{plan}}, {{renewal_date}}.
Subject: {{first_name}}, a quick note about your {{plan}} plan
Hey {{first_name}},
Your {{company}} account is on the {{plan}} plan and renews
on {{renewal_date}}. We shipped two things this month that change how
that plan works — want the 2-line summary?
— HenrikThis reads like a message, not a campaign. That’s how you actually bypass spam filters — by not looking like a blast. Keep it plain-text-ish: short paragraphs, one CTA, no hero image, no “designed newsletter” vibe.
A 50-row CSV sends fine through one mailbox. A 50,000-row CSV does not — Google Workspace and Microsoft 365 enforce daily caps, and pushing everything through one connection both throttles you and concentrates reputation risk on a single sender.
SMTP Rotation distributes the rows across multiple SMTP connections so no single account trips a limit:
Same CSV, same message — ListMailer just spreads the rows across the SMTPs you connected and throttles the rate so you stay under the radar.
Here’s the classic CSV newsletter trap: you export a “fresh” list next month, and it quietly includes three people who already unsubscribed. Re-mail them and you collect spam complaints — the fastest way to tank deliverability for the whole send.
ListMailer’s Global Blacklist enforces Global Opt-out across every list and every import. Unsubscribe once and they stay suppressed — even when their address shows up again in a new CSV. You don’t have to remember to scrub; it happens automatically before send.
A CSV newsletter isn’t a downgrade from “real” email marketing — for outreach, customer updates, and lists you already own, it’s the cleaner path. Structure the CSV, connect your own SMTP, map the columns into a plain-text-ish message, rotate to stay under caps, and let the Global Blacklist guard every re-import. That’s deliverable bulk email from a spreadsheet, without the subscriber tax.
Upload a CSV, map payload variables, connect your own Gmail / Microsoft 365 / SES / Mailjet SMTP, enable SMTP rotation, and let ListMailer enforce the Global Blacklist automatically.
Start for Free