轻量级全功能开源免费Mailu邮件服务器部署

发布时间:2024年01月10日

实践说明:基于AlmaLinux9,但适用场景不限于此。
文档形成时期:2023年
因系统或软件版本不同,构建部署可能略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。
因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。

选择Mailu做为邮件服务器的几个考虑

  • 占用资源少而使用成本低;
  • 基本功能相对较全而满足使用;
  • 部署和维护相对简易;
  • 开发者有在积极维护;
  • Maiu2.0可以完全自动化配置新域或添加新用户。有同行提到不支持多域,其实是支持的,之前的一些版本中,应该也是支持多域的,至少部署Mailu2.0后发现确实支持多域。
  • 自主建设拥有更多的可操控性,部署完成后一般维护量比较少。

其实还有一些类似的优秀的邮件服务套件,比如
Axigen Modoboa hMailServer Mail-in-a-Box Zimbra
Apache James
mailcow iRedMail Citadel

尤其推荐考虑下面这几款:
Citadel Modoboa Zimbra mailcow Mailu
Citadel和Modoboa足够全面,可以满足大多数需求。

做为轻量级考虑,本次选择了Mailu。

Mailu的介绍

Mailu 是一个简单但功能齐全的邮件服务器,由一组 Docker 镜像组成。它是免费软件(就像免费啤酒和自由言论一样),欢迎建议和外部贡献。该项目旨在为人们提供一个易于设置、易于维护且功能齐全的邮件服务器,同时不提供专有软件或流行组件中常见的不相关功能。

主要特点包括:
标准电子邮件服务器、IMAP 和 IMAP+、SMTP 和带有客户端自动配置配置文件的提交
高级电子邮件功能、别名、域别名、自定义路由
Web访问、多个Webmail和管理界面
用户特征、别名、自动回复、自动转发、获取帐户
管理功能、全局管理员、公告、每个域委派、配额
安全性、强制 TLS、DANE、MTA-STS、Letsencrypt!、传出 DKIM、防病毒扫描程序、Snuffleupagus、阻止恶意附件
反垃圾邮件、自动学习、灰名单、DMARC 和 SPF、反欺骗
Freedom,所有 FOSS 组件,不包括跟踪器。

硬件环境

参考:https://mailu.io/2.0/compose/requirements.html
Mailu 提供了多架构映像,旨在在 linux/amd64、linux/arm64v8 或 linux/armv7 硬件上运行,因此只要提供足够的电源,它就可以在几乎任何云服务器上运行。

硬件注意事项
应该确保您的硬件(虚拟或物理)与最新的 Linux 内核兼容。所需的最小内存和交换空间为:
使用防病毒软件 (clamav) 时:
3GB内存
1GB 交换空间

实践偿试了1核1G,确实卡住了,不行,真的需要至少3GB内存+1GB交换。

不使用防病毒软件 (clamav) 时:
1GB内存
1GB 交换空间
采用1核2G,能勉强支撑,建议2核2G。

虽然不采用clamav,但是可以启用Oletools,
Oletools scans documents in email attachements for malicious macros. It has a much lower memory footprint than a full-fledged anti-virus.
Oletools 扫描电子邮件附件中的文档是否存在恶意宏。 与成熟的防病毒软件相比,它的内存占用要低得多。

系统环境

由于大多数测试都在 Debian 稳定版上运行,因此建议将其中之一用于基本系统。然而,Mailu 应该能够在任何docker官方支持的发行版上运行。
实践中采用了AlmaLinux9。

存储环境

如果您选择创建专用分区,只需将其安装到 /var/lib/docker. 您还可以创建一个单独的分区(ext4是一个合理的默认分区)并将其挂载以/mailu存储电子邮件数据。
Docker 支持AUFS over ext4和btrfs作为稳定的存储驱动程序。
官方没有提到容量大小,10个账户轻度使用条件下,至少应规划50GB,考虑到其它因素,推荐100GB。

网络环境

Maiu将侦听25、80、110、143、 443、465、587、993和995

如果主机有侦听这些端口,应该禁用,例如,在默认的 Debian 安装上:
apt-get autoremove --purge exim4 exim4-base

Docker 严重依赖iptables端口转发。您应该使用iptables-persistent(或其他系统上的任何等效工具)来管理持久性规则。如果你有足够的勇气切换到 nftables,你将不得不回滚,直到 Docker 发布官方支持或设置你自己的规则集。

实践中采用AlmaLinux9和Firewalld防火墙。

向运营商申请取消电子邮件发送限制

电子邮件服务已经发展很多年了,MTA之间仍然有采用25端口中继,不幸地是,近些年运营商通常默认是禁止25端口通信的,这需要申请,并证明你有足够的能力和措施管控好安全。
据我所知,在某些运营商申请是比较困难的,如果合作比较深,比如消费较高,或另选择非头部运营商,是可能可行的。

域名和解析

设置DNS参考:https://mailu.io/2.0/dns.html#dns-setup
在开始使用 Mailu 之前,您必须至少设置一个域才能接收电子邮件。
A记录:
mail.mydomain.com. IN A a.b.c.d

MX条目:
mydomain.com. IN MX 10 mail.mydomain.com.

PTR记录:
For a mail system, it’s highly recommended to set up reverse DNS as well. That means, if your hostname mail.mydomain.com resolves to a.b.c.d, the IP a.b.c.d should also resolve back to the same hostname.
先设置正向解析,nslookup可查
nslookup mail.mydomain.com
a.b.c.d
然后配置反向 DNS
反向 DNS 必须由 IP 地址的“所有者”(通常是您的托管提供商)设置。大多数情况下你都可以用whois来查找。whois a.b.c.d

host -t PTR a.b.c.d
dig -t PTR a.b.c.d
nslookup -ty=PTR a.b.c.d
nslookup -q=PTR a.b.c.d

如果反向 DNS 设置不正确,大多数邮件系统都会将您的电子邮件视为垃圾邮件而拒绝。

DKIM/SPF 和 DMARC 条目
最后,您需要访问管理仪表板(或使用 cli)来重新生成 DMARC、SPF 和 DKIM 记录。
一旦 DNS 更改传播到您的主机(并且 SSL/域规则设置正确),请访问您的管理仪表板https://example.com/admin/domain/details/example.com。单击重新生成密钥并将所需的记录添加到您的 DNS 提供商。如果您已启用 DKIM/SPF/DMARC 但未添加这些条目,您的邮件可能无法送达。

安装 Docker

Mailu 依赖于一些最新的 Docker 功能。因此,您应该从官方存储库而不是发行版安装 Docker。
Docker 网站有很多关于安装的详细说明。默认配置应该适合Mailu。
此外,如果您计划使用 Compose 风格,则必须按照Docker 网站上的说明安装Compose v2。Compose 是 Docker 的管理工具,特别适合 Mailu 等多容器系统。

#添加仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#安装,To install the latest version, run:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#Start Docker.
sudo systemctl enable docker
sudo systemctl start docker

#Verify that the Docker Engine installation is successful by running the hello-world image.
sudo docker run hello-world

Docker Compose 设置

Mailu 会将其所有持久数据存储在您选择的路径中(默认情况下是/mailu),只需创建目录并移动到那里:
mkdir /mailu
cd /mailu

创建配置文件
Docker Compose 配置存储在名为docker-compose.yml. 此外,Mailu 依赖于一个mailu.env文件来进行各种设置。这两个文件都可以由mailu 设置实用程序(https://setup.mailu.io/2.0/)生成。
信息填写必要说明:
为信息安全,web客户端地址目录(默认是/webmail)、web管理地址(默认是/admin)和API地址(默认是/api)都建议使用随机字符串;
管理员账号可不必变更;
客户端路径/webmail有roundcube和snappymail两个选择,大都推荐前者。

按提示填写相关信息,生成docker-compose.yml和mailu.env后,有提供下载链接,
在大多数情况下,mailu.env的设置可以保持原样。不过,可以通过修改此文件来完成一些高级设置或修改。

编排docker(安装mailu)

docker compose -p mailu up -d

Before you can use Mailu, you must create the primary administrator user account. This should be mgbgld@pumdl.com. Use the following command, changing PASSWORD to your liking:
docker compose -p mailu exec admin flask mailu admin mgbgld pumdl.com PASSWORD

清理(卸载)

如果您发现配置不如意,当前也不存在需要保留的数据,可以清理掉,重头再来
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

创建管理账户

最后,您需要一个管理员用户帐户。
您可以让系统自动创建它:使用环境变量,如管理员帐户 - 自动创建INITIAL_ADMIN_*中所述
否则,如果您不采用自动方式,则需要立即手动创建管理员帐户:

docker compose exec admin flask mailu admin me example.net ‘password’
这将创建一个me@example.net以密码password和管理权限命名的用户。连接到 Web 管理界面并将密码更改为强密码。

至关重要的是,要么存在与POSTMASTER您的mailu.env电子邮件地址相同的用户,要么您在登录后记得用该名称创建一个别名。如果不这样做,就会出现各种奇怪的错误!

使用外部反向代理

参考:https://mailu.io/2.0/reverse.html
所有选项都需要您修改docker-compose.yml和mailu.env文件。
以nginx做为反向代理可参考:https://mailu.io/2.0/reverse.html#have-mailu-web-frontend-listen-locally
实践中,我并没有采用外部nginx,而采用mailu部署的一个具备nginx功能的docker容器。

数据库

默认情况下 Mailu 使用 SQLite 数据库。可以使用替代数据库解决方案,例如 PostgreSQL 和 MySQL/MariaDB。
Mailu 数据库包含静态数据。SQLite足以满足Mailu的任何部署场景。无需使用不同的数据库系统。Mailu开发团队推荐使用SQLite。
实践中,保持默认的SQLite。

升级邮件服务器

可参考:https://mailu.io/2.0/maintain.html#upgrading-the-mail-server
暂未实践

监控邮件服务器(日志查看)

参考:https://mailu.io/2.0/maintain.html#monitoring-the-mail-server
cd /mailu; docker compose logs
动态显示最后100行:docker compose logs --tail=100 -f
显示最后100行:docker compose logs --tail=100

管理外部 Let’s Encrypt 证书

参考:https://mailu.io/2.0/maintain.html#managing-of-external-let-s-encrypt-certificates
当您不使用letsencryptMailu 的嵌入选项时,您无法在目录中使用它的符号链接功能letsencrypt/live。您应该注意,每次续订后,都会将新证书复制到容器中/mailu/certs,并重新加载容器中的nginx进程。front

对于certbot,您可以编写一个脚本作为部署钩子执行。例子:
#!/bin/sh
cp /etc/letsencrypt/live/domain.com/privkey.pem /mailu/certs/key.pem || exit 1
cp /etc/letsencrypt/live/domain.com/fullchain.pem /mailu/certs/cert.pem || exit 1
docker exec mailu-front-1 nginx -s reload

您将在 crontab 中使用的 certbot 命令如下所示:
52 0,12 * * * root /usr/bin/certbot renew --deploy-hook /path/to/script.sh

Mailu可能会自动续签SSL证书,实践中,因为在内网,必须采用外部方案续签,或者叫更换证书,但没有采用certbot,而采用acme方案,自动定期更换SSL证书和重载HTTP服务,注意更换证书有好几个地方,假设证书已经获取并拷贝到/mailu/certs/letsencrypt/archive/mailu/目录,示例如下:

cd /mailu/certs/letsencrypt/archive/mailu/; mv -f domain.com.key privkey1.pem; mv -f fullchain.cer fullchain1.pem; mv -f ca.cer chain1.pem; mv -f domain.com.cer cert1.pem; /bin/cp -ap * ../mailu-ecdsa/; /bin/cp -ap fullchain1.pem ../../live/mailu/nginx-chain.pem; /bin/cp -ap fullchain1.pem ../../live/mailu-ecdsa/nginx-chain.pem; docker restart mailu-front-1

这可以写到自动计划任务里面去。
后面会单独整理acme跨机全自动实现SSL证书续签的文档。
关于ACME方案的中文帮助:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E

网络管理界面

当在设置实用程序中启用管理 GUI 或通过在mailu.env中手动设置ADMIN=true时,默认情况下通过 URL
(https://domain.com/admin) 访问管理 GUI 。前面若修改了uri地址,这里要做相应的变更。要登录管理 GUI,请输入用户的电子邮件地址和密码。
多域支持:
Mailu支持多域

垃圾邮件过滤

https://mailu.io/2.0/antispam.html#spam-filtering
Mailu 使用 Rspamd 进行垃圾邮件过滤。Rspamd 是一个快速、免费、开源的垃圾邮件过滤系统。
Rspamd 拒绝不合规的电子邮件和包含病毒的电子邮件。在Mailu中,Rspamd使用从0到15的评分范围。以下值是默认值,可以在Rspamd WebUI内的选项卡配置下进行更改:
分数为 15 或更高的电子邮件将被拒绝。
分数为 6 或更高的电子邮件将收到带有垃圾邮件分数的标头。
分数为 4 或更高的电子邮件将被列入灰名单。
分数为 3 或更低的电子邮件将被接受。

下面是反垃圾邮件功能统计图:
Mailu的webmail(roundcube)

测试

邮件可信任测试

在线测试网站:https://www.mail-tester.com/

迁移(备份)实例

SMTP 协议具有嵌入式重试机制和可以服务于单个域的多个 MX,因此大多数迁移过程或维护过程不需要任何特定的照顾。

Mailu 严重依赖文件来存储所有内容,这有助于基于文件同步执行的迁移过程。

建议的迁移过程包括设置一个新的备份服务器来删除传入的电子邮件(Mailu 未启动的)、同步两个服务器、停止主服务器并启动备份服务器。然后,备份服务器切换为主 MX,并删除旧服务器。

步骤:

  • 准备好你的新服务器,将你的docker-compose.yml、.env、基本配置文件复制到服务器上,这样就可以开始配置Mailu了,不要启动Mailu
  • 设置您的 DNS,使备份服务器成为该域的额外的、优先级较低的 MX;如果您服务多个域,这可能会很复杂,在这种情况下,您可以简单地接受某些远程 MX 将重试几分钟,跳过此步骤
  • 当您的 DNS TTL 过期并且您的修改传播时,开始将您的data,dkim,mail等,同步到新服务器,重复直到仅同步几个文件。
  • 在旧服务器上停止Mailu,并在没有进程写入文件时最后运行一次rsync。
  • 在新服务器上启动Mailu,生产应该恢复正常。
  • 将您的新服务器设置为域的主MX,如果您没有设置其他MX,请确保您更改的MX、A、AAAA记录正确。

基于上述迁移步骤,可以做成一个备份恢复方案。

另一个备份恢复方案是,备份所有容器,导出,导入,恢复数据,启动容器实例,相应的解析变更。

邮件客户端

推荐一款,thunderbird,开源免费
官网:https://www.thunderbird.net/zh-CN/
android端:K-9 Mail,https://play.google.com/store/apps/details?id=com.fsck.k9

thunderbird的IMAP功能说明

在同步和存储功能中,勾选“在此计算机上保留此账户所有文件夹中的消息”,那么,
一封邮件下载到 Thunderbird 并且在 Thunderbird中被删除。(这封邮件一定会从本地计算机和邮件服务器中都被删除)
每当 Thunderbird 启动时,它会检查 Thunderbird 邮件库和邮件服务器之间的同步状态,然后执行必要的同步(比如从服务器下载新邮件,从服务器删除本地已经删除的邮件等)。

如果要在本地一直保留,或在云端一直保留,应该改用POP3。

文章来源:https://blog.csdn.net/ynz1220/article/details/135458423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。