Bulk import mailboxes (CSV + paste)
What this page covers
WarmySender supports two ways to add many mailboxes at once: a paste-style entry where you set one shared SMTP/IMAP host and add one row per mailbox (email + password + optional from-name), and a CSV upload where each row carries its own complete host configuration. This page covers both flows, the exact CSV format, header names we accept, quoting rules for fields that contain commas, the per-row error reporting model (so one bad row never blocks the rest), and the most common error messages and their fixes.
WarmySender is a 4-pillar outreach platform — Cold Emailing, Email Warmup, LinkedIn Outreach, and Multichannel sequences. This page is part of the cold emailing setup pillar — connecting your sending mailboxes is step zero before you can run a campaign or warmup.
The paste flow (shared SMTP host)
Open Mailboxes › Connect mailbox › Bulk add. The drawer asks for one shared SMTP/IMAP host configuration up top (host, port, daily limit, timezone, warmup toggle), then a per-row block for each mailbox: from-name (optional), email address, username (optional, defaults to email), and password.
Use this when you bought a batch of inboxes from one provider (Hostinger, Zoho, Google Workspace, etc.) and they share the same SMTP server (smtp.hostinger.com, smtp.gmail.com, etc.). Click "Add row" to add more mailboxes; click the X next to any row to drop it. When you click Submit, the platform validates each row, checks for duplicate emails on your workspace, and creates the mailboxes one at a time.
The result panel shows per-row outcomes: which rows succeeded with the new mailbox ID, which failed with the specific error. Rows that failed do not block other rows — if 49 of your 50 paste rows are good and one has a duplicate email, the 49 succeed and you see one row marked "Mailbox with this email already exists" so you know exactly which one to fix.
The CSV flow (per-row host configuration)
Open Mailboxes › Connect mailbox › CSV import. Drop or pick a CSV file. We parse it client-side using an RFC-4180 parser, show you a preview of the first five rows so you can sanity-check the column mapping, then send the parsed rows to the server when you click Import.
Use this when each mailbox has its own host configuration (some on Gmail, some on Hostinger, some on a custom IMAP server) — or when you have an export from another platform (PhantomBuster, Lemlist, Smartlead, Instantly, Zoho) and want to upload it directly.
CSV format reference
Required columns
- email — The mailbox's email address (e.g.
jane@acme.com). Must be unique on your workspace. - password — The SMTP/IMAP password for the mailbox. Stored encrypted at rest.
- smtp_host — The SMTP server hostname (e.g.
smtp.gmail.com,smtp.hostinger.com).
Optional columns
- smtp_port — defaults to 587.
- imap_host — defaults to the same value as
smtp_hostif omitted (works for many providers; for Gmail useimap.gmail.comexplicitly). - imap_port — defaults to 993.
- username — defaults to the email address. Useful for providers where the SMTP login differs from the From address.
- from_name — display name shown to recipients. Defaults to the local part of the email (the bit before the @).
- daily_limit — daily send cap. Defaults to 50. Account safety always wins; the platform's per-mailbox safety guard caps every mailbox regardless of this value.
- timezone — IANA timezone (e.g.
America/New_York,Europe/Berlin). Defaults to UTC. - warmup_enabled —
trueorfalse. Defaults to false.
Supported header names (aliases)
We normalize and alias common variations so your existing exports usually work without renaming columns. Header normalization: trim, lowercase, replace spaces / dashes / dots with underscores. So "SMTP Host", SMTP-Host, smtp.host, and smtp_host all map to the canonical smtp_host. Common aliases:
email_address,e_mail,mail→ emailuser_name,smtp_username,imap_username,user,login→ usernamesmtp_password,imap_password,pass,pwd→ passwordsmtp,smtp_server,outgoing_server,outgoing_host→ smtp_hostimap,imap_server,incoming_server,incoming_host→ imap_hostdisplay_name,sender_name,fromname,full_name,name→ from_namedaily_send_limit,send_limit,daily_emails,daily_send→ daily_limittime_zone,tz→ timezonewarmup,enable_warmup→ warmup_enabled
Quoting rules (RFC-4180)
The CSV parser follows RFC-4180. Three rules cover almost every real-world case:
- If a field contains a comma, wrap it in double quotes. Example:
"Smith, John",jsmith@acme.com,...— the from_name column has a comma; wrapping it in quotes prevents the parser from splitting it into two columns. - If a quoted field contains a double quote, escape it by doubling. Example:
"He said ""hi""",he@acme.com,...— the inner doubled quote is interpreted as a single literal quote. - Mixed line endings are fine. Files saved on Windows (\r\n), macOS classic (\r), or Linux (\n) all parse correctly.
The parser also strips a leading UTF-8 BOM if present (some Excel and Google Sheets exports include one). You don't need to do anything special for files with or without a BOM — both work.
Worked example CSV
email,password,smtp_host,smtp_port,from_name,daily_limit,warmup_enabled
jane@acme.com,changeme123,smtp.hostinger.com,587,"Smith, Jane",50,true
john@acme.com,otherpass456,smtp.hostinger.com,587,John Doe,50,true
ceo@acme.com,vipPass789,smtp.gmail.com,587,"O'Brien, Liam",100,false
This CSV imports three mailboxes — two on Hostinger (one with a comma in the from-name, properly quoted) and one on Gmail (with an apostrophe and a comma in the from-name, also properly quoted). All three have warmup configured, with daily limits set per mailbox.
Per-row failure isolation
Bulk imports are per-row: each mailbox is created in its own database operation and succeeds or fails independently. If your CSV has 200 rows and row 47 has a duplicate email, the other 199 rows are still created — only row 47 is marked failed with the specific error "Mailbox with this email already exists". You can fix the failing rows and re-import them without touching the successful ones.
The response includes a per-row outcomes table you can download as a CSV (the "Download error report" button on the import results panel). It contains the row index, email, and error message for every failed row so you can correct them in your source CSV and re-upload.
Common errors and fixes
Mailbox with this email already exists
The email address is already connected to your workspace. Either delete the existing mailbox first (Mailboxes › click the row › Delete) or remove this row from your import.
Required field missing: <field>
One of the required columns (email, password, smtp_host) is empty for this row. Open your CSV in a spreadsheet and check the offending row's columns. If you see the row's value but the parser shows it missing, the column header may not match — see supported header names above.
MAILBOX_LIMIT_EXCEEDED
Your subscription tier doesn't include enough mailbox slots. The Free plan includes 1 mailbox, the Lite plan includes 3, and Pro+ plans include 50–2,500 mailboxes per workspace by plan tier. The first N rows that fit within your remaining headroom are created normally; rows beyond that are marked failed with this error. Upgrade your plan in Billing to import more.
SMTP host is required
The CSV row didn't include a value in the smtp_host column (or any of its aliases — see above). Add the column to your CSV header row and the value to each data row.
We couldn't find any rows with an email column
The parser found a header row but none of the column names matched our email aliases (email, email_address, e_mail, mail). Check your header row — it must include one of these names (case-insensitive, spaces and dashes are normalized to underscores).
CSV must have at least a header row and one data row
Your file is empty, contains only a header, or only a single line that doesn't include any commas. Open it in a spreadsheet and confirm it has at least two rows.
Unsupported file format
You uploaded an Excel file (.xlsx / .xls) or some other non-CSV format. Save your spreadsheet as CSV first (in Excel: File › Save As › CSV UTF-8; in Google Sheets: File › Download › Comma Separated Values) and re-upload.
Subscription tier limits
Every paid tier above Lite includes generous mailbox caps (50–2,500 per workspace by plan) with unlimited warmup — bulk import up to your plan's cap. The restricted tiers:
- Pending (no plan selected yet): 0 mailboxes. Choose a plan first in Billing.
- Free plan: 1 mailbox. Bulk import will create 1 row and mark the rest as MAILBOX_LIMIT_EXCEEDED.
- Lite plan: 3 mailboxes. Bulk import will create rows up to your remaining headroom (3 minus existing mailbox count).
The platform pre-checks your tier and current mailbox count before processing the import, so you'll never end up with a partial workspace state where some mailboxes were created but the rest silently dropped.
What happens after import
Each newly-created mailbox runs through the same post-creation checks as a single mailbox:
- Health check. The platform connects to your SMTP and IMAP servers in parallel to verify credentials are correct, persists the result, and shows a green/yellow/red health badge in the mailbox list. Any credentials issue is surfaced immediately so you know to fix the password before campaigns try to send.
- IP capture. We log the import event with your client IP for audit trail (helpful if your account is later flagged for unusual activity).
- Burst detection. If you bulk-imported 10+ warmup-enabled mailboxes in a short window, an admin alert fires (no auto-block — purely informational). Most legitimate workflows don't hit this; it's a safety check for our team to spot suspicious bulk creation patterns.
Account safety
Bulk import respects every safety check that single-mailbox creation does. Daily send limits per mailbox are enforced regardless of the value you set in the CSV — the platform's per-account ramp guard caps every mailbox at safe levels until it has been warming up for the documented period (4-6 weeks for full ramp). Account safety always wins over import speed, throughput, or convenience.
If you import 50 mailboxes and immediately try to run a 10K-prospect campaign, the campaign engine will distribute load across the 50 mailboxes respecting each one's individual ramp ceiling — you won't burn newly-imported mailboxes by hitting them with 200 sends each on day one.
Common questions
My CSV has a column named "Display Name" with spaces — does that work?
Yes. The header normalizer trims, lowercases, and replaces spaces/dashes/dots with underscores, then runs the result through the alias map. Display Name → display_name → from_name. Same path for "SMTP Host" → smtp_host and similar.
One of my display names contains a comma. Will it parse correctly?
Yes, as long as you wrap the field in double quotes. Example: "Smith, John",jsmith@acme.com,.... The parser is RFC-4180 compliant; it understands that a quoted comma is part of the field, not a column separator. If your spreadsheet exports CSV with proper quoting (Excel, Google Sheets, Numbers all do this by default), comma-containing values just work.
My CSV came from Excel and the first column header is "email" with a weird character — is that a problem?
No. That's a UTF-8 byte order mark (BOM) — Excel adds it to CSV exports to mark the file as UTF-8 encoded. The parser strips it automatically. You don't need to do anything special.
If 50 rows succeed but 5 fail, can I retry just the 5?
Yes. The import results panel has a "Download error report" button that gives you a CSV containing only the failed rows with their error messages. Fix those rows in the report, drop the error column, and re-upload as a fresh import. The 50 already-created mailboxes are not touched by the retry.
Does bulk import support Gmail OAuth or only password authentication?
The bulk-import paths (paste and CSV) currently support password-based authentication only. For Gmail, that means you need an app-specific password (not your regular Gmail password) — see Connecting Gmail via app password. For OAuth-based connections (Google sign-in flow), use the single-mailbox connection path.
Can I bulk import LinkedIn accounts the same way?
No. LinkedIn accounts go through a different connection flow (Settings › LinkedIn › Connect account) because they require Unipile cookie authentication, not SMTP/IMAP credentials. Bulk import is for email mailboxes only. See LinkedIn campaign documentation for the LinkedIn flow.
How long does a 200-row import take?
Roughly 2-4 seconds for the inserts themselves. The IMAP/SMTP health check on each mailbox runs in parallel after the response is sent, so the import-results panel appears immediately and the per-mailbox health badges fill in over the following 30-60 seconds. You can navigate away — the health checks finish in the background.
What happens if I import the same CSV twice?
The first import creates the mailboxes. The second import will mark every row "Mailbox with this email already exists" and create nothing new. You won't end up with duplicate mailboxes; the unique-email constraint per workspace prevents that at the database level.
Related guides
- Connecting Gmail via app password — How to generate an app-specific password for use with the bulk importer
- Connecting Outlook — Office 365 / Outlook.com SMTP host and port reference
- Connecting Hostinger — Bulk-import-friendly host with shared SMTP across mailboxes
- Connecting Zoho — Zoho Mail SMTP host, port, and password requirements
- Setting up email warmup — How the warmup_enabled flag works and what to do after import
- Billing & plan limits — Mailbox slot limits per plan
- Full documentation — All 90+ guides
- Support — How to get in touch
Still have questions? Email hello@warmysender.com with your CSV (passwords redacted, please) and the error you saw — we'll look at the exact row and tell you what's wrong.