Replaces imapdown.py with a multi-file Go implementation using github.com/emersion/go-imap/v2. All features preserved: SSL/STARTTLS, incremental UID-based downloads, attachment extraction to zip, modified UTF-7 folder name decoding, and full-mode safety checks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
IMAP Downloader
Download all emails from an IMAP server into individual EML files, preserving the folder structure.
Single self-contained binary written in Go - fast, cross-platform, no dependencies.
Quickstart
# Build the binary
make build
# Download all emails (creates a folder named after your email address)
./imapdown -server imap.gmail.com -email you@gmail.com -user you@gmail.com -password "your-password" -ssl
# Subsequent runs only download new emails
./imapdown -server imap.gmail.com -email you@gmail.com -user you@gmail.com -password "your-password" -ssl
Features
- Downloads emails as standard
.emlfiles (open in any email client) - Preserves IMAP folder hierarchy locally
- Extracts attachments into zip files alongside each email
- Supports SSL/TLS and STARTTLS connections
- Incremental updates using UID tracking (only download new emails)
- Automatic state tracking - never re-downloads the same email
- Configurable download limit for testing/debugging
- Works with Gmail, Outlook, FastMail, and any IMAP server
Requirements
- Go 1.21+ (for building from source)
- OR use pre-compiled binaries (no requirements)
Installation
Download from releases page (coming soon) or build from source:
# Clone repository
git clone <repo-url>
cd imapdown
# Build the binary
make build
# Or cross-compile for all platforms
make build-all
Usage
Basic Usage
By default, only new emails since the last run are downloaded (incremental mode). On first run, everything is downloaded.
# Generic IMAP server with SSL (most common)
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -ssl
# Gmail (requires app-specific password if 2FA enabled)
./imapdown -server imap.gmail.com -email you@gmail.com -user you@gmail.com -password "app-password" -ssl
# Outlook/Office 365
./imapdown -server outlook.office365.com -email you@outlook.com -user you@outlook.com -password "password" -ssl
# Custom storage directory
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -ssl -output /path/to/backup
# Using STARTTLS instead of SSL
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -starttls
# Custom port
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -ssl -port 12993
Full Download
To force a complete download of all emails (ignoring previous state):
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -ssl -full
Note: As a safety measure, -full will refuse to run if the download folder already contains emails. This prevents accidental duplicates. To re-download everything, first delete the folder:
rm -rf me@example.com/
Debugging/Testing
Limit the number of emails downloaded:
./imapdown -server imap.example.com -email me@example.com -user me@example.com -password "secret" -ssl -limit 10
Command Line Arguments
| Argument | Flag | Required | Description |
|---|---|---|---|
| Server | -server |
Yes | IMAP server hostname |
-email |
Yes | Email address (used for folder organization) | |
| User | -user |
Yes | Username for authentication |
| Password | -password |
Yes | Password for authentication |
| SSL | -ssl |
No | Use implicit SSL/TLS (default port 993) |
| STARTTLS | -starttls |
No | Use STARTTLS (default port 143) |
| Port | -port |
No | Custom port (overrides defaults) |
| Limit | -limit |
No | Maximum number of emails to download |
| Full | -full |
No | Download all emails (default: only new since last run) |
| Output | -output |
No | Directory to store downloaded emails (default: ./{email}) |
Notes:
-ssland-starttlsare mutually exclusive
Output Structure
Without -output flag (default: ./{email_address}/):
./user@example.com/
├── .imapdown_state.json # Tracks last downloaded UID per folder
├── INBOX/
│ ├── 123_20240115_Meeting_notes.eml
│ ├── 124_20240116_Report.eml
│ └── 124_20240116_Report.zip # Attachments (if any)
├── Sent/
│ └── 456_20240114_RE_Question.eml
└── Archive/
└── 789_20240101_Old_email.eml
With -output /path/to/backup (emails go directly into specified directory):
/path/to/backup/
├── .imapdown_state.json
├── INBOX/
│ ├── 123_20240115_Meeting_notes.eml
│ ├── 124_20240116_Report.eml
│ └── 124_20240116_Report.zip
├── Sent/
│ └── 456_20240114_RE_Question.eml
└── Archive/
└── 789_20240101_Old_email.eml
File Naming
Email files are named: {UID}_{date}_{subject}.eml
- UID: Unique identifier from the IMAP server
- date: Message date in
YYYYMMDD_HHMMSSformat - subject: Sanitized email subject (truncated to 50 characters)
Attachments
When an email contains attachments, they are extracted and saved in a zip file with the same base name as the .eml file but with a .zip extension.
State Tracking
A .imapdown_state.json file is maintained in the download folder. This file tracks the highest downloaded UID for each IMAP folder, enabling efficient incremental updates.
Example state file:
{
"INBOX": 19334,
"INBOX.Archive": 1770,
"Sent": 892
}
Building from Source
# Build for current platform
make build
# Cross-compile for all platforms
make build-all
# Produces: imapdown-linux-amd64, imapdown-linux-arm64,
# imapdown-darwin-amd64, imapdown-darwin-arm64,
# imapdown-windows-amd64.exe
# Install to $GOPATH/bin
make install
# Clean build artifacts
make clean
# Or use Go directly
go build -ldflags="-s -w" -o imapdown
Troubleshooting
Gmail Authentication
Gmail requires an app-specific password if you have 2-factor authentication enabled:
- Go to Google Account Settings → Security → 2-Step Verification → App passwords
- Generate a new app password for "Mail"
- Use this password instead of your regular password
Connection Issues
- SSL errors: Make sure you're using the correct port (993 for SSL, 143 for STARTTLS)
- Authentication failed: Verify username and password are correct
- Timeout: Some servers require STARTTLS instead of SSL - try
-starttlsflag
First Run Not Downloading
If the first run doesn't download anything:
- Check the folder actually contains emails on the server
- Try with
-limit 10to test with a small batch first - Verify your credentials work by logging into webmail
Re-downloading Everything
To start fresh and re-download all emails:
# Delete the email folder (and state file)
rm -rf ./your-email@example.com/
# Run with -full flag
./imapdown -server imap.example.com -email your-email@example.com -user your-email@example.com -password "password" -ssl -full
License
MIT