SMTP Ingest
SeeSee includes a built-in SMTP server powered by aiosmtpd. Instead of integrating the REST API, you can point your application’s SMTP settings at SeeSee and it will capture every outgoing email automatically.
How it works
- Your app sends email via SMTP to SeeSee (default port 2525)
- SeeSee authenticates the connection using per-app SMTP credentials
- The MIME message is parsed — subject, addresses, HTML body, text body are extracted
- The email is stored in the database, respecting the app’s body storage mode
Your App → SMTP (port 2525) → SeeSee → DatabaseSetup
1. Enable SMTP
SMTP is enabled by default. Verify with:
SEESEE_SMTP_ENABLED=true # defaultSEESEE_SMTP_PORT=2525 # defaultMake sure port 2525 is exposed in your Docker setup:
docker run -p 8080:8080 -p 2525:2525 ...2. Create an app
Each app gets unique SMTP credentials on creation:
curl -X POST http://localhost:8080/api/v1/apps \ -u admin:your-password \ -H "Content-Type: application/json" \ -d '{"name": "My App"}'Save the smtp_username and smtp_password from the response — they’re shown once.
3. Configure your app’s SMTP settings
Point your application at SeeSee:
| Setting | Value |
|---|---|
| SMTP Host | Your SeeSee server IP or hostname |
| SMTP Port | 2525 |
| Username | smtp_username from app creation |
| Password | smtp_password from app creation |
| Encryption | None (for internal/local use) |
| Auth | Required (LOGIN or PLAIN) |
Client configuration examples
Generic SMTP settings
Host: seesee.example.comPort: 2525Username: my-appPassword: (smtp password from app creation)Auth: LOGIN or PLAINTLS: None (use a reverse proxy for TLS)Python (smtplib)
import smtplibfrom email.mime.text import MIMEText
msg = MIMEText("Hello from Python!")msg["Subject"] = "Test Email"msg["From"] = "app@example.com"msg["To"] = "user@example.com"
with smtplib.SMTP("seesee.example.com", 2525) as server: server.login("my-app", "smtp-password-here") server.send_message(msg)PHP (mail function with SMTP)
Using PHPMailer (most common PHP SMTP library):
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);$mail->isSMTP();$mail->Host = 'seesee.example.com';$mail->SMTPAuth = true;$mail->Username = 'my-app';$mail->Password = 'smtp-password-here';$mail->Port = 2525;$mail->SMTPSecure = false;$mail->SMTPAutoTLS = false;
$mail->setFrom('app@example.com', 'My App');$mail->addAddress('user@example.com');$mail->Subject = 'Test Email';$mail->Body = '<h1>Hello!</h1>';$mail->AltBody = 'Hello!';
$mail->send();Node.js (Nodemailer)
const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({ host: "seesee.example.com", port: 2525, secure: false, auth: { user: "my-app", pass: "smtp-password-here", },});
await transporter.sendMail({ from: "app@example.com", to: "user@example.com", subject: "Test Email", text: "Hello from Node.js!", html: "<h1>Hello from Node.js!</h1>",});Troubleshooting
Connection refused
- Verify port 2525 is exposed:
docker run -p 2525:2525 ... - Check that
SEESEE_SMTP_ENABLED=true - If connecting from another container, use the host IP or Docker network name, not
localhost - Check firewall rules allow connections on port 2525
Authentication failed
- SMTP credentials are per-app — make sure you’re using the right app’s credentials
- Credentials are shown only once at app creation. If lost, create a new app
- SeeSee supports LOGIN and PLAIN auth mechanisms
Emails not appearing
- Check SeeSee logs for parsing errors:
docker logs seesee - Verify the SMTP user/password match a registered app
- Check the app’s
body_storage_mode— inpreviewmode, bodies are truncated to 500 characters