A comprehensive solution for archiving, searching, and exporting emails from IMAP accounts
- Automated archiving of incoming and outgoing emails
- Support for multiple IMAP accounts
- Storage of email content and attachments
- Scheduled synchronization at configurable intervals
- Mobile and desktop optimized responsive UI
- MBox Import
- Search across all archived emails
- Filter by date range, sender, recipient, and more
- Preview emails with attachment list
- Create multiple user accounts
- Assignment of different mail accounts to users
- Account-specific statistics and overview
- Storage usage monitoring
- Top senders analysis
- Export individual emails in EML format
- Bulk export search results to CSV or JSON
- Attachment download with original filenames
- Restore a selection of emails or an entire mailbox to a destination mailbox
- Configure automatic deletion of archived emails from the IMAP server after a specified number of days
- Set retention period per email account (e.g., delete emails after 30, 90, or 365 days)
- Emails are only deleted from the server after they have been successfully archived
- Helps manage storage space on the IMAP server while maintaining a complete archive
🚨 Important note for retention policies
- Requires IMAP Expunge support from the mail server to permanently delete emails
- For Gmail accounts, Auto-Expunge must be enabled in Gmail settings under the "Forwarding and POP/IMAP" tab
- Docker
- Docker Compose
- IMAP email account credentials
-
Install the prerequisites on your system
-
Create a
docker-compose.yml
file
services:
mailarchive-app:
image: s1t5/mailarchiver:latest
restart: always
environment:
# Database Connection
- ConnectionStrings__DefaultConnection=Host=postgres;Database=MailArchiver;Username=mailuser;Password=masterkey;
# Authentication Settings
- Authentication__Enabled=true
- Authentication__Username=admin
- Authentication__Password=secure123!
- Authentication__SessionTimeoutMinutes=60
- Authentication__CookieName=MailArchiverAuth
# MailSync Settings
- MailSync__IntervalMinutes=15
- MailSync__TimeoutMinutes=60
- MailSync__ConnectionTimeoutSeconds=180
- MailSync__CommandTimeoutSeconds=300
# BatchRestore Settings
- BatchRestore__AsyncThreshold=50
- BatchRestore__MaxSyncEmails=150
- BatchRestore__MaxAsyncEmails=50000
- BatchRestore__SessionTimeoutMinutes=30
- BatchRestore__DefaultBatchSize=50
# BatchOperation Settings
- BatchOperation__BatchSize=50
- BatchOperation__PauseBetweenEmailsMs=50
- BatchOperation__PauseBetweenBatchesMs=250
# Npgsql Settings
- Npgsql__CommandTimeout=600
ports:
- "5000:5000"
networks:
- postgres
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: always
environment:
POSTGRES_DB: MailArchiver
POSTGRES_USER: mailuser
POSTGRES_PASSWORD: masterkey
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mailuser -d MailArchiver"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
networks:
postgres:
-
Edit the database configuration in the
docker-compose.yml
and set a secure password in thePOSTGRES_PASSWORD
variable and theConnectionString
. -
If you want to use authentication (which i'd strongly recommend) definie a
Authentication__Username
andAuthentication__Password
which is used for the admin user. -
Configure a reverse proxy of your choice with https and authentification to secure access to the application.
⚠️ AttentionThe application itself does not provide encrypted access via https! It must be set up via a reverse proxy! Moreover the application is not build for public internet access!
- Initial start of the containers:
docker compose up -d
- Restart containers:
docker compose restart
-
Access the application
-
Login with your defined credentials and add your first email account:
- Navigate to "Email Accounts" section
- Click "New Account"
- Enter your IMAP server details and credentials
- Save and start archiving!
- If you want, create other users and assign accounts.
- Use strong passwords and change default credentials
- Consider implementing HTTPS with a reverse proxy in production
- Regular backups of the PostgreSQL database recommended
It is also possible to migrate a mailbox to another target mailbox, for example when changing mail provider. The following steps are planned for this
- add the source account under the accounts
- synchronisation of the source account
- adding the target account
- synchronisation of the possibly still empty target account
- select ‘Copy All Emails to Another Mailbox’ in the details under the accounts for the source account
- select the target account and the target folder in this account and start the migration. If there is a large amount of emails to be moved, this is carried out as a background task. The status and progress of this can be viewed in the Jobs tab.
- after the successful transfer, set the source account to ‘Disabled’ under the accounts so that it is no longer archived in future.
- ASP.NET Core 8 MVC application
- PostgreSQL database for email storage
- MailKit library for IMAP communication
- Background service for email synchronization
- Bootstrap 5 and Chart.js for frontend
Contributions welcome! Please open an Issue or Pull Request.
The roadmap is now maintained on the repos project page.
📄 License: GNU GENERAL PUBLIC LICENSE Version 3 (see LICENSE file)