祝大家在2025年新年快乐,身体健康,万事顺利!
Stalwart Mail 是一套使用内存安全的Rust语言编写的邮件服务器程序。Stalwart拥有极其强大且可定制的功能性。它优异的性能和可拓展性使其成为了这两年来国外最热门的开源邮件服务器系统之一。这也是我自己目前主要使用的邮件服务器系统。
这里列举一些Stalwart Mail非常实用的功能和特性:
- Rust编写的SMTP, IMAP, JMAP服务器
- DMARC / TLS聚合报告的自动整理归纳与报表投递和分析
- SMTP Inbound/Outbound Header/Body 重写,地址重写
- 基于贝叶斯分析的垃圾邮件过滤以及识别训练,支持对接其他反垃圾和防毒
- 精细的邮件队列控制,详细的投递与接收路由日志与报表
- 极其精细的内部权限控制,以及对接OAuth, OIDC, OpenLDAP, 等等
- Milter filters/MTA hooks的轻松集成
- 原生支持集群部署,支持Redis, ElasticSearch整合,支持多种数据后端比如RocksDB, FoundationDB, MySQL, PostgreSQL, SQLite, S3块储存,等等
- 支持自定义宏和可编程的配置文件
- 邮件加密,等等
Stalwart Mail的安装看似非常简单,但它的使用和维护需要较多的邮件服务器和Linux相关经验,不建议新手使用;Mail-in-a-box和Poste.io是更友好的解决方案。如果您已经对邮件服务器有一定的了解,那么Stalwart Mail会给您全新的使用体验。
今天我将介绍最简单的单服务器的Stalwart-mail安装与配置。本文作者为香菇肥牛,原文链接为https://qing.su/article/stalwart-mail-single-server-nginx.html, 转载请注明原文链接。谢谢!
1. 搭建开始前的准备
之前说过,Stalwart-Mail的配置与使用比较复杂,这里我将默认您有一定的邮件基础,因此对于DNS等步骤将会粗略带过。
Stalwart-Mail支持各种数据后端。对于单服务器部署来说,使用RocksDB作为数据和邮件储存是性能最优的方案。本文中我们将使用RocksDB作为数据后端。在之后的文章中,我还将介绍MySQL/PostgreSQL的使用以及接入ElasticSearch与Redis, 这些对于单节点的部署来说都不是关键的。
单节点基于RocksDB的Stalwart-Mail部署仅需要250MB左右的内存。您需要一台512 MB或者更多内存的Linux服务器。我这里使用的是Debian 12操作系统;如果您使用其他的操作系统,则后续的部分Linux命令会有所差异,您需要自行调整。
搭建之前,您需要确保服务器的25端口没有阻断。可以使用下面的命令来查看。
1 | telnet smtp.aol.com 25 |
如果收到类似 220 smtp.mail.yahoo.com ESMTP ready 的回复,说明25端口正常,可以发信。如果超时,且防火墙没有禁止25端口,则说明25端口被阻断。
然后,请初步配置好您的DNS,这里以主机名mx.qing.su, IP地址12.34.56.78为例。请注意,这里我额外解析了一个子域名mail.qing.su, 这个子域名将用来搭建网页邮箱。如果您不需要网页邮箱(只用客户端),可以不添加这条记录。
记录类型 | 前缀 | 解析地址 | 其他 |
A | mx | 12.34.56.78 | |
MX | @ | mx.qing.su | 优先级 10 |
TXT | @ | v=spf1 a mx -all | |
TXT | mx | v=spf1 a -all | |
TXT | _dmarc | v=DMARC1; p=reject; rua=mailto:postmaster@qing.su; ruf=mailto:postmaster@qing.su | 根据需要指定这个邮箱地址 |
CNAME | mta-sts | mx.qing.su | 可选 |
CNAME | autoconfig | mx.qing.su | 可选 |
CNAME | autodiscover | mx.qing.su | 可选 |
CNAME | mx.qing.su | 可选 (用于Webmail) |
DKIM等其他记录需要在服务器搭建完毕之后才能添加。
如果您的根域名(比如这里的qing.su)没有指向任何地址(没有做网站),那您还需要给根域名设置一条任意的A记录或者ALIAS记录。您可以将域名指向您的邮件服务器地址,或者指向127.0.0.1。根域名的A记录是否有设定与部分收件服务器的垃圾邮件判定有关。
同时,请在你的服务器提供商处设置好Reverse DNS, 将IP地址12.34.56.78解析到mx.qing.su.
2. 安装Stalwart Mail Server并初步配置
我们直接用官方的安装包。
1 2 | curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh bash install.sh |
服务器将会安装在/opt/stalwart-mail目录。约一分钟后,您会看到类似于下面的显示,说明安装完毕。安装时会自动生成一个临时的管理员密码,请复制下来,之后可以更改。
此时,我们来到http://mx.qing.su:8080, 使用admin用户名和刚刚生成的密码登录管理后台,并进行一些初步的配置。
点击右上角的小人图标 – Account – Change Password, 设置一个管理员密码。
Stalwart-Mail的后台管理分为Settings和Management两部分,在左下角可以切换。
进入Settings,找到Server – Network, 在Hostname中填入您的服务器名,我这里是mx.qing.su. 这里填入的hostname将作为EHLO的hostname.
再找到Listeners, 将https listener的端口改为8443 (或者其他高位端口). Stalwart-mail支持自行管理https, 也可以用额外的服务器程序来反代。由于我们还要安装Webmail, 因此使用服务器程序反代是比较简单的做法。这里将443改为8443避免端口冲突。
找到左侧SMTP – Reporting, 在Outbound Report Settings中填入您自己的默认域名,避免发出的报表邮件进垃圾箱。
然后,找到左侧SMTP – Outbound – Routing, 将IP Strategy从ipv4_then_ipv6改为ipv4_only.
回到SSH, 重启Stalwart-mail服务,使所有配置生效。
1 | service stalwart-mail restart |
到这里,我们完成了初步的Stalwart邮件服务器的配置。接下来,我们要配置Nginx反代服务器,并生成Let’s Encrypt证书。
3. 安装Nginx反代服务器
在上一节中我们提到过,需要安装Nginx来反代Stalwart-mail的管理后台,以及后面安装的网页邮件程序。以Debian为例,执行:
1 | apt-get install nginx python3-certbot-nginx -y |
然后新建一个Nginx配置文件/etc/nginx/conf.d/stalwart.conf,填入下面的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | server { listen 80; listen [::]:80; server_name autoconfig.qing.su autodiscover.qing.su mta-sts.qing.su mx.qing.su; access_log /var/log/nginx/stalwart_access.log; error_log /var/log/nginx/stalwart_error.log; location / { proxy_pass http://127.0.0.1:8080/; proxy_buffering off; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Connection $http_connection; } } |
将上述域名中的qing.su替换为您自己的域名。然后,测试并重新载入Nginx.
1 2 | nginx -t service nginx reload |
接着,部署Let’s Encrypt安全证书。
1 | certbot --nginx --redirect --staple-ocsp -d mx.qing.su -d mta-sts.qing.su -d autoconfig.qing.su -d autodiscover.qing.su |
如果没有问题,您将看到类似下面的提示:
1 2 3 4 | Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/mx.qing.su/fullchain.pem Key is saved at: /etc/letsencrypt/live/mx.qing.su/privkey.pem This certificate expires on 2025-04-20. |
请暂时复制一下这两个文件的地址,之后还会用到。
然后,给Let’s Encrypt证书的储存路径设置读取权限,这样Stalwart-Mail可以读取。
1 2 | chmod -R 755 /etc/letsencrypt/live/ chmod -R 755 /etc/letsencrypt/archive/ |
至此,我们安装配置好了Nginx和Let’s Encrypt安全证书。接下来,让我们回到Stalwart Mail Server, 进行后续的配置。
4. 配置Stalwart Mail Server
我们已经配置好了Nginx, 因此可以直接用https://mx.qing.su访问管理后台了。用管理员账户登录后,默认会进入Management部分。点击左侧Directory – Domains, 添加第一个域名,比如我这里可以添加qing.su.
然后点击域名右边的三个点,点击View DNS Records,查看DKIM Key.
我们之前已经配置好了MX, SPF, DMARC, 剩下的只有DKIM和一些其他的可选记录。请根据系统生成的DKIM Key配置好DKIM记录(Stalwart-Mail生成了两条DKIM记录,都需要配置)。您也可以根据需求配置_mta-sts TXT记录,各种SRV记录。如果您设置了DNSSEC,也可以配置TLSA记录。如果您不清楚每条记录是干啥的,那把所有的都配置好就行。
然后,我们来新建邮箱用户。找到Directory – Accounts, 点击Create Account, 可以新建邮箱。
如果需要,您可以加一条@qing.su的邮箱别名,作为catch-all邮箱。输入邮箱信息之后,请切换到第二个Authentication栏,输入密码设置。
设置好域名和用户信息后,我们还要配置给Stalwart邮件服务器配置SSL. 之前我们已经通过Certbot给Nginx反代的管理后台配置了https访问。而邮件服务器本身也需要安全证书来运行,比如SMTP的提交和收发等等。我们需要配置Stalwart邮件服务器调用之前签发的Let’s Encrypt安全证书。
在Stalwart后台,点击左下角的Settings, 找到Server – TLS – Certificates, 添加之前签发的Let’s Encrypt证书。Certificate ID可以随便填写,我这里直接填上域名qing.su. Certificate和Private Key需要填写之前Let’s Encrypt签发的地址,并且用%{file:}包裹。我这里填写的是 %{file:/etc/letsencrypt/live/mx.qing.su/fullchain.pem}% 和 %{file:/etc/letsencrypt/live/mx.qing.su/privkey.pem}%,如下图。
点击Save & Reload. 最后,重启Stalwart服务器,使得配置生效。
1 | service stalwart-mail restart |
支持,Stalwart Mail Server单节点的部署已经完成了,您可以用客户端程序登录账户进行邮件收发了。
5. 搭建Webmail
Stalwart Mail Server不包含网页邮件系统。如果您不想用客户端收发,就需要再安装一个网页邮件客户端。您可以自行选择安装Roundcube, SnappyMail, Rainloop, Horde, SquirrelMail, SOGo, Afterlogic, 等等程序。这里我将使用轻量且功能全面的SnappyMail作为演示。
首先安装PHP和必要的组件,这里直接用apt安装了。您也可以自行编译安装。
1 2 | apt-get install php8.2 php8.2-fpm php8.2-gmp php8.2-dev php8.2-opcache php8.2-bcmath php8.2-gnupg php-json php8.2-sqlite3 php8.2-tidy php8.2-curl php8.2-mbstring php8.2-intl php8.2-imagick php8.2-xml php8.2-zip php-pear php8.2-ldap bzip2 zip unzip imagemagick libxml2 tidy libsodium23 libapache2-mod-php8.2- uuid-dev -y pecl install uuid |
更改PHP文件上传大小。编辑文件/etc/php/8.2/fpm/php.ini,将下面两行
1 2 | upload_max_filesize = 2M post_max_size = 8M |
改成:
1 2 | upload_max_filesize = 50M post_max_size = 50M |
同时在文件末尾加上
1 | extension=uuid.so |
重启PHP-FPM.
1 | service php8.2-fpm restart |
然后开始安装Snappymail. 直接从Github下载安装包。
1 2 3 4 5 | cd /var/www/html wget https://github.com/the-djmaze/snappymail/releases/download/v2.38.2/snappymail-2.38.2.tar.gz tar zxvf snappymail-*.tar.gz rm snappymail-*.tar.gz mv _include.php include.php |
编辑文件include.php, 设置数据路径。
1 |
保存退出后,执行:
1 2 3 | mkdir /var/www/snappydata chown -R www-data:www-data /var/www/snappydata chown -R www-data:www-data /var/www/html |
之前说过,我们用mail.qing.su这个子域名来搭建网页邮箱。这里我们新建一个Nginx配置文件 /etc/nginx/conf.d/snappymail.conf, 放入下面的配置。请将mail.qing.su替换为您自己的域名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | server { listen 80; listen [::]:80; server_name mail.qing.su; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Robots-Tag "none" always; add_header X-Download-Options "noopen" always; add_header X-Permitted-Cross-Domain-Policies "none" always; add_header Referrer-Policy "no-referrer" always; add_header X-Frame-Options "SAMEORIGIN" always; fastcgi_hide_header X-Powered-By; gzip on; gzip_vary on; gzip_comp_level 4; gzip_min_length 256; gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; root /var/www/html; index index.php; client_max_body_size 50M; location ~ (^|/)\. { return 403; } location ~ ^/data/ { deny all; } location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } } |
测试并重新载入Nginx.
1 2 | nginx -t service nginx reload |
最后,再给Webmail加上Let’s Encrypt安全证书。
1 | certbot --nginx --redirect --staple-ocsp -d mail.qing.su |
这样,就安装好了SnappyMail. 我们登录后台 https://mail.qing.su/?admin, 首次访问这个页面时,会自动生成管理员密码。您可以在终端使用下面的命令来获取管理员密码。
1 | cat /var/www/snappydata/_data_/_default_/admin_password.txt |
登录后,需要配置一下域名。点击左侧Domains – Add Domain, 填入您的域名和相关SMTP/IMAP/Sieve连接信息之后,保存即可。然后,就可以使用网页邮箱啦。
我们照例给mail-tester.com发送一封测试邮件。
显然,所有的验证都通过了,我们获得了10/10分满分。
至此,我们在单节点上部署了Stalwart Mail Server,完成了个人邮件服务器的搭建,并正确配置了全部的DNS记录和服务器配置,可以实现正常收发信。正如我在文章开头所说Stalwart Mail Server的功能非常强大,您可以自行探索它的其他各项功能,并按照您的需求来自行配置。之后我也会分多期来介绍一下其他常用的Stalwart Mail Server配置方法。
如果您有任何疑问,欢迎留言讨论,我将尽量解答。本文作者为香菇肥牛,原文链接为https://qing.su/article/stalwart-mail-single-server-nginx.html, 转载请注明原文链接。谢谢!
博主新年好哈。
谢谢,新年快乐!
这里的certbot –nginx –redirect –enable-ocsp 是个小bug?
感谢- 已经fix!
博主,为什么我在本地部署stalwart-mail,完成后登陆web页面会是404呢,http://127.0.0.1:8080/login页面返回信息:{“type”:”about:blank”,”status”:404,”title”:”Not Found”,”detail”:”The requested resource does not exist on this server.”}
这是我的docker compose,希望帮我一下,感谢!
services:
stalwart:
image: stalwartlabs/mail-server:latest
container_name: stalwart-mail
restart: always
networks:
– compose_local_public
ports:
– ‘443:443’
– ‘8080:8080’
volumes:
– /home/compose/stalwart:/opt/stalwart-mail
可能是你的本地连不上github. 这个Docker会去pull github content, 如果本地连不上的话就不行。
已经解决了,容器需要科学上网,docker compose加上environment:HTTP_PROXY=http://xxx,感谢!
部署完毕后 能收到邮件,但是无法发送
Relay not allowed
listenerId = “smtp”, localPort = 25, remoteIp = 110.52.44.161, remotePort = 57397, to = “test@qq.com”
博主知道这是啥原因么?
是直接用SMTP发信还是第三方发信使用Stalwart作relay? 如果是前者,换个465端口试试,我还真没遇到过这个问题。如果是后者,Stalwart默认关闭了 Relay, 所以只有from address 和sender一致才能发送。如果需要作relay,可以在Settings – SMTP – Inbound – RCPT stage里面设置。
服务器在尼日利亚 估计是DNS刷新问题?睡一觉第二天就可以了.
感谢博主教程
怎么设置的,我也是这个问题。详细讲一下。
是在国内的服务器上搭建的邮件服务器?docker搭建会自动Pull Github的包,很多国内服务器可能无法访问,可以用我教程里的方式安装,不需要用docker. 也可以给docker加上HTTP proxy.
牛逼的教程
博主你好,我跟着教程配置好了整套流程下来之后
但我想通过 Apple 自带的 邮件 应用登录却失败了
名称:Postmaster
电子邮件地址:postmaster@my.domain
密码 用的就是 Directory – Accounts 里配置的密码
Apple mail 只有 IMAP 和 POP
发信地址、收信地址怎么填呢?
如果你在Stalwart里面新建用户的时候login name是“postmaster@example.com”, 那么客户端就要填对应的“postmaster@example.com”; 如果新建用户的时候login name是”postmaster”, 那么客户端里就要填对应的”postmaster”.
IMAP地址就填写你的服务器地址 “mx.example.com”, 端口993,Implicit SSL.
SMTP地址填写你的服务器地址 “mx.example.com”, 端口465,Implicit SSL.
我没用过Apple mail, 不知道具体在哪里填写,你可以试一试~
请教下:
购买了一台阿里云的服务器,发现已封闭25端口,且听说现在很难再申请开放25端口了.
弄了两天都不能正常收发邮件,目前还没有查清楚是什么原因,是不是没有25端口就不行?
请问这种情况还能搭建邮件服务器么?有没有什么方法或者设置可以规避掉25端口的问题?
请不吝赐教,麻烦了~
邮件服务器依赖25端口通信,所以如果没有25端口的话就没办法搭建了,只能换一台别的主机商的服务器~
一般这些大牌云主机商都不开放25端口,需要找传统的VPS/服务器厂商~
谢谢了
你好,如何api rest api 或者api 能 批量创建邮箱密码。他界面太繁琐了 不知道哪个key 或者token 去创建 目前都显示You have to authenticate first. 希望能做个教程demo之类得
可以在WebAdmin里面用浏览器Developer Console,看一下WebAdmin是怎么执行API的。
“`
最后,再给Webmail加上Let’s Encrypt安全证书。
1
certbot –nginx –redirect –staple-ocsp -d mail.qing.su
这样,就安装好了SnappyMail. 我们登录后台 https://mail.qing.su/?admin, 首次访问这个页面时,会自动生成管理员密码。您可以在终端使用下面的命令来获取管理员密码。
“`
求助大佬 到最后一步了 搞完访问https://mail.xx.xx/?admin却是:
“`
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
“`
问了ai也没整明白…
在安装Let’s Encrypt证书之前,访问 http://mail.xxxxxx.com 能打开吗?
你访问的这个页面是默认的Nginx页面,说明还有一个默认的Nginx default host没有关掉,需要在 /etc/nginx/conf.d里面找找看有没有类似 default的文件。
确实是sites-available/和sites-enabled/在捣鬼 直接删掉就好了 非常感谢