{"id":35408529,"url":"https://github.com/fenilsonani/email-server","last_synced_at":"2026-01-18T10:35:21.248Z","repository":{"id":329805928,"uuid":"1119909242","full_name":"fenilsonani/email-server","owner":"fenilsonani","description":"Self-hosted personal email server with IMAP, SMTP, CalDAV/CardDAV. Privacy-focused alternative to Gmail/Outlook. Features: auto-TLS, DKIM/SPF/DMARC, greylisting, Prometheus metrics, audit logging.","archived":false,"fork":false,"pushed_at":"2026-01-13T03:25:45.000Z","size":30691,"stargazers_count":23,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-13T19:50:58.344Z","etag":null,"topics":["caldav","carddav","degoogle","email-server","golang","imap","mail-server","privacy","self-hosted","smtp"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fenilsonani.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-20T04:48:35.000Z","updated_at":"2026-01-13T11:16:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fenilsonani/email-server","commit_stats":null,"previous_names":["fenilsonani/email-server"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/fenilsonani/email-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenilsonani%2Femail-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenilsonani%2Femail-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenilsonani%2Femail-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenilsonani%2Femail-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fenilsonani","download_url":"https://codeload.github.com/fenilsonani/email-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenilsonani%2Femail-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T10:13:46.436Z","status":"ssl_error","status_checked_at":"2026-01-18T10:13:11.045Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["caldav","carddav","degoogle","email-server","golang","imap","mail-server","privacy","self-hosted","smtp"],"created_at":"2026-01-02T13:24:07.711Z","updated_at":"2026-01-18T10:35:21.223Z","avatar_url":"https://github.com/fenilsonani.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal Email Server\n\nA self-hosted email server written in Go, designed for individuals and small teams who want complete control over their email infrastructure. Features IMAP with IDLE push notifications, SMTP with intelligent delivery, CalDAV/CardDAV sync, and a web admin panel.\n\n**Why self-host email in 2026?**\n- Google Workspace prices increased 17-22% in 2025\n- No corporate surveillance - your emails aren't scanned for ads or AI training\n- Unlimited users for ~$72/year total\n- No risk of account suspension\n- Own your data on your server\n\n## Features\n\n### Core Email\n- **IMAP Server** with IDLE support for real-time push notifications\n- **SMTP Server** for sending and receiving with smart retry logic\n- **DKIM Signing** for outbound email authentication\n- **SPF/DMARC** verification for inbound security\n\n### Calendar \u0026 Contacts\n- **CalDAV Server** for calendar synchronization (Apple Calendar, Thunderbird, etc.)\n- **CardDAV Server** for contacts synchronization\n- Works seamlessly with Apple Mail, iOS, and other standards-compliant clients\n\n### Security\n- **TLS/ACME** automatic certificate management via Let's Encrypt\n- **Argon2id** password hashing (OWASP recommended)\n- **Greylisting** for spam prevention\n- **Rate Limiting** to prevent brute force attacks\n- **Audit Logging** for compliance and security monitoring\n- **TLS Fallback** for servers with misconfigured certificates\n\n\u003e **Note on encryption**: Emails are encrypted in transit (TLS) but stored unencrypted on disk (standard Maildir format). This is similar to most email servers including Gmail. For at-rest encryption, use full-disk encryption (LUKS, FileVault, etc.) on your server.\n\n\u003e **Why no POP3?** POP3 is an outdated protocol from 1984 with significant limitations:\n\u003e - Downloads and deletes emails from server (no sync across devices)\n\u003e - No folder support (only inbox)\n\u003e - No server-side search or flags\n\u003e - Poor multi-device experience (emails scattered across devices)\n\u003e - Modern email clients (Apple Mail, Thunderbird, Outlook) all prefer IMAP\n\u003e - IMAP provides superior multi-device sync, folder support, and server-side operations\n\u003e\n\u003e POP3 was designed for single-device, dial-up internet scenarios that no longer exist. In 2026, IMAP is the standard and provides a vastly better user experience. If you need POP3 for a specific legacy client, consider using an IMAP-to-POP3 proxy.\n\n### Administration\n- **Web Admin Panel** for user/domain management\n- **Prometheus Metrics** for monitoring (`/metrics` endpoint)\n- **Health Endpoints** for uptime monitoring\n- **Auto-discovery** for Outlook and Apple Mail automatic configuration\n- **Setup Wizard** for guided installation\n\n### Storage \u0026 Performance\n- **SQLite** for metadata (lightweight, no external database needed)\n- **Redis** for message queue (delivery retries, scheduling)\n- **Maildir** format for email storage (standard, easy to backup)\n- **User Quotas** with storage limit enforcement\n- **Multi-domain** support\n\n## Requirements\n\n- Go 1.22 or later (for building)\n- Redis server (for message queue)\n- A VPS with a public IP address ($5/month is sufficient)\n- A domain name with DNS control\n- Ports: 25, 587, 465, 143, 993, 8080, 8443\n\n## Quick Start\n\n### Option 1: Setup Wizard (Recommended)\n\n```bash\n# Clone and build\ngit clone https://github.com/fenilsonani/email-server.git\ncd email-server\ngo build -o mailserver ./cmd/mailserver\n\n# Run preflight checks\n./mailserver preflight\n\n# Interactive setup wizard\n./mailserver setup\n\n# Diagnose any issues\n./mailserver doctor\n```\n\n### Option 2: Manual Setup\n\n#### 1. Build the Server\n\n```bash\ngit clone https://github.com/fenilsonani/email-server.git\ncd email-server\ngo build -o mailserver ./cmd/mailserver\n```\n\n#### 2. Initialize Configuration\n\n```bash\n# Create directories\nsudo mkdir -p /etc/mailserver /var/lib/mailserver/maildir /var/lib/mailserver/queue\n\n# Copy example config\nsudo cp configs/config.example.yaml /etc/mailserver/config.yaml\n\n# Edit configuration\nsudo nano /etc/mailserver/config.yaml\n```\n\n#### 3. Install and Start Redis\n\n```bash\n# Ubuntu/Debian\nsudo apt install redis-server\nsudo systemctl enable redis-server\nsudo systemctl start redis-server\n\n# macOS\nbrew install redis\nbrew services start redis\n```\n\n#### 4. Configure Your Domain\n\nEdit `/etc/mailserver/config.yaml`:\n\n```yaml\nserver:\n  hostname: mail.yourdomain.com\n  smtp_port: 25\n  submission_port: 587\n  smtps_port: 465\n  imap_port: 143\n  imaps_port: 993\n  dav_port: 8443\n  admin_port: 8080\n\ntls:\n  auto_tls: true\n  email: admin@yourdomain.com\n  cache_dir: /var/lib/mailserver/acme\n\nstorage:\n  data_dir: /var/lib/mailserver\n  database_path: /var/lib/mailserver/mail.db\n  maildir_path: /var/lib/mailserver/maildir\n\nredis:\n  address: localhost:6379\n  password: \"\"\n  db: 0\n\ndomains:\n  - name: yourdomain.com\n    dkim_selector: mail\n    dkim_key_file: /etc/mailserver/dkim/yourdomain.com.key\n\nsecurity:\n  require_tls: true\n  verify_spf: true\n  verify_dkim: true\n  verify_dmarc: true\n  sign_outbound: true\n  max_message_size: 26214400  # 25MB\n\n# Greylisting for spam prevention\ngreylisting:\n  enabled: true\n  min_delay: 5m\n  max_age: 840h  # 35 days\n\n# Delivery settings\ndelivery:\n  workers: 4\n  require_tls: false\n  verify_tls: true\n\nlogging:\n  level: info\n  format: json\n  output: stdout\n```\n\n#### 5. Initialize Database \u0026 Add Users\n\n```bash\n# Run database migrations\n./mailserver migrate --config /etc/mailserver/config.yaml\n\n# Add your domain\n./mailserver domain add yourdomain.com\n\n# Create a user\n./mailserver user add user@yourdomain.com\n# You'll be prompted to enter a password\n```\n\n#### 6. Generate DKIM Key\n\n```bash\n# Create DKIM directory\nsudo mkdir -p /etc/mailserver/dkim\n\n# Generate DKIM key pair\nopenssl genrsa -out /etc/mailserver/dkim/yourdomain.com.key 2048\nopenssl rsa -in /etc/mailserver/dkim/yourdomain.com.key -pubout \u003e /etc/mailserver/dkim/yourdomain.com.pub\n\n# Get DNS record\n./mailserver dkim dns --domain yourdomain.com\n```\n\n#### 7. Configure DNS Records\n\nAdd these DNS records to your domain:\n\n| Type | Name | Value |\n|------|------|-------|\n| A | mail | your.server.ip |\n| MX | @ | mail.yourdomain.com (priority 10) |\n| TXT | @ | `v=spf1 mx a:mail.yourdomain.com -all` |\n| TXT | mail._domainkey | (output from dkim dns command) |\n| TXT | _dmarc | `v=DMARC1; p=quarantine; rua=mailto:postmaster@yourdomain.com` |\n\n**For Auto-discovery (optional but recommended):**\n\n| Type | Name | Value |\n|------|------|-------|\n| CNAME | autodiscover | mail.yourdomain.com |\n| CNAME | autoconfig | mail.yourdomain.com |\n| SRV | _autodiscover._tcp | 0 0 443 mail.yourdomain.com |\n\n#### 8. Start the Server\n\n```bash\n./mailserver serve --config /etc/mailserver/config.yaml\n```\n\n## Deployment\n\n### Using systemd (Recommended for Production)\n\n```bash\n# Copy binary to system location\nsudo cp mailserver /usr/local/bin/\n\n# Install service\nsudo cp deploy/mailserver.service /etc/systemd/system/\nsudo systemctl daemon-reload\n\n# Start and enable\nsudo systemctl start mailserver\nsudo systemctl enable mailserver\n\n# View logs\nsudo journalctl -u mailserver -f\n```\n\n### Using Docker\n\n```bash\n# Build image\ndocker build -t mailserver .\n\n# Run with docker-compose\ncp configs/config.example.yaml config.yaml\n# Edit config.yaml with your settings\ndocker-compose up -d\n```\n\n## Admin Panel\n\nAccess the web admin panel at `http://localhost:8080` (or behind your reverse proxy).\n\n### Features:\n- Dashboard with server statistics\n- User management (create, edit, delete, disable)\n- Domain management\n- Mail queue monitoring (view, retry, delete messages)\n- Audit logs\n- Real-time metrics\n\n### Default Login:\nSet admin credentials in your config or create via CLI:\n```bash\n./mailserver user add admin@yourdomain.com --admin\n```\n\n## Monitoring\n\n### Prometheus Metrics\n\nMetrics are exposed at `/metrics` on the admin port:\n\n```bash\ncurl http://localhost:8080/metrics\n```\n\n**Available Metrics:**\n| Metric | Type | Description |\n|--------|------|-------------|\n| `mailserver_messages_received_total` | Counter | Total inbound messages |\n| `mailserver_messages_sent_total` | Counter | Successful deliveries |\n| `mailserver_messages_rejected_total` | Counter | Rejected messages (by reason) |\n| `mailserver_messages_bounced_total` | Counter | Bounced messages |\n| `mailserver_delivery_duration_seconds` | Histogram | Delivery latency |\n| `mailserver_queue_depth` | Gauge | Current queue size |\n| `mailserver_auth_attempts_total` | Counter | Auth attempts (by result/protocol) |\n| `mailserver_quota_exceeded_total` | Counter | Quota rejections |\n| `mailserver_active_connections` | Gauge | Active connections (by protocol) |\n\n### Health Endpoints\n\n```bash\n# Basic health check\ncurl http://localhost:8080/health\n\n# Detailed health with component status\ncurl http://localhost:8080/health/detailed\n```\n\n### Grafana Dashboard\n\nImport the included Grafana dashboard from `deploy/grafana-dashboard.json` for visualization.\n\n## Client Configuration\n\n### Auto-Discovery\n\nMost modern email clients (Outlook, Apple Mail, Thunderbird) will automatically configure themselves if you've set up the autodiscover DNS records.\n\n### Manual Configuration\n\n#### Apple Mail (macOS/iOS)\n\n**IMAP Settings:**\n- Server: mail.yourdomain.com\n- Port: 993\n- SSL: Yes\n- Username: user@yourdomain.com\n\n**SMTP Settings:**\n- Server: mail.yourdomain.com\n- Port: 587\n- SSL: STARTTLS\n- Authentication: Password\n- Username: user@yourdomain.com\n\n#### Calendar (CalDAV)\n\n- Server URL: `https://mail.yourdomain.com:8443/caldav/`\n- Or use: `https://mail.yourdomain.com:8443/.well-known/caldav`\n- Username: user@yourdomain.com\n- Password: your password\n\n#### Contacts (CardDAV)\n\n- Server URL: `https://mail.yourdomain.com:8443/carddav/`\n- Or use: `https://mail.yourdomain.com:8443/.well-known/carddav`\n- Username: user@yourdomain.com\n- Password: your password\n\n## Architecture\n\n```\n┌───────────────────────────────────────────────────────────────────────┐\n│                             Mail Server                               │\n├───────────┬───────────┬───────────┬───────────┬───────────┬───────────┤\n│  SMTP(25) │  Sub(587) │ IMAP(993) │ DAV(8443) │Admin(8080)│ AutoDisc  │\n├───────────┴───────────┴───────────┴───────────┴───────────┴───────────┤\n│                           Security Layer                              │\n│  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐  │\n│  │  Rate Limit  │ │  Greylisting │ │    Audit     │ │   TLS/ACME   │  │\n│  └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘  │\n├───────────────────────────────────────────────────────────────────────┤\n│                        Authentication Layer                           │\n│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐    │\n│  │     Argon2id      │ │    User Quotas    │ │    Multi-Domain   │    │\n│  └───────────────────┘ └───────────────────┘ └───────────────────┘    │\n├───────────────────────────────────────────────────────────────────────┤\n│                           Delivery Engine                             │\n│  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐  │\n│  │    Redis     │ │   Circuit    │ │   Retry w/   │ │     TLS      │  │\n│  │    Queue     │ │   Breakers   │ │   Backoff    │ │   Fallback   │  │\n│  └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘  │\n├───────────────────────────────────────────────────────────────────────┤\n│                            Storage Layer                              │\n│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐    │\n│  │      SQLite       │ │      Maildir      │ │       DKIM        │    │\n│  │    (metadata)     │ │     (emails)      │ │     (signing)     │    │\n│  └───────────────────┘ └───────────────────┘ └───────────────────┘    │\n├───────────────────────────────────────────────────────────────────────┤\n│                            Observability                              │\n│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐    │\n│  │    Prometheus     │ │      Audit        │ │      Health       │    │\n│  │     Metrics       │ │       Logs        │ │      Checks       │    │\n│  └───────────────────┘ └───────────────────┘ └───────────────────┘    │\n└───────────────────────────────────────────────────────────────────────┘\n```\n\n## CLI Commands\n\n### Server Commands\n\n```bash\n# Start the server\nmailserver serve --config /etc/mailserver/config.yaml\n\n# Run database migrations\nmailserver migrate --config /etc/mailserver/config.yaml\n\n# Pre-flight checks (before setup)\nmailserver preflight\n\n# Interactive setup wizard\nmailserver setup\n\n# Diagnose issues\nmailserver doctor\n```\n\n### Domain Management\n\n```bash\n# Add a domain\nmailserver domain add example.com\n\n# List domains\nmailserver domain list\n\n# Remove a domain\nmailserver domain remove example.com\n```\n\n### User Management\n\n```bash\n# Add a user (interactive password prompt)\nmailserver user add user@example.com\n\n# Add a user with password\nmailserver user add user@example.com --password \"secretpassword\"\n\n# Add an admin user\nmailserver user add admin@example.com --admin\n\n# List users\nmailserver user list\n\n# List users for specific domain\nmailserver user list --domain example.com\n\n# Set user quota (in bytes, 0 = unlimited)\nmailserver user quota user@example.com 1073741824  # 1GB\n\n# Disable a user\nmailserver user disable user@example.com\n\n# Enable a user\nmailserver user enable user@example.com\n```\n\n### DKIM Management\n\n```bash\n# Generate DKIM key for a domain\nmailserver dkim generate --domain example.com\n\n# Show DNS record for DKIM\nmailserver dkim dns --domain example.com\n```\n\n### Queue Management\n\n```bash\n# List queued messages\nmailserver queue list\n\n# Retry a specific message\nmailserver queue retry \u003cmessage-id\u003e\n\n# Retry all failed messages\nmailserver queue retry-all\n\n# Delete a message from queue\nmailserver queue delete \u003cmessage-id\u003e\n\n# Show queue statistics\nmailserver queue stats\n```\n\n## Spam Prevention\n\n### Greylisting\n\nGreylisting temporarily rejects emails from unknown senders. Legitimate servers retry; spammers usually don't.\n\n**How it works:**\n1. First email from new sender → \"try again in 5 minutes\"\n2. Sender retries after 5+ minutes → accepted, remembered for 35 days\n3. Future emails from same sender → accepted immediately\n\n**Configuration:**\n```yaml\ngreylisting:\n  enabled: true\n  min_delay: 5m      # Minimum wait time\n  max_age: 840h      # Remember senders for 35 days\n```\n\n### Additional Recommendations\n\nFor production use, consider adding:\n- **Rspamd** or **SpamAssassin** for content filtering\n- **Fail2ban** for additional brute force protection\n- **ClamAV** for virus scanning\n\n## Delivery Engine\n\n### Smart Retry Logic\n\nFailed deliveries use exponential backoff with jitter:\n\n```\nAttempt 1:  5 minutes\nAttempt 2:  15 minutes\nAttempt 3:  30 minutes\nAttempt 4:  1 hour\nAttempt 5:  2 hours\nAttempt 6:  4 hours\nAttempt 7:  8 hours\nAttempt 8:  16 hours\nAttempt 9+: 24 hours (capped)\n```\n\n- Maximum 15 retry attempts\n- Messages expire after 7 days\n- ±10% jitter prevents thundering herd\n\n### Per-Domain Circuit Breakers\n\nIf a destination domain is having issues, the circuit breaker prevents wasting resources:\n\n- **5 failures** → circuit opens (stop trying)\n- **5 minutes** → circuit half-opens (try one)\n- **2 successes** → circuit closes (normal operation)\n\n### TLS Handling\n\nThe server intelligently handles TLS:\n- Attempts STARTTLS first\n- If certificate verification fails and `require_tls: false`, reconnects without TLS\n- Logs warning but delivers the message\n- ~15% of mail servers have misconfigured certificates\n\n## Security Considerations\n\n1. **Firewall**: Only open required ports (25, 587, 465, 143, 993, 8443)\n2. **Admin Panel**: Put behind reverse proxy with HTTPS, restrict access\n3. **TLS**: Always use `auto_tls: true` in production\n4. **Passwords**: Use strong passwords (Argon2id hashed automatically)\n5. **DKIM**: Always sign outbound emails\n6. **SPF/DMARC**: Configure proper DNS records\n7. **Updates**: Keep the server and dependencies updated\n8. **Backups**: Regular backups of `/var/lib/mailserver/`\n9. **Redis**: Secure Redis if exposed (use password, bind to localhost)\n\n## Troubleshooting\n\n### Pre-flight Checks\n\n```bash\n./mailserver preflight\n```\n\nThis checks:\n- Port availability\n- DNS configuration\n- Redis connectivity\n- Directory permissions\n- TLS certificate status\n\n### Doctor Command\n\n```bash\n./mailserver doctor\n```\n\nDiagnoses common issues:\n- Service connectivity\n- DNS record validation\n- Deliverability testing\n- Storage health\n\n### Connection Refused\n\nCheck if ports are open:\n```bash\nsudo ss -tlnp | grep mailserver\n```\n\nCheck firewall:\n```bash\nsudo ufw status\n```\n\n### TLS Certificate Issues\n\nCheck certificate status:\n```bash\nls -la /var/lib/mailserver/acme/\nopenssl s_client -connect mail.yourdomain.com:993 -servername mail.yourdomain.com\n```\n\n### Email Not Delivered\n\nCheck DNS records:\n```bash\ndig MX yourdomain.com\ndig TXT yourdomain.com\ndig TXT mail._domainkey.yourdomain.com\ndig TXT _dmarc.yourdomain.com\n```\n\nTest deliverability:\n```bash\n# Use mail-tester.com for comprehensive test\n# Send an email to their test address and check score\n```\n\n### View Logs\n\n```bash\n# systemd\njournalctl -u mailserver -f\n\n# Docker\ndocker-compose logs -f\n\n# Filter by component\njournalctl -u mailserver | grep delivery\njournalctl -u mailserver | grep error\n```\n\n### Queue Issues\n\n```bash\n# Check queue depth\nredis-cli ZCARD mail:queue:pending\n\n# View message details\nredis-cli GET mail:message:\u003cmessage-id\u003e\n\n# Check delivery stats\nredis-cli HGETALL mail:stats\n```\n\n## Testing\n\nRun all tests:\n```bash\ngo test ./...\n```\n\nRun with verbose output:\n```bash\ngo test -v ./...\n```\n\nRun specific package tests:\n```bash\ngo test -v ./internal/auth/...\ngo test -v ./internal/metrics/...\ngo test -v ./internal/audit/...\ngo test -v ./internal/greylist/...\ngo test -v ./internal/smtp/delivery/...\n```\n\n## Resource Requirements\n\n**Minimum (personal use):**\n- 1 vCPU\n- 1GB RAM\n- 20GB storage\n- Cost: ~$5/month\n\n**Recommended (small team):**\n- 2 vCPU\n- 2GB RAM\n- 50GB storage\n- Cost: ~$10-15/month\n\n**Actual Usage:**\n- ~50MB RAM idle\n- ~100MB RAM under load\n- CPU: minimal except during delivery spikes\n\n## Cost Comparison (2026)\n\n| Solution | Cost (10 users) | Per-User | Privacy |\n|----------|-----------------|----------|---------|\n| Google Workspace | $1,680/year | $168/year | Low |\n| Microsoft 365 | $1,500/year | $150/year | Low |\n| ProtonMail Business | $900/year | $90/year | High |\n| **Self-Hosted** | **$72/year** | **$7.20/year** | **Maximum** |\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Open an issue to discuss major changes\n2. Fork the repository\n3. Create a feature branch\n4. Add tests for new functionality\n5. Submit a pull request\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/fenilsonani/email-server/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/fenilsonani/email-server/discussions)\n\n## Acknowledgments\n\nBuilt with:\n- [go-imap](https://github.com/emersion/go-imap) - IMAP library\n- [go-smtp](https://github.com/emersion/go-smtp) - SMTP library\n- [go-msgauth](https://github.com/emersion/go-msgauth) - DKIM/SPF\n- [go-redis](https://github.com/redis/go-redis) - Redis client\n- [mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) - SQLite driver\n- [prometheus/client_golang](https://github.com/prometheus/client_golang) - Metrics\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenilsonani%2Femail-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffenilsonani%2Femail-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenilsonani%2Femail-server/lists"}