English · 中文
项目描述:自托管邮件服务器,让个人域名、家用 IPv6/DDNS、Catch-all 邮箱与开放通信重新连在一起。
FuckMail 是一枚写给互联网早期精神的邮件服务器。
在许多服务被平台收拢、账号被产品定义的今天,邮件依然是少数真正属于开放网络的协议:一个域名、一台机器、一条可抵达的地址,就能让一个人重新拥有自己的通信入口。FuckMail 想做的事很朴素:把邮箱从巨大的云端宫殿里搬出来,放回你自己的服务器、迷你主机,甚至家里的电脑上。
它不是试图复刻庞大的企业邮件系统,而是给个人域名、独立开发者、小团队和自托管爱好者准备的一把轻便工具:收下域名里的每一封信,整理它们,签名它们,诊断它们,并让你知道这条通信链路此刻是否安稳。
当前项目仍在迭代中。邮件服务器部署受 DNS、25 端口、PTR/rDNS、运营商策略和收件方信誉规则影响较大。家用 IPv6 很适合收信、自用和实验;正式对外发信通常仍建议配置 SMTP relay。
登录页:
管理面板:
- 把地址还给个人:Catch-all 让
anything@your-domain.com都能抵达你,不必为每一个用途创建一个新账号。 - 让家里的机器重新发光:很多家庭宽带已经具备公网 IPv6。配合 Cloudflare DDNS,家用电脑、NAS、软路由或迷你主机也可以成为一个可被公网找到的邮件入口。
- 不把邮件交给黑箱:邮件正文、附件、队列、证书和配置都在本地,SQLite 单文件存储,备份和迁移都直接。
- 轻量但不粗糙:SMTP、IMAP、Web 管理、DKIM、TLS、DNS 诊断、DDNS、SMTP relay、API Key 都在一个二进制里。
- 承认现实网络的复杂:直发邮件需要端口、PTR/rDNS、信誉和 DNS 共同配合;当环境不理想时,SMTP relay 是务实选择。
- 想为个人域名搭一个自托管邮箱的人。
- 想用
admin@domain、hi@domain、service-name@domain管理不同身份的人。 - 想把家用 IPv6、公网域名和 DDNS 串起来做真实服务的人。
- 想研究邮件协议、投递链路、DKIM、DMARC、IMAP 和 Web 管理界面的人。
- 想保留通信数据所有权,而不是把每封信都交给大型平台的人。
- SMTP 收信:监听 25 端口,接收托管域名邮件。
- SMTP Submission 发信:监听 587 端口,支持登录后提交外发邮件。
- IMAP/IMAPS:通过标准邮件客户端查看邮件。
- 多域名托管:一个实例可托管多个域名,每个域名可独立配置接收策略。
- Catch-all 邮箱:域名下未知收件人可自动入库,也支持精确地址和正则别名规则。
- Web 管理界面:邮件、邮箱、用户、域名、别名、队列、证书、DNS 和 API Key 管理。
- REST API 与 OpenAPI:内置
/api/v1管理 API、中文 API 文档、OpenAPI JSON 和可分配权限范围的 Bearer Token。 - DKIM 签名:配置向导自动生成 DKIM 私钥,并输出 DNS 记录。
- SQLite 存储:邮件正文、原始 RFC822 数据和附件统一保存在本地数据库。
- Cloudflare DNS/DDNS:一键配置邮件 DNS,动态更新家用 IPv6 的 AAAA 记录。
- 投递诊断:检查 MX、A/AAAA、SPF、DKIM、DMARC、PTR 和 IPv6 可行性。
- SMTP Relay:当服务器无法稳定直连远端 MX 25 端口时,可配置第三方 SMTP 中继。
- 单二进制部署:支持 Makefile、Docker、Docker Compose、systemd 服务文件和发布包脚本。
过去,自建服务往往卡在公网 IPv4 上。现在很多家庭网络已经分配公网 IPv6,这让“把服务放在自己家里”重新变得现实。
FuckMail 支持 Cloudflare DNS 与动态 IPv6 DDNS:当家中机器的 IPv6 地址变化时,可以自动更新 mail.example.com 的 AAAA 记录。只要路由器、防火墙和运营商策略允许入站连接,你的家用电脑就可以接收发往自己域名的邮件。
需要诚实说明的是:家宽环境通常不适合直接对外发信。很多收件方会检查 PTR/rDNS、IP 信誉、反垃圾策略和出站 25 端口。FuckMail 因此提供 SMTP relay 配置:收信可以在家里,发信可以走更可靠的中继服务。
- Linux 服务器、VPS、家用电脑、NAS 或迷你主机。
- Go 1.24 或更高版本。
- SQLite CGO 依赖,构建环境需要 C 编译工具链。
- 域名 DNS 管理权限。
- 端口放行:
25、587、143、993、80,按配置可调整。 - 公网 IPv4 或公网 IPv6;家用 IPv6 建议配合 DDNS。
- 发信信誉建议:可配置 PTR/rDNS,或使用 SMTP relay。
常见云服务器会封禁出站 25 端口;家宽和动态 IP 也常缺少可控 PTR/rDNS。这种环境适合收信测试,正式发信建议启用 SMTP relay。
构建二进制:
make build首次运行会进入交互式配置向导:
sudo ./fuckmail向导会询问主域名、附加托管域名、管理员账号、数据目录、DKIM selector、TLS 和端口配置。完成后会生成 config.json,输出 MX、A、SPF、DKIM、DMARC 等 DNS 记录,然后退出。
配置 DNS 并等待生效后,再次启动:
sudo ./fuckmail默认入口:
- Web 管理界面:
http://你的域名/ - API 文档:
http://你的域名/api/docs - OpenAPI JSON:
http://你的域名/api/v1/openapi.json - SMTP 收信:
25 - SMTP Submission:
587 - IMAP:
143 - IMAPS:
993
也可以用环境变量或命令行指定配置文件:
FUCKMAIL_CONFIG=/opt/fuckmail/config.json ./fuckmail
./fuckmail /opt/fuckmail/config.json以 example.com 为例,至少需要:
MX @ example.com priority 10
A @ <服务器公网 IPv4>
A mail <服务器公网 IPv4>
TXT @ "v=spf1 mx -all"
TXT default._domainkey "v=DKIM1; k=rsa; p=<向导输出的公钥>"
TXT _dmarc "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
如果使用 mail.example.com 作为邮件主机,可把 MX 指向 mail.example.com,并给 mail 添加 A/AAAA 记录。Web 管理界面也提供 Cloudflare DNS 一键配置和动态 IPv6 DDNS。
检查命令:
dig MX example.com
dig TXT example.com
dig TXT default._domainkey.example.com默认配置文件为项目目录下的 config.json。该文件包含管理员密码、DKIM 私钥和证书路径,已在 .gitignore 中排除,不要提交到公开仓库。
示例见 config.example.json:
{
"domain": "example.com",
"admin_user": "admin",
"admin_password": "REPLACE_WITH_STRONG_PASSWORD",
"db_path": "/home/user/.fuckmail/mails.db",
"dkim_selector": "default",
"dkim_private_key": "-----BEGIN RSA PRIVATE KEY-----\nREPLACE_WITH_YOUR_DKIM_PRIVATE_KEY\n-----END RSA PRIVATE KEY-----",
"tls_cert_path": "/home/user/.fuckmail/tls.crt",
"tls_key_path": "/home/user/.fuckmail/tls.key",
"auto_tls": true,
"smtp_port": 25,
"imap_port": 143,
"smtps_port": 587,
"imaps_port": 993,
"web_port": 80,
"web_tls": false,
"allowed_domains": ["example.com", "example.net"],
"data_dir": "/home/user/.fuckmail"
}接收邮件:
- 协议:IMAP
- 服务器:你的域名或邮件主机名
- 端口:
993使用 TLS,或143 - 用户名:向导中设置的管理员用户名,例如
admin - 密码:向导中设置的管理员密码
发送邮件:
- 协议:SMTP Submission
- 服务器:你的域名或邮件主机名
- 端口:
587 - 用户名:管理员用户名
- 密码:管理员密码
管理员账户可以用域内任意地址发信,例如 admin@example.com、info@example.com。普通用户只能使用自己的地址发信。
准备配置文件:
cp config.example.json config.json
vim config.json启动:
docker compose up -d --buildCompose 默认把 ./data 挂载到容器内 /opt/fuckmail/data,并把 ./config.json 作为只读配置挂载。真实收信仍需要宿主机公网 IP、25 端口入站放行和正确 DNS。
推荐将发布包解压到 /opt/fuckmail:
VERSION=1.0.0 make package
sudo mkdir -p /opt/fuckmail
sudo tar -xzf dist/fuckmail_1.0.0_linux_$(go env GOARCH).tar.gz -C /opt/fuckmail --strip-components=1
cd /opt/fuckmail
sudo ./fuckmail首次运行完成配置和 DNS 后,安装服务:
sudo cp deploy/fuckmail.service /etc/systemd/system/fuckmail.service
sudo systemctl daemon-reload
sudo systemctl enable --now fuckmail查看日志:
journalctl -u fuckmail -f更多分发说明见 docs/DISTRIBUTION.md。
常用命令:
make build
make test
VERSION=1.0.0 make package项目结构:
cmd/server/ 程序入口
internal/app/ 启动编排
internal/config/ 配置向导、配置加载和校验
internal/smtp/ SMTP 收信和 Submission
internal/imap/ IMAP 服务
internal/outbound/ 外发队列和 SMTP relay
internal/storage/ SQLite 模型和数据访问
internal/parser/ 邮件解析
internal/crypto/ DKIM、TLS、Let's Encrypt
internal/dns/ DNS、Cloudflare 和 DDNS
internal/web/ Web UI 和 REST API
web/static/ 前端静态资源
deploy/ systemd、健康检查和升级脚本
tools/ 测试、打包和压测辅助工具
本项目使用 MIT License,详见 LICENSE。

