Maddy - 开箱即用的邮件服务端

项目地址: https://github.com/foxcpp/maddy

其实自己已经用了一段时间啦, 拖到现在才写这么一篇推荐

当时自建邮局的主要动力就是, mailgun 一再减少免费配额, 到了不够用的地步

多方查找, 发现了这个十分符合需求的项目, 一体化, 较 postfix 配置更为简单. 由 go 编写, 效率较高

在继续之前, 请做好如下准备:

  • 一个可信度较高的顶域的域名[1]
  • 一台可以设置 rDNS 并且未封禁 25 端口通讯的服务器[2]
  • 一个可以设置 mx 及 txt 记录的域名解析服务

其他需要注意的地方:

  • 无特别说明服务器配置全程均在 fedora 系统的 root 权限下操作
  • 用到的第三方工具: nginx, python3-certbot-nginx, zstd, wget, cronie

安装

这里将使用官方提供的预编译二进制文件直接进行部署, 你也可以从源码编译或是使用官方 docker 镜像
首先从这里获取预编译版本, 截至发稿最新版本为 0.5.4

#下载预编译二进制文件
$ wget https://maddy.email/builds/0.5.4/maddy-0.5.4-x86_64-linux-musl.tar.zst -O maddy.tar.zst

#解压(因是 .zst 格式, 需要 zstd 支持)
$ tar --use-compress-program=unzstd -xf maddy.tar.zst

复制相关配置, 安装 maddy 本体

$ cd maddy

#拷贝 systemd 文件
$ cp systemd/* /etc/systemd/system/

#重载 systemd
$ systemctl daemon-reload

#建立 maddy 配置文件文件夹并放入默认配置
$ mkdir -p /etc/maddy
$ cp maddy.conf /etc/maddy/

#安装 maddy 本体
$ cp maddy /usr/local/bin/
$ cp maddyctl /usr/local/bin/

为了安全起见, 你需要建立一个专有用户用于运行 maddy

$ useradd -mrU -s /sbin/nologin -d /var/lib/maddy -c "maddy mail server" maddy

配置

接下来需要对 maddy 进行配置, 使用你喜欢的编辑器编辑 /etc/maddy/maddy.conf

#这里以本站为例, 将此行更改为 mx1.+你的域名
$(hostname) = mx1.kyaru.xyz
#这里更改为你的域名
$(primary_domain) = kyaru.xyz

如果你需要同时作为其他域名的邮件服务器

#请在此行末尾添加需要的域名
$(local_domains) = $(primary_domain) example.wisecat.xyz example.drawoceans.com

DNS 记录

正确设置 DNS 记录对于邮件服务器来说极为重要, 这里以 Cloudflare 和我的 blog 域名为例

首先为一级域名添加 A 记录, 如果有 IPv6 可以同时设置 AAAA 记录 (已设置的请跳过)

然后设置 MX 记录, 这将告知谁来处理送至该域名上的邮件

同样, 请为 mx1 域名设置 A 记录及 AAAA 记录, 如果与一级域名为相同服务器可以直接 CNAME 至一级域名

随后添加基于 TXT 记录的 SPF 记录 (注意请不要直接使用 SPF 记录, 在不久之后会被淘汰)

这将允许该域名下所有 MX 记录的服务器使用该域名身份进行发信

TLS 证书

接下来需要获取 TLS 证书, 这里以 certbot 通过 nginx 自动获取证书为例, 如果已有证书或是使用 certbot 之外的工具获取, 请修改 /etc/maddy/maddy.conf 中的 tls file

编辑 nginx 配置 /etc/nginx/nginx.conf (如果使用 debian 或者 ubuntu, 请编辑 /etc/nginx/site-available/default)

...
server {
    ...
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _ mx1.kyaru.xyz; #在这里添加你的 mx1 域名
    ...
    }
...

然后使用 certbot 申请 mx1 域名证书

#这里的邮箱用于接收证书过期警告
$ certbot certonly --nginx --email <你的邮箱>

随后按照提示进行申请

最后配置证书权限, 使 maddy 有权读取证书 (此步骤同样需要在每次重新获取证书后执行)
如需自动化请查看附录

$ setfacl -R -m u:maddy:rX /etc/letsencrypt/live/

使用

首先启动 maddy 服务

$ systemctl enable --now maddy.service

如无报错, 执行以下命令创建新的邮箱用户

#这里请替换为自己需要创建的邮箱
$ maddyctl creds create i@kyaru.xyz
#然后根据提示输入密码

#同时创建本地存储账户, 用户名请与上方保持一致
$ maddyctl imap-acct create i@kyaru.xyz

大功告成! 你可以使用你喜欢的邮件客户端进行连接
还是不能用? 可以看看附录


[附录]

这里记录着一些可能有用的东西

防火墙相关配置

许多服务器拥有防火墙, 请放行以下端口: 80,443,25,465,587,143,993

证书自动更新

此项依赖 crontab (安装cronie)
使用 crontab -e 指令, 打开编辑界面
输入如下配置

0 0 * * * certbot renew --nginx --reuse-key && setfacl -R -m u:maddy:rX /etc/letsencrypt/live/

这将每日检查证书更新, 并自动设置正确的权限
同时需要关闭 certbot 自己的自动证书更新

$ systemctl stop certbot-renew.timer
$ systemctl disable certbot-renew.timer

测试你的邮件

使用 https://www.mail-tester.com/ 可以快速测试你邮箱的可信程度, 过低的分数可能会导致你的邮件直通其他人的垃圾桶甚至无法送达, 一般7分以上即合格, 但仅做参考.

升级服务端

首先停止 maddy 服务

$ systemctl stop maddy

然后从 https://maddy.email/builds/ 获取最新二进制文件
解压后把 maddymaddyctl 覆盖到 /usr/local/bin

$ cp maddy /usr/local/bin/
$ cp maddyctl /usr/local/bin/

最后启动 maddy 服务

$ systemctl start maddy

DMARC 记录

DMARC(Domain-based Message Authentication, Reporting & Conformance)是txt记录中的一种,是一种基于现有的SPF和DKIM协议的可扩展电子邮件认证协议,其核心思想是邮件的发送方通过特定方式(DNS)公开表明自己会用到的发件服务器(SPF)、并对发出的邮件内容进行签名(DKIM),而邮件的接收方则检查收到的邮件是否来自发送方授权过的服务器并核对签名是否有效。对于未通过前述检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。从而有效识别并拦截欺诈邮件和钓鱼邮件,保障用户个人信息安全。

可以选择添加基于 TXT 记录的 DMARC 记录, 用于接收来自其他邮件提供商的 DMARC 报告

v=DMARC1; p=none; rua=mailto:postmaster@kyaru.xyz

p: 用于告知收件方, 当检测到某邮件存在伪造发件人的情况, 收件方要做出什么处理, reject为拒绝该邮件; none为不作任何处理: quarantine为将邮件标记为垃圾邮件
ruf: 用于当检测到伪造邮件, 收件方须将检测结果发送到哪个邮箱地址

简单的账户管理

#更改密码
$ maddyctl creds password <用户名>

#移除账户
$ maddyctl creds remove <用户名>

#更多用法
$ maddyctl <指令(可选)> -h

参考:

  1. maddy 官方文档 - https://maddy.email/tutorials
  2. DMARC 记录说明(网易) - https://qiye.163.com/help/3338ea.html

注释:
[1]: 一般情况下, 年费较高 (如 10$ 以上) 的域名较为可信, 请不要使用诸如 .tk 的免费域名以及滥用严重的域名如 .top 作为邮件域名, 这将导致你的邮件很容易直通其他人的垃圾桶. 同时, .xyz 域名可信度一般.

[2]: 你可以和我一样购买 terrahost 作为发信服务器, 同时我知道支持的还有 GCP, itldc, Vultr(需发工单). 你也可以自行在搜索引擎上查找.