362 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			362 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # @serve.zone/mailer
 | ||
|  | 
 | ||
|  | > Enterprise mail server with SMTP, HTTP API, and DNS management
 | ||
|  | 
 | ||
|  | [](license) | ||
|  | [](package.json) | ||
|  | 
 | ||
|  | ## Overview
 | ||
|  | 
 | ||
|  | `@serve.zone/mailer` is a comprehensive mail server solution built with Deno, featuring: | ||
|  | 
 | ||
|  | - **SMTP Server & Client** - Full-featured SMTP implementation for sending and receiving emails | ||
|  | - **HTTP REST API** - Mailgun-compatible API for programmatic email management | ||
|  | - **DNS Management** - Automatic DNS setup via Cloudflare API | ||
|  | - **DKIM/SPF/DMARC** - Complete email authentication and security | ||
|  | - **Daemon Service** - Systemd integration for production deployments | ||
|  | - **CLI Interface** - Command-line management of all features | ||
|  | 
 | ||
|  | ## Architecture
 | ||
|  | 
 | ||
|  | ### Technology Stack
 | ||
|  | 
 | ||
|  | - **Runtime**: Deno (compiles to standalone binaries) | ||
|  | - **Language**: TypeScript | ||
|  | - **Distribution**: npm (via binary wrappers) | ||
|  | - **Service**: systemd daemon | ||
|  | - **DNS**: Cloudflare API integration | ||
|  | 
 | ||
|  | ### Project Structure
 | ||
|  | 
 | ||
|  | ``` | ||
|  | mailer/ | ||
|  | ├── bin/                    # npm binary wrappers | ||
|  | ├── scripts/                # Build scripts | ||
|  | ├── ts/                     # TypeScript source | ||
|  | │   ├── mail/              # Email implementation (ported from dcrouter) | ||
|  | │   │   ├── core/          # Email classes, validation, templates | ||
|  | │   │   ├── delivery/      # SMTP client/server, queues | ||
|  | │   │   ├── routing/       # Email routing, domain config | ||
|  | │   │   └── security/      # DKIM, SPF, DMARC | ||
|  | │   ├── api/               # HTTP REST API (Mailgun-compatible) | ||
|  | │   ├── dns/               # DNS management + Cloudflare | ||
|  | │   ├── daemon/            # Systemd service management | ||
|  | │   ├── config/            # Configuration system | ||
|  | │   └── cli/               # Command-line interface | ||
|  | ├── test/                  # Test suite | ||
|  | ├── deno.json              # Deno configuration | ||
|  | ├── package.json           # npm metadata | ||
|  | └── mod.ts                 # Main entry point | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Installation
 | ||
|  | 
 | ||
|  | ### Via npm (recommended)
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | npm install -g @serve.zone/mailer | ||
|  | ``` | ||
|  | 
 | ||
|  | ### From source
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | git clone https://code.foss.global/serve.zone/mailer | ||
|  | cd mailer | ||
|  | deno task compile | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Usage
 | ||
|  | 
 | ||
|  | ### CLI Commands
 | ||
|  | 
 | ||
|  | #### Service Management
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Start the mailer daemon
 | ||
|  | sudo mailer service start | ||
|  | 
 | ||
|  | # Stop the daemon
 | ||
|  | sudo mailer service stop | ||
|  | 
 | ||
|  | # Restart the daemon
 | ||
|  | sudo mailer service restart | ||
|  | 
 | ||
|  | # Check status
 | ||
|  | mailer service status | ||
|  | 
 | ||
|  | # Enable systemd service
 | ||
|  | sudo mailer service enable | ||
|  | 
 | ||
|  | # Disable systemd service
 | ||
|  | sudo mailer service disable | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Domain Management
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Add a domain
 | ||
|  | mailer domain add example.com | ||
|  | 
 | ||
|  | # Remove a domain
 | ||
|  | mailer domain remove example.com | ||
|  | 
 | ||
|  | # List all domains
 | ||
|  | mailer domain list | ||
|  | ``` | ||
|  | 
 | ||
|  | #### DNS Management
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Auto-configure DNS via Cloudflare
 | ||
|  | mailer dns setup example.com | ||
|  | 
 | ||
|  | # Validate DNS configuration
 | ||
|  | mailer dns validate example.com | ||
|  | 
 | ||
|  | # Show required DNS records
 | ||
|  | mailer dns show example.com | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Sending Email
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Send email via CLI
 | ||
|  | mailer send \\ | ||
|  |   --from sender@example.com \\ | ||
|  |   --to recipient@example.com \\ | ||
|  |   --subject "Hello" \\ | ||
|  |   --text "World" | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Configuration
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Show current configuration
 | ||
|  | mailer config show | ||
|  | 
 | ||
|  | # Set configuration value
 | ||
|  | mailer config set smtpPort 25 | ||
|  | mailer config set apiPort 8080 | ||
|  | mailer config set hostname mail.example.com | ||
|  | ``` | ||
|  | 
 | ||
|  | ### HTTP API
 | ||
|  | 
 | ||
|  | The mailer provides a Mailgun-compatible REST API: | ||
|  | 
 | ||
|  | #### Send Email
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | POST /v1/messages | ||
|  | Content-Type: application/json | ||
|  | 
 | ||
|  | { | ||
|  |   "from": "sender@example.com", | ||
|  |   "to": "recipient@example.com", | ||
|  |   "subject": "Hello", | ||
|  |   "text": "World", | ||
|  |   "html": "<p>World</p>" | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | #### List Domains
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | GET /v1/domains | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Manage SMTP Credentials
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | GET /v1/domains/:domain/credentials | ||
|  | POST /v1/domains/:domain/credentials | ||
|  | DELETE /v1/domains/:domain/credentials/:id | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Email Events
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | GET /v1/events | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Programmatic Usage
 | ||
|  | 
 | ||
|  | ```typescript | ||
|  | import { Email, SmtpClient } from '@serve.zone/mailer'; | ||
|  | 
 | ||
|  | // Create an email | ||
|  | const email = new Email({ | ||
|  |   from: 'sender@example.com', | ||
|  |   to: 'recipient@example.com', | ||
|  |   subject: 'Hello from Mailer', | ||
|  |   text: 'This is a test email', | ||
|  |   html: '<p>This is a test email</p>', | ||
|  | }); | ||
|  | 
 | ||
|  | // Send via SMTP | ||
|  | const client = new SmtpClient({ | ||
|  |   host: 'smtp.example.com', | ||
|  |   port: 587, | ||
|  |   secure: true, | ||
|  |   auth: { | ||
|  |     user: 'username', | ||
|  |     pass: 'password', | ||
|  |   }, | ||
|  | }); | ||
|  | 
 | ||
|  | await client.sendMail(email); | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Configuration
 | ||
|  | 
 | ||
|  | Configuration is stored in `~/.mailer/config.json`: | ||
|  | 
 | ||
|  | ```json | ||
|  | { | ||
|  |   "domains": [ | ||
|  |     { | ||
|  |       "domain": "example.com", | ||
|  |       "dnsMode": "external-dns", | ||
|  |       "cloudflare": { | ||
|  |         "apiToken": "your-cloudflare-token" | ||
|  |       } | ||
|  |     } | ||
|  |   ], | ||
|  |   "apiKeys": ["api-key-1", "api-key-2"], | ||
|  |   "smtpPort": 25, | ||
|  |   "apiPort": 8080, | ||
|  |   "hostname": "mail.example.com" | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ## DNS Setup
 | ||
|  | 
 | ||
|  | The mailer requires the following DNS records for each domain: | ||
|  | 
 | ||
|  | ### MX Record
 | ||
|  | ``` | ||
|  | Type: MX | ||
|  | Name: @ | ||
|  | Value: mail.example.com | ||
|  | Priority: 10 | ||
|  | TTL: 3600 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### A Record
 | ||
|  | ``` | ||
|  | Type: A | ||
|  | Name: mail | ||
|  | Value: <your-server-ip> | ||
|  | TTL: 3600 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### SPF Record
 | ||
|  | ``` | ||
|  | Type: TXT | ||
|  | Name: @ | ||
|  | Value: v=spf1 mx ip4:<your-server-ip> ~all | ||
|  | TTL: 3600 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### DKIM Record
 | ||
|  | ``` | ||
|  | Type: TXT | ||
|  | Name: default._domainkey | ||
|  | Value: <dkim-public-key> | ||
|  | TTL: 3600 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### DMARC Record
 | ||
|  | ``` | ||
|  | Type: TXT | ||
|  | Name: _dmarc | ||
|  | Value: v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com | ||
|  | TTL: 3600 | ||
|  | ``` | ||
|  | 
 | ||
|  | Use `mailer dns setup <domain>` to automatically configure these via Cloudflare. | ||
|  | 
 | ||
|  | ## Development
 | ||
|  | 
 | ||
|  | ### Prerequisites
 | ||
|  | 
 | ||
|  | - Deno 1.40+ | ||
|  | - Node.js 14+ (for npm distribution) | ||
|  | 
 | ||
|  | ### Build
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Compile for all platforms
 | ||
|  | deno task compile | ||
|  | 
 | ||
|  | # Run in development mode
 | ||
|  | deno task dev | ||
|  | 
 | ||
|  | # Run tests
 | ||
|  | deno task test | ||
|  | 
 | ||
|  | # Format code
 | ||
|  | deno task fmt | ||
|  | 
 | ||
|  | # Lint code
 | ||
|  | deno task lint | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Ported Components
 | ||
|  | 
 | ||
|  | The mail implementation is ported from [dcrouter](https://code.foss.global/serve.zone/dcrouter) and adapted for Deno: | ||
|  | 
 | ||
|  | - ✅ Email core (Email, EmailValidator, BounceManager, TemplateManager) | ||
|  | - ✅ SMTP Server (with TLS support) | ||
|  | - ✅ SMTP Client (with connection pooling) | ||
|  | - ✅ Email routing and domain management | ||
|  | - ✅ DKIM signing and verification | ||
|  | - ✅ SPF and DMARC validation | ||
|  | - ✅ Delivery queues and rate limiting | ||
|  | 
 | ||
|  | ## Roadmap
 | ||
|  | 
 | ||
|  | ### Phase 1 - Core Functionality (Current)
 | ||
|  | - [x] Project structure and build system | ||
|  | - [x] Port mail implementation from dcrouter | ||
|  | - [x] CLI interface | ||
|  | - [x] Configuration management | ||
|  | - [x] DNS management basics | ||
|  | - [ ] Cloudflare DNS integration | ||
|  | - [ ] HTTP REST API implementation | ||
|  | - [ ] Systemd service integration | ||
|  | 
 | ||
|  | ### Phase 2 - Production Ready
 | ||
|  | - [ ] Comprehensive testing | ||
|  | - [ ] Documentation | ||
|  | - [ ] Performance optimization | ||
|  | - [ ] Security hardening | ||
|  | - [ ] Monitoring and logging | ||
|  | 
 | ||
|  | ### Phase 3 - Advanced Features
 | ||
|  | - [ ] Webhook support | ||
|  | - [ ] Email templates | ||
|  | - [ ] Analytics and reporting | ||
|  | - [ ] Multi-tenancy | ||
|  | - [ ] Load balancing | ||
|  | 
 | ||
|  | ## License
 | ||
|  | 
 | ||
|  | MIT © Serve Zone | ||
|  | 
 | ||
|  | ## Contributing
 | ||
|  | 
 | ||
|  | Contributions are welcome! Please see our [contributing guidelines](https://code.foss.global/serve.zone/mailer/contributing). | ||
|  | 
 | ||
|  | ## Support
 | ||
|  | 
 | ||
|  | - Documentation: https://code.foss.global/serve.zone/mailer | ||
|  | - Issues: https://code.foss.global/serve.zone/mailer/issues | ||
|  | - Email: support@serve.zone | ||
|  | 
 | ||
|  | ## Acknowledgments
 | ||
|  | 
 | ||
|  | - Mail implementation ported from [dcrouter](https://code.foss.global/serve.zone/dcrouter) | ||
|  | - Inspired by [Mailgun](https://www.mailgun.com/) API design | ||
|  | - Built with [Deno](https://deno.land/) |