之前的方法有了小小变化,因为现在(2024)的 Maddy 已经没了 maddyctl 这个文件。增加用户等命令已经集成到了 Maddy 一个文件中了
什么是Maddy?为何是Maddy(文章受到lala启发:lala.im)
Maddy是一款用Go语言开发的邮件服务器,它实现了运行电子邮件服务器所需的所有功能。
Maddy用一个具有统一配置和最低维护成本的守护进程取代了Postfix、Dovecot、OpenDKIM、OpenSPF、OpenDMARC 等程序。
因为Maddy简单的配置,低配置占用,所有东西都集成一体(ALL IN ONE)。所以我们选择使用Maddy来充当我们的邮件服务器。
需要的:
服务器一台(最好支持rDNS,不然减分严重。一般发工单给服务器提供商设置)
干净域名一个,似乎.com/.org更好。
开始(DNS解析)
我使用CloudFlare来解析DNS,我们添加几个解析指向我们的Maddy服务器。
添加一条 A记录 指向服务器IP
类型A 名称mx1 IPv4 关闭代理 TTL自动
添加一条 MX记录 指向上面添加的A记录
类型MX 名称@ mx1.dontalk.org TTL自动 优先级0
添加一条 TXT记录 记录_dmarc
类型TXT 名称_dmarc 记录值v=DMARC1; p=none; rua=mailto:[email protected]
记录值的最后面,[email protected],决定了我的用户用户名为admin。
再添加一个 TXT记录 记录spf1
类型TXT 名称@ 记录值v=spf1 mx ip4:154.19.187.87/32 -all
记录值里面的ip4需要更改外上面第一条mx1-A记录的服务器IP地址
之后(安装Linux软件)
开始前检查一下机器的25/465/587/993/143端口有没有被占用以及这些端口有没有被服务器商家屏蔽。
之后安装需要用到的包与下载解压Maddy本体。
Maddy的项目地址是:Github - https://github.com/foxcpp/maddy
apt -y update
apt -y install acl zstd wget certbot
wget https://github.com/foxcpp/maddy/releases/download/v0.7.1/maddy-0.7.1-x86_64-linux-musl.tar.zst
unzstd maddy-0.7.1-x86_64-linux-musl.tar.zst
tar -xvf maddy-0.7.1-x86_64-linux-musl.tar
cd maddy-0.7.1-x86_64-linux-musl/
之后创建需要用到的目录,复制相应的文件到对应的目录:
mkdir /etc/maddy
cp maddy.conf /etc/maddy
cp maddy /usr/bin
cp systemd/*.service /etc/systemd/system
maddy不能直接运行在root用户下,务必创建一个单独的,/sbin/nologin
的,不可登录系统的用户:
useradd -mrU -s /sbin/nologin -d /var/lib/maddy -c "maddy mail server" maddy
之后 申请证书
现在使用certbot申请一个SSL证书。
如果服务器上没有 Nginx/Apache(没有任何程序占用80端口)可以直接用certbot内置的web服务器来申请ssl证书:
certbot certonly --standalone --agree-tos --no-eff-email --email [email protected] -d mx1.dontalk.org
如果服务器上有 Nginx 正在运行,那么可以再装一个 certbot的Nginx插件:
apt -y install python-certbot-nginx
## 如若失败,请使用下面命令
apt -y install python3-certbot-nginx
然后新建一个Nginx站点配置文件:
vim /etc/nginx/conf.d/maddy.conf
写入一个最小的Nginx站点配置:
server {
listen 80;
server_name mx1.dontalk.org;
}
然后使用 certbot 的 Nginx插件 来申请SSL证书:
certbot --nginx --agree-tos --no-eff-email --email [email protected]
maddy是没有web客户端的,考虑到有人可能会自己搭建web客户端,比如rainloop这类,所以这里提供了nginx申请证书的方法。
实际上可以直接用本地的客户端,比如thunderbird、foxmail这些。
现在需要配置acl,让maddy这个用户(上面创建的不可登录用户)有权限读取证书:
setfacl -R -m u:maddy:rx /etc/letsencrypt/{live,archive}
## 如若报错无法找到命令:setfacl。那么请先安装:
apt install acl
接下来编辑maddy的配置文件:
vim /etc/maddy/maddy.conf
修改下面列出的配置:
$(hostname) = mx1.dontalk.org
$(primary_domain) = dontalk.org
$(local_domains) = $(primary_domain)
tls file /etc/letsencrypt/live/mx1.dontalk.org/fullchain.pem /etc/letsencrypt/live/mx1.dontalk.org/privkey.pem
## 注意上面这行配置和conf文件中的配置不同,conf配置文件的证书目录在:
## tls file /etc/maddy/certs/$(hostname)/fullchain.pem /etc/maddy/certs/$(hostname)/privkey.pem
## 所以需要更改这一行,否则启动时会提示start request repeated too quickly错误
Maddy的启动与收尾
启动maddy以及设置开机自启:
systemctl enable --now maddy.service
## 如若提示 start request repeated too quickly 错误
## 请保证conf的证书目录是否填写正确,已经成功申请到证书到证书目录。是否配置了ACL使得Maddy可以访问证书。
查看运行状态,确保正常:
systemctl status maddy.service
Maddy在第一次启动的时候会生成一个DKIM密钥,所以现在来补充配置一下DKIM的dns解析。
查看下面的文件(域名换成你自己的)获取DKIM密钥:
cat /var/lib/maddy/dkim_keys/dontalk.org_default.dns
内容类似于:
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0......(不换行,很长,别把主机名也复制了)
类型TXT 名称default._domainkey v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0...... TTL自动
如今,Maddy已经部署好了。
现在可以尝试 添加用户 了
创建一个用户账号,这里的用户名必须是电子邮件的地址
maddy creds create [email protected] ## 创建用户
## 移除账户
maddy creds remove [email protected]
注意用户名是电子邮件地址。这是必需的,因为用户名用于授权 IMAP 和 SMTP 访问
注册用户凭据后,还需要创建本地存储帐户:
maddy imap-acct create [email protected] ## 创建用户
## 移除账户
maddy imap-acct remove [email protected]
最后,登陆与发信
最后使用本地邮件客户端 Thunderbird 来测试一下邮件服务器。
如果使用993/465端口
如果使用143/587端口
登陆成功后,让我们测试一下邮件得分。
完美,十分。
注意!rDNS与Gmail退信。
如果没有设置rDNS可能会扣分高达1.7(一般服务器设置需要发起工单,要求设置)。而且!
而且会被Gmail退信。如果你设置了rDNS也被Gmail退信了,很有可能是IPv6设置rDNS。我直接禁用了服务器的IPv6就解决问题了。
通过 sysctl 禁用 IPv6:
vim /etc/sysctl.conf
添加以下行到文件底部,以禁用 IPv6:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
使更改生效:
sysctl -p
通过 GRUB 禁用 IPv6(如果需要):
编辑 GRUB 配置文件:
vim /etc/default/grub
找到以 GRUB_CMDLINE_LINUX 开头的行,并添加 ipv6.disable=1。例如:
GRUB_CMDLINE_LINUX="quiet splash ipv6.disable=1"
更新 GRUB:
update-grub
重启服务器:
reboot
验证 IPv6 是否已禁用:
检查 IPv6 状态:
ip a
## 找到不到IP命令就用下面的命令
ifconfig
看看还有没有以 inet6 开头的地址。
或者
ip a | grep inet6
## 找到不到IP命令就用下面的命令
ifconfig | grep inet6
看看有没有IPv6地址返回。