docker方式部署stalwart邮件服务器
服务端部署
根据官网的技术文档步骤进行:https://stalw.art/docs/install/docker
首先开放防火墙25端口并且测试服务器的25端口能否正常通信,如果不能通信则自行发工单给服务商申请解封25端口
测试入站流量:telnet 你的服务器公网IP 25
正常通信的情况会有类似输出
Trying 你的服务器IP...
Connected to 你的服务器IP.
Escape character is '^]'.
220 mx.domain.com Stalwart ESMTP at your service
测试出站流量:telnet smtp.gmail.com 25
正常通信的情况会有类似输出
Trying 142.251.8.109...
Connected to smtp.gmail.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP 41be03b00d2f7-b15faded629sm5838640a12.63 - gsmtp
邮件的SSL部署方式分为两种:
使用stalwart内置的ACME providers自动申请
使用nginx反代
根据需要修改以下代码的443端口映射;新建一个文件夹用于存放stalwart服务器数据,文件夹内新建docker compose文件,填入以下内容并启动服务:
version: '3.9'
services:
mail-server:
image: 'stalwartlabs/mail-server:latest'
container_name: stalwart-mail
ports:
- '995:995'
- '110:110'
- '4190:4190'
- '993:993'
- '143:143'
- '465:465'
- '587:587'
- '25:25'
- '8080:8080'
- '443:443'
restart: always
volumes:
- ./data:/opt/stalwart-mail
设置rDNS,一般在服务器托管商的控制面板中可以自行设置,如果找不到设置位置可以发工单询问,例如使用mx.domain.com
作为邮件服务的主机名,那么rDNS则设置为同样的域名即可,一般需要最多24小时生效,可以使用代码测试是否生效dig -x 你的服务器IP
会有类似输出
; <<>> DiG 9.18.30-0ubuntu0.20.04.2-Ubuntu <<>> -x 你的服务器IP
;; global options: +cmd
......
......
;; ANSWER SECTION:
....... 21600 IN PTR mx.domain.com.###这里的域名与设置的相同,则是rDNS生效
服务端设置
设置中涉及到域名的项目,均以domain.com做示例,根据自己的域名修改;
登录
键入代码查看stalwart服务端日志:docker logs stalwart-mail
,得到的输出中包含管理员用户和密码,记录下来;
日志中的管理员用户是后备管理员,目前版本不支持网页端修改密码和设置两步验证,完成账号初始化设置后,需要在配置文件中注释掉后备管理员账户字段;
打开IP:8080进入管理后台登录页面
若是不慎忘记密码:
删除stalwart数据重新部署
修改配置文件重置密码
stalwart的密码是以SHA-512的哈希算法加密存储在配置文件中,配置文件位于你的stalwart服务器数据映射路径/data/etc/config.toml
;
使用代码生成SHA-512加密的密码openssl passwd -6 123456
这里将会生成123456这个密码的SHA-512哈希值;
配置文件中找到类似下方代码的数据,把刚生成的密码哈希值替换掉authentication.fallback-admin.secret的值$6$MM1wz ...
,保存文件并重启容器,就可以使用刚定义的密码登录管理后台
authentication.fallback-admin.user = "admin_fallback"
authentication.fallback-admin.secret = "$6$MM1wz ..."
设置
配置主机名和邮件域
域名托管商解析一条A记录,mx.domain.com
用作主机名
导航路径:Settings - Server - Network
参考下图,hostname字段填入主机名,其余保持默认,点击Save & Reload按钮,保存并重载
导航路径:Management - Directory - Domains
新建一个邮件域记录填入根域名,根域名必须有解析的IP,如果暂时没打算使用根域名,可以解析到127.0.0.1
保存之后点击相应域名右侧的...
,点击View DNS records,根据网页内容,在域名托管商填写对应的条目
内容标题包含Type Name Contents,其中以Contents在cloud flare中的填写方式举例:
0 1 993 分别顺序对应优先级、权重、端口,最后的是内容,TLSA类型的填写方式也相同
内置ACME providers申请证书
若是不使用nginx反代参考以下方式申请证书
导航路径:Settings - TLS - ACME providers
假设域名托管在cloud flare,参考下图方式填入对应信息,托管在其他服务商则自行研究或者使用nginx反代方式;
填写完信息以后点击Save & Reload按钮,保存并重载
使用nginx反代
证书可以通过现代化的Linux管理面板轻松申请,以1panel面板为例,申请证书的时候勾选推送证书到本地目录,目录填入stalwart的数据映射文件夹,例如推送到你的stalwart数据映射文件夹路径/data/etc
导航路径:Settings - TLS - certificates
Certificate Id填入证书名称,可以自定义,建议直接使用根域名作为名称比较方便记
Certificate填入推送到stalwart数据映射文件夹的证书路径,这里需要填写docker容器内部的路径,如果你同样推送到etc文件夹内,那么路径可以填写为
%{file:/opt/stalwart-mail/etc/fullchain.pem}%
,推送到其他位置的,自行在docker容器内确定证书路径Private Key同样操作
%{file:/opt/stalwart-mail/etc/privkey.pem}%
勾选Default certificate并且点击Save & Reload按钮,保存并重载
导航路径:Settings - Server- Listeners
找到443端口的项目,把端口修改成映射到宿主机的相同端口,点击Save & Reload按钮,保存并重载
创建一个网站,网址使用mx.domain.com
配置反向代理到8080端口,这时候web端的管理后台即可通过https访问,邮件收发服务也同样通过网页的SSL证书进行认证
其他设置
导航路径:Settings - SMTP - Reporting
Default Domain字段填入
mx.domain.com
并且点击Save & Reload按钮,保存并重载SMTP - Outbound - IP Strategy字段修改为
ipv4_only
并且点击Save & Reload按钮,保存并重载
添加用户
导航路径:Maintenance - Directory - Accounts
首先添加一个管理员用户:
Login name是作为登录用户名
Email字段指定改用户的电子邮件,例如
admin@domain.com
切换到Authentication,设置密码
切换到Permissions,给该账号赋予管理员权限,点击+ Assign roles,把所有能给的权限都添加上
用新建的管理员账户登录试一试,测试看看权限是否异常,若无异常则禁用后备管理员账户
打开配置文件你的stalwart服务器数据映射路径/data/etc/config.toml
,找到以下两个字段,删除或者添加一个#符号,完成以后保存并重启stalwart容器即可
authentication.fallback-admin.user = "admin_fallback"
authentication.fallback-admin.secret = "$6$MM1wz ..."
配置邮件访问
以邮件客户端为例:
用户名:后台设置的Login name
邮箱:Email字段
密码:分两种情况,如果该用户没有启用两步验证,则可以直接使用设置的密码;反之则需要在后台生成app专用密码进行登录,路径:右上角用户头像 - Account - App Passwords
IMAP服务器:mx.domain.com,如果需要填端口建议使用993 SSL加密端口,也可以使用非加密的143端口
SMTP服务器:mx.domain.com,如果需要填端口建议使用465 SSL加密端口,也可以使用非加密的587端口
测试邮件得分
确保邮件服务器得分尽可能达到10分满分,这样子发送的邮件不容易进入垃圾箱,测试网址:https://www.mail-tester.com/?lang=zh
向网页提供的邮箱地址发送一封邮件,点击查看得分
由于本站使用的是纯数字域名,必须被扣1.1分,我也是无语了,来自SpamAssassin的警告:PDS_NAKED_TO_NUMERO Naked-to, numberonly domain