Tutorial

CSV Newsletter: Send Bulk Email From a CSV Through Your Own SMTP

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.

CSV file flowing into an envelope sent via SMTP

TL;DR

  • A clean CSV + your own SMTP is all you need to send a newsletter — no per-contact SaaS tax.
  • Every CSV header becomes a Payload/Variable you can drop into the subject and body.
  • Send through your accounts/relays — no “sent via” tags, so recipients see your domain.
  • Use SMTP Rotation to stay under provider caps and protect sender reputation.
  • Let the Global Blacklist enforce Global Opt-out across every CSV re-import.

Why send a newsletter from a CSV at all?

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:

  • You pay for sending, not for storing contacts.
  • Your list lives where you control it, not locked in a vendor.
  • You can re-send to a fresh export in minutes — no sync, no API glue.

Step 1 — Structure your CSV (headers become variables)

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.

Example CSV

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:

  • Save as UTF-8 CSV so names with umlauts/accents don’t break.
  • Wrap any value containing a comma in "double quotes".
  • One recipient per row. No merged cells, no header above the header.

Step 2 — Connect your own SMTP

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.

Google Workspace (Gmail SMTP)

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=you@yourdomain.com
SMTP_PASSWORD=your_app_password

Microsoft 365 (Outlook SMTP)

SMTP_HOST=smtp.office365.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=you@yourdomain.com
SMTP_PASSWORD=your_app_password

Amazon SES / Mailjet (pay-as-you-go relay)

SMTP_HOST=email-smtp.eu-west-1.amazonaws.com
SMTP_PORT=587
ENCRYPTION=STARTTLS
SMTP_USERNAME=AKIA...YOUR_SMTP_USER
SMTP_PASSWORD=...YOUR_SMTP_PASSWORD

Because 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.

Step 3 — Map CSV columns into the message

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}}.

Example email body (plain-text-ish)

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?

— Henrik

This 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.

Step 4 — Scale the send without getting blocked (SMTP Rotation)

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:

  • Rotate 3× Google Workspace inboxes for a warm list.
  • Blend Microsoft 365 + SES for a “human + relay” mix.
  • Lean on Mailjet/SES as pay-as-you-go backpressure once the CSV outgrows mailbox caps.

Same CSV, same message — ListMailer just spreads the rows across the SMTPs you connected and throttles the rate so you stay under the radar.

Step 5 — Don’t re-mail people who opted out (Global Blacklist)

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.

CSV newsletter vs. the usual suspects

  • Gmail mail-merge extensions: Gmail-only, tied to a browser tab, daily caps, breaks on updates.
  • Mailchimp & friends: CSV becomes a billable audience; you pay per stored contact forever.
  • Word/Outlook mail merge: works for 50 rows, falls apart at scale, no rotation or opt-out logic.
  • CSV + your SMTP in ListMailer: your domain, your relays, rotation, and global opt-out — pay for sending, not storage.

Conclusion

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.

Ready to send your CSV newsletter?

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