Skip to content

xleis/FuckMail

Repository files navigation

FuckMail

Go License Repo Self Hosted IPv6 DDNS

English · 中文

项目描述:自托管邮件服务器,让个人域名、家用 IPv6/DDNS、Catch-all 邮箱与开放通信重新连在一起。

FuckMail 是一枚写给互联网早期精神的邮件服务器。

在许多服务被平台收拢、账号被产品定义的今天,邮件依然是少数真正属于开放网络的协议:一个域名、一台机器、一条可抵达的地址,就能让一个人重新拥有自己的通信入口。FuckMail 想做的事很朴素:把邮箱从巨大的云端宫殿里搬出来,放回你自己的服务器、迷你主机,甚至家里的电脑上。

它不是试图复刻庞大的企业邮件系统,而是给个人域名、独立开发者、小团队和自托管爱好者准备的一把轻便工具:收下域名里的每一封信,整理它们,签名它们,诊断它们,并让你知道这条通信链路此刻是否安稳。

当前项目仍在迭代中。邮件服务器部署受 DNS、25 端口、PTR/rDNS、运营商策略和收件方信誉规则影响较大。家用 IPv6 很适合收信、自用和实验;正式对外发信通常仍建议配置 SMTP relay。

项目截图

登录页:

FuckMail 登录页

管理面板:

FuckMail 管理面板

为什么是 FuckMail

  • 把地址还给个人: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@domainhi@domainservice-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 服务文件和发布包脚本。

IPv6 与家用部署

过去,自建服务往往卡在公网 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 管理权限。
  • 端口放行:2558714399380,按配置可调整。
  • 公网 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

DNS 配置

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.cominfo@example.com。普通用户只能使用自己的地址发信。

Docker

准备配置文件:

cp config.example.json config.json
vim config.json

启动:

docker compose up -d --build

Compose 默认把 ./data 挂载到容器内 /opt/fuckmail/data,并把 ./config.json 作为只读配置挂载。真实收信仍需要宿主机公网 IP、25 端口入站放行和正确 DNS。

systemd 部署

推荐将发布包解压到 /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

About

Lightweight self-hosted mail server with SMTP/IMAP, catch-all mailboxes, multi-domain hosting, Web admin, DKIM/TLS, DNS diagnostics, Cloudflare DDNS, and SMTP relay.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors