✉️ Mail Merge to Email Drafts

One CSV, one template, and you get back a ZIP of individual .eml draft files. Open each one in your own mail app and press Send. No add-on, no account connection, no per-seat fee.

📇
Drop your CSV here
or click to choose a file. The first row must be your column names.

Your CSV and any attachment stay in this browser tab. They are never uploaded. The page loads two code libraries from a public CDN and counts an anonymous page view, and that is all.

1. Who the mail is from

This only fills in the header of each draft file. The message is still sent by your own mail app from whatever account you send it with, so the From address has to be one you can actually send as.

2. Which columns hold the recipient

Rows without a usable email address are listed in the check below and left out of the pack.

3. The message
Load a CSV and your columns appear here as one click tokens.

Write {{column_name}} anywhere. Add a fallback with {{first_name|there}} so an empty cell never sends "Hi ,". Filters: |title, |upper, |lower, |trim, |first (first word only). You can combine them: {{full_name|first|title|there}}.

Plain text only
Plain text plus HTML
Plain text plus my own HTML

Plain text is the safest choice for cold outreach and it never lands in a spam filter for being image heavy. The HTML option adds a second copy of the same message so clients that prefer HTML show that one instead.

Nothing attached. The same file gets copied into every draft, so a 2 MB PDF across 40 recipients makes an 80 MB ZIP. One run stops at 100 MB in total, and a phone will struggle well before that.

4. Check before you build

Load a CSV and write your message, and every problem worth knowing about shows up here.

Preview
ToNothing loaded yet
SubjectNothing loaded yet
Load a CSV and type a message to see what each person receives.
5. Where these files actually work
Read this before you build the pack
  • Classic Outlook for Windows: double click a file and it opens as an editable draft, ready to send. This is the setup the format was designed for.
  • Thunderbird 91 and newer: drag the files into your Drafts folder, then open one and click Edit or Continue to send it.
  • New Outlook and Outlook on the web: unreliable. There are 2026 reports of the draft flag being ignored, and of the body or attachment being dropped. Test one file before you build fifty.
  • Apple Mail: imports each file as a received message, not a draft. You have to use Message then Send Again on every one, which edits and resends it.
  • Gmail and Google Workspace: cannot import .eml at all. Use the merged.csv that comes in the same ZIP instead, or paste each message by hand.
  • There is no send all button anywhere. Neither Outlook nor Thunderbird will send a folder of drafts in one go, so you open and send each message yourself. That makes this sensible for roughly 10 to 50 recipients, not for a thousand.
  • Windows may block the files. Anything unzipped from a browser download carries a "downloaded from the internet" mark. Right click the ZIP, choose Properties, tick Unblock, then extract. Some workplaces block .eml files outright, and no tool can get around that.

🎬 Plus a Word mail merge, email signatures, PDF signing & 300+ more free toolsOpen Castwright

Personalised individual emails, sent from your own mailbox

A normal mail merge either blasts one message to a hidden Bcc list, which everyone can smell, or it needs a paid sending tool wired into your account. This does neither. It writes one properly formatted email file per row of your spreadsheet, with that person's name, company and anything else your CSV holds already merged in, and hands you the whole set as a ZIP. You open them in the mail app you already use and send them as yourself, from your own address, with your own signature and your own reply handling.

Why the .eml format is the trick

A .eml file is just an email saved to disk, headers and all. Classic Outlook and Thunderbird both understand it, and a single extra header line tells them the message has never been sent, so they open it in the composer instead of the reader. That one line is the whole mechanism the subscription mail merge products are built around. Nothing here talks to your mail account, asks for a password, or requests permission to send on your behalf, because it never sends anything itself.

What it is good for, and what it is not

Good for a short, genuinely personal list: 20 warm introductions, a client's 40 past customers, a hiring round, a launch note to people who know you. Every message is opened and sent by hand, so past about fifty the clicking stops being worth it and you want a real sending platform with tracking and unsubscribe handling. It is also not a way to bypass anyone's rules: if you would not be allowed to send the message one at a time, a merge does not make it acceptable, and bulk commercial mail still needs a real postal address and a working opt out.

If you came here to escape the Word wizard

The classic way to mail merge individual emails is Word's wizard driving Outlook, which needs both programs installed, the right profile signed in, and a lot of patience. This page replaces the merging half of that entirely: you get the finished, personalised messages as files, and you decide what opens them. It does not remove the need for a mail app, because something still has to do the sending, and that part is deliberate. A tool that could send on your behalf would need your password or an account connection, and this one asks for neither.

The merged.csv is often the more useful half

Alongside the draft files the ZIP carries a merged.csv holding every original column plus the finished subject and body for that row. If you are handing the campaign to a client, or loading it into a sending platform, a CRM, or a system that expects pre written copy per contact, that file is what you want. It is also the answer for Gmail, which cannot open .eml files at all.

Tokens, fallbacks and the blank name problem

Half of all merge accidents are the same one: a missing first name producing "Hi ,". Writing {{first_name|there}} fixes it, and the check above tells you which rows would have gone out wrong before you build anything. |title tidies a column of shouty ALL CAPS names, |first pulls the first name out of a full name column, and the filters stack in any order.

Also on Castwright

If the finished thing needs to be a Word document rather than an email, the Word Mail Merge tool takes a .docx template and the same kind of CSV. There is also an email signature generator and a cold email writer if you are still working out what to say.