Developer tooling
OpenSMTP
Send email from your own machine, and own the reputation
- Role
- Creator and lead developer
- Built with
- Go
- Python
- JavaScript
- SMTP
- DKIM
- MIME
- Docker
A single statically compiled binary that sends email directly, without a cloud email API in the path. It ships inside the client library, is spawned as a subprocess, and speaks the protocol from wherever the code is running.
01
Why it exists
Sending email is a solved protocol that the industry resells as a service. The service is worth paying for when it solves deliverability, and deliverability is an address reputation and DNS problem, not a cloud one.
The uncomfortable part is what the intermediary sees. Every message, every recipient, and every address passes through a third party that keeps records of all of it.
02
What was built
Three sending strategies: direct delivery by mail exchanger lookup, an authenticated relay through a configured server for networks where direct delivery is blocked, and an automatic mode that tries the first and falls back to the second.
Cryptographic signing implemented against the specification on standard library primitives, with a helper that generates the key pair and prints the exact record to publish, because the signing is worthless if the record is wrong.
Correct multipart message construction, attachments, retries with backoff on retryable failures only, layered configuration, and a diagnostic command that explains deliverability rather than merely reporting it.
Client libraries in Python, Node, and Go over one shared wire contract, and a container image for use as a sidecar.
03
Architecture
Three layers with a boundary that is the entire point of the project.
The application layer is the caller's code. They render their own markup with whatever they already use, and hand over a finished string. No template language is imposed, ever.
The client library locates and spawns the binary, then talks to it over loopback. The binary announces the port it is listening on, the library connects, and terminates it when the script ends.
The engine is the binary. It builds the message, looks up the mail exchanger, negotiates encryption, signs, and retries.
Nothing leaves the machine until the binary opens the connection to the outside world. That property is the privacy claim, and every design decision preserves it.
04
My contribution
Creator and lead developer of the engine and all three client libraries.
05
Engineering challenges
Statelessness is a documented position rather than an omission. There is no persistent queue, so a crash mid retry loses the message, and persistence belongs to the caller. Likewise there is no tracking, no analytics, and no callbacks, because each would require the engine to phone home and that would break the one property the project is built on.
06
Result and impact
Free and open source under MIT, with no plan to commercialise it.
07