搭建私有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,不然减分严重。一般发工单给服务器提供商设置)

请留意端口是否被封锁,要说993/465/143/587都没有被占用封锁,就要留意25端口了。

如果 25 端口无法使用,确实会影响邮件的接收,因为 SMTP 协议的标准要求邮件服务器之间的通信必须通过 25 端口。换端口只能用于 邮件发送 或 用户端(客户端)收取邮件,但并不能解决从其他邮件服务器接收邮件的问题。

查看占用命令(二选一):

lsof -i:端口号
#############
netstat -tulnp | grep 端口号

干净域名一个,似乎.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:xxx.xxx.xxx.xxx(服务器的IP(v4)地址)/32 -all

SPF1

记录值里面的ip4需要更改外上面第一条mx1-A记录的服务器IP地址

之后(安装Linux软件)

开始前检查一下机器的25/465/587/993/143端口有没有被占用以及这些端口有没有被服务器商家屏蔽。
如果被屏蔽,不起作用(IP绿,993/143绿,但是465/587怎么都是红,这样类似的问题)可以通过修改 /etc/maddy/maddy.conf 文件内的配置默认端口解决。

之后安装需要用到的包与下载解压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/local/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

之后 申请证书

没有Nginx/Apache等任何应用占用80端口情况下

现在使用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]

ACME.sh 脚本

这里不作解释,详见官网:Maddy


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 来测试一下邮件服务器。

一直连接中

如果你的服务正常在运行,但是连接不上服务器,就是不报密码错误,就是一直连不上,一直在验证。那大概率是防火墙或者服务器提供商把你25/993/465/143/587端口ban了。除了前者可以放行端口外,后者就只能改端口号了。(狠一点的话会按照协议ban,只能发工单)

配置文件在:/etc/maddy/maddy.conf

在83行前后:
SMTP

在175行前后:
IMTP

更改后,保存并重启maddy就可以生效了。

正常连接

如果使用993/465端口
993/465

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

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

完美,十分。
test

pyzor扣分: PYZOR_CHECK -1.985

出现类似这样的扣分等,大概是你发送的邮件内容太少/单调导致的。
无伤大雅。只要主要的解析记录做好,rDNS做好,基本没有什么问题。


只能发信,无法收信

请留意看文章开头的前置条件

如果 25 端口无法使用,确实会影响邮件的接收,因为 SMTP 协议的标准要求邮件服务器之间的通信必须通过 25 端口。换端口只能用于 邮件发送 或 用户端(客户端)收取邮件,但并不能解决从其他邮件服务器接收邮件的问题。

查看占用命令(二选一):

lsof -i:端口号
#############
netstat -tulnp | grep 端口号

注意!rDNS与Gmail退信。

如果没有设置rDNS可能会扣分高达1.7(一般服务器设置需要发起工单,要求设置)。而且!

而且会被Gmail退信。如果你设置了rDNS也被Gmail退信了,很有可能是IPv6设置rDNS。我直接禁用了服务器的IPv6就解决问题了。

添加 IPv6 支持(AAAA解析记录)

这里不作解释,因为我的服务器IPv6很多,懒得一个个添加/禁用。所以具体设置详见官网解析: Maddy

禁用 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地址返回。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注