Stalwart Mail 邮件服务器的单服务器部署

祝大家在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-boxPoste.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, 这个子域名将用来搭建网页邮箱。如果您不需要网页邮箱(只用客户端),可以不添加这条记录。

记录类型前缀解析地址其他
Amx12.34.56.78 
MX@mx.qing.su优先级 10
TXT@v=spf1 a mx -all 
TXTmxv=spf1 a -all 
TXT_dmarcv=DMARC1; p=reject; rua=mailto:postmaster@qing.su; ruf=mailto:postmaster@qing.su根据需要指定这个邮箱地址
CNAMEmta-stsmx.qing.su可选
CNAMEautoconfigmx.qing.su可选
CNAMEautodiscovermx.qing.su可选
CNAMEmailmx.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 --enable-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
define('APP_DATA_FOLDER_PATH', '/var/www/snappydata/');

保存退出后,执行:

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, 转载请注明原文链接。谢谢!

2 thoughts on “Stalwart Mail 邮件服务器的单服务器部署”

Leave a Comment