Featured image of post 搭建私有E-Mail平台:Maddy(ALL in ONE) - 2024年7月更新

搭建私有E-Mail平台:Maddy(ALL in ONE) - 2024年7月更新

之前的方法有了小小变化,因为现在(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自动

A_MX1

添加一条 MX记录 指向上面添加的A记录

类型MX    名称@    mx1.dontalk.org    TTL自动    优先级0

MX

添加一条 TXT记录 记录_dmarc

类型TXT   名称_dmarc    记录值v=DMARC1; p=none; rua=mailto:[email protected]

_DMARC

记录值的最后面,[email protected],决定了我的用户用户名为admin。

再添加一个 TXT记录 记录spf1

类型TXT   名称@    记录值v=spf1 mx ip4:154.19.187.87/32 -all

SPF1

记录值里面的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

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

status

Maddy在第一次启动的时候会生成一个DKIM密钥,所以现在来补充配置一下DKIM的dns解析。

查看下面的文件(域名换成你自己的)获取DKIM密钥:

cat /var/lib/maddy/dkim_keys/dontalk.org_default.dns

内容类似于:

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0......(不换行,很长,别把主机名也复制了)

DKIM

类型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端口 993/465

如果使用143/587端口 143/587

登陆成功后,让我们测试一下邮件得分。 test

完美,十分。 test


注意!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地址返回。

Built with Hugo
Theme Stack designed by Jimmy