System Design Problems
Design an Email System
An email system handles sending, receiving, storing, and searching email across billions of users. Gmail alone stores 1.8 billion users' email with 15 GB free storage per account, requiring distributed storage, spam filtering, and strong delivery guarantees.
- Send/Receive â SMTP-based delivery with retry and bounce handling
- Storage â Petabytes of email data with per-user organization
- Search â Full-text search across billions of messages
Email is a distributed system by design: different mail servers communicate via SMTP, store messages locally, and handle delivery failures gracefully.
Requirements
Functional Requirements
- Send and receive email (SMTP/IMAP/POP3)
- Inbox, sent, drafts, spam, trash folders
- Full-text search across email content
- Attachment support (up to 25 MB)
- Spam and phishing detection
- Email forwarding and auto-reply rules
- Read receipts and delivery status
Non-Functional Requirements
- Delivery: At-least-once delivery with exactly-once semantics
- Latency: Email delivered within 30 seconds
- Storage: 15 GB per user, 1.8 billion users
- Search: Full-text search in < 1 second
- Spam: Filter > 99% of spam emails
- Availability: 99.99%
Back-of-the-Envelope Estimation
API Design
POST /api/v1/messages/send
Request: {
"to": ["user@example.com"],
"subject": "Hello",
"body": "Plain text or HTML",
"attachments": ["file_id_123"]
}
Response: { "message_id": "msg_abc123", "status": "queued" }
GET /api/v1/messages?folder=inbox&limit=50
Response: { "messages": [...], "total": 1234 }
GET /api/v1/messages/msg_abc123
Response: { "message_id": "...", "from": "...", "body": "..." }
GET /api/v1/search?q=invoice+2026
Response: { "messages": [...], "count": 42 }
High-Level Architecture
Detailed Design
Email Delivery Flow
SMTP Protocol
S: 220 mail.example.com ESMTP
C: HELO sender.com
S: 250 Hello
C: MAIL FROM:<sender@sender.com>
S: 250 OK
C: RCPT TO:<recipient@example.com>
S: 250 OK
C: DATA
S: 354 Start mail input
C: Subject: Hello
C: From: sender@sender.com
C: To: recipient@example.com
C:
C: This is the email body.
C: .
S: 250 OK: Message queued
C: QUIT
Spam Filtering
Email Storage
Store emails in a distributed storage system:
| Component | Technology | Reason |
|---|---|---|
| Email bodies | Object Storage (S3) | Large blobs, cost-effective |
| Metadata | Bigtable/Cassandra | Fast lookups, time-series |
| Full-text index | Elasticsearch | Search across content |
| Spam database | Redis/Bloom filter | Fast membership checks |
Delivery Guarantees
Practice Exercises
-
Design: How would you implement email forwarding rules (e.g., "forward emails from boss to phone")? Design the rules engine.
-
Scale: If Gmail stores 15 GB per user for 1.8 billion users, estimate the total storage needed and the distributed storage architecture.
-
Reliability: Design a system to guarantee exactly-once email delivery. What challenges arise from SMTP retries and network partitions?
-
Search: How would you implement full-text search across 100 billion emails? What indexing strategy would you use?
What to Learn Next
-> Design Notification System Multi-channel notification delivery patterns.
-> Message Queues Kafka for async email processing and delivery.
-> Design Object Storage Storing email attachments at scale.
-> Databases Bigtable/Cassandra for email metadata storage.
-> Rate Limiting Preventing email abuse and spam.
-> Security Patterns Email encryption (PGP/S/MIME) and authentication (DKIM/SPF).