从 Windows Server 2025 开始,微软就不再内置提供 SMTP 服务器组件了[1]。这对于系统管理员想通过电子邮件方式实现收集服务器运行情况的经典做法,是凭空增加了一项障碍。
虽然基于电子邮件管理的方式在现在各种网管软件的面前显得比较老套,但对于小、微型规模的服务器群来说,依然不失为只有一个人的信息部的比较高效的管理方法。
那么,买 Exchange Server ?这杀鸡用牛刀的,显然不是个办法。
笔者:国际认证信息系统审计师、软考系统分析师、软件工程硕士
笔者之前已经写过用电子邮件收集 Linux 系统日志邮件:《经典有效的日志监控邮件集中巡检 Linux 服务器》,本来还打算接着写 Windows Server 下对应的做法,结果现在反而先多了一件事,找 SMTP 服务器组件的替代品。
可能个别读者还不知道 Windows Server 原本是有提供 SMTP 服务器组件的,比如 Windows Server 2022,可以如下图方法安装:
图 Windows Server 2022 添加 SMTP 服务器组件
Linux 下常见的电子邮件相关服务器软件,比如 Postfix 和 Dovecot 都是不支持 Windows 的。
于是找到 E-MailRelay 这个开源的轻量级 SMTP 服务器软件,项目地址:
https://emailrelay.sourceforge.net/index.html
源码及软件安装包下载地址:
https://sourceforge.net/projects/emailrelay/files/latest/download
软件有着很详细的文档位于安装目录内,也可以在线查看。
E-MailRelay 是一个轻量级的、开源的SMTP 服务器,同时支持 Windows 和 Linux。
E-MailRelay 的轻量级并不等于功能贫乏,它支持标准的安全特性,与标准化的电子邮件客户端软件兼容。
而 Windows Server 本身的 SMTP 服务器组件,其实原本就是为了向管理员发送邮件通知用的,功能本来就有限。
所以用 E-MailRelay 替代原来的 SMTP 服务器组件,基本上就等于是平行替代,而且还不像原来的在安装时要扯上一大堆依赖。
不过还是要注意,E-MailRelay 并不适合作为大规模的电子邮件中继服务器使用,它的设计目标就只是小而美。
E-MailRelay 的安装非常简单,但关键是安装过程就是配置过程。不过要先强调,配置过程的UI界面只是为了方便不复杂的使用场景而设,复杂的情况需要对照文档自行详细配置。
下载安装包解压运行其中的:emailrelay-setup.exe 开始安装。
1)首先是四项目录选择。如果C盘空间不够(按说一般不可能,系统管理邮件没多少数据量)就要选择别的盘符目录,所以一般就是默认设置。出于安全谨慎也可以选择其他盘符。
2)然后选择安装类型:POP3 和 SMTP。
开启 POP3 就可以用邮件客户端连接到这服务器收取邮件。开启 SMTP 就是邮件转发。按笔者预设的使用目的,这两项都要启用。
另外就是 Mail forwarding 邮件转发的选项,默认的 Only on demand 并不是自动化的。
如果是正常运行且收发内容比较单一,选择 When client disconnects 当客户端断开连接时转发,该选项可以确保电子邮件及时发送。
但如果是需要故障排除或者适用性测试,那就选择 Synchronously 同步转发,或者选择 Check periodically every second/minute 每隔1秒或1分钟就检查和转发,这样可以方便观察执行情况。
3)启用了 POP3 服务后,要对 POP3 服务进行配置。
配置包括服务端口、账户数量及多账户时是否共享同一个邮件池、账户的名称和密码。
务必注意,这里设置的账户名称密码,和 Windows 操作系统自身的是相互独立的。
可以想想如果要等级保护合规,那么起码需要设置安全管理员、安全审计员和系统管理员三员账号和选择分离邮件池。
但是这软件的轻量级,结合 Windows Server 本身并不是按照等保三员分立去设计的,所以并不是很容易实现三员互不相干,读者可以自己尝试。
4)启用了 SMTP 服务后也要配置。
配置包括服务端口、SMTP 专用的账号名密码以及邮件传输是否启用加密。
这里首先要注意的是 SMTP 校验用的账号信息既不是 Windows 用户也不是之前设置的 POP3 用户。
启用 TLS 加密(已经没有如果),用户可以自行指定加密证书(PEM 格式),如果不指定,安装期间会自动产生自签名的匿名加密证书。测试使用 E-MailRelay 时可不设置 TLS 加密以方便排错。
在安装过程中设置的用户名和密码信息都会以BASE64进行编码后,存储到 emailrelay.auth 文件中。
当客户端通过用户名和密码进行身份验证时,软件会将这些凭证信息用Base64进行编码并存储到中。
5)接下来是作为 SMTP 客户端的配置。
SMTP 客户端的意义是可以向其他 SMTP 服务器转发邮件,如果需要通过公网邮箱发出系统管理邮件,就需要设置。事实上配置界面也要求必须设置,否则不能前进到下一步。
配置内容包括有外部 SMTP 服务器主机名称和端口、是否需要身份校验、用于身份校验的账号名和密码、是否启用加密等。
如果只是本地测试,可以直接填 localhost 也就是本机。
其它选项和 SMTP SERVER 的设置一致即可。
6)然后是 FILTERS 过滤器设置。
这里可以分别对服务器和客户端两种工作状态设置过滤器或脚本,实现过滤垃圾邮件或进行自动化操作。
默认都是 None,如果是打算发出去公网的可以这样设。
但如果打算是就在这台服务器上 POP3 收信,类似于 Linux 服务器方面的惯常做法,那这里就有点复杂,要设置过滤器,后面再说。
7)接下来是系统管理员都耳熟能详的 LOGGING 日志设置。
配置项包括是否输出专家日志、日志包含的额外信息以及日志的输出目的地。
注意如果会产生大量邮件收发,那么日志默认配置的按日滚动可能会爆文件容量,使用时间长了还可能爆硬盘容量。系统管理员要预估做好使用规划。
另外,没有日志转发的选项,读者要自己想办法实现。
如果已经部署了日志机的代理程序收集系统日志,那么一般情况下只要勾选了日志发送到 system log 的选项,日志机的代理程序就可以从系统事件日志中收集到 E-MailRelay 的日志。
8)再下来是 CONNECTIONS 配置
设置项包括选择在什么地址上侦听,以及是否允许外部的客户端连接(相对于本机内部连接)。
默认即可。
9)最后是设定 E-MailRelay 服务的启动方式。
不用怎么解释了。
这当然是选择在操作系统启动时同时自动启动,该程序将会作为服务来运行。
10)配置完毕,点击 Finish 按钮后复制文件、生成配置文件和启动用的批处理文件。
期间安装过程会给出安装信息,例如:
creating install directory [C:\Program Files\E-MailRelay]... ok
creating configuration directory [C:\ProgramData\E-MailRelay]... ok
creating runtime directory [C:\ProgramData\E-MailRelay]... exists
creating spool directory [C:\ProgramData\E-MailRelay\spool]... ok
creating pop-by-name directory [C:\ProgramData\E-MailRelay\spool\mailuser1]... ok
creating pop-by-name directory [C:\ProgramData\E-MailRelay\spool\mailuser2]... ok
copying payload directory [C:\Program Files\E-MailRelay]... ok
copying payload directory [C:\Program Files\E-MailRelay\examples]... ok
copying payload directory [C:\Program Files\E-MailRelay\doc]... ok
copying payload directory [C:\Program Files\E-MailRelay]... ok
copying payload directory [C:\Program Files\E-MailRelay]... ok
creating authentication secrets file [C:\ProgramData\E-MailRelay\emailrelay.auth]... ok
creating pointer file [C:\Program Files\E-MailRelay\emailrelay-gui.cfg]... ok
registering as a source for event viewer logging [C:\Program Files\E-MailRelay\emailrelay.exe]... ok
generating tls server key [C:\ProgramData\E-MailRelay\emailrelay-install.pem]... ok
creating startup batch file [C:\ProgramData\E-MailRelay\emailrelay-start.bat]... ok
updating program-files link [C:\Program Files\E-MailRelay]... ok
updating destkop link [C:\Users\Administrator\Desktop]... nothing to do
updating start menu link [C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs]... ok
updating autostart link [C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup]... nothing to do
installing service... ok
== finished ==
建议无论是否合规有要求,都应该作为操作记录留存备查。
11)完成安装后,先看看是否能运行起来。
点击 LAUNCH 按钮启动程序,或通过服务管理控制台查看 E-MailRelay 的服务是否存在和启动服务:
也可以运行位于 %ProgramData%\E-MailRelay 目录中的 emailrelay-start.bat 批处理文件来启动程序,或重启服务器让其自行启动。
默认情况下,E-MailRelay 的运行日志和邮件转发日志都在这个目录里面,读者可以自行查阅。
细心的读者可以留意到,在安装过程对话框的每个选项都有浮动提示,其中有些会显示这个选项是一个命令行参数。
事实是因为这个软件要实现跨平台,所以它就是设计为命令行启动的程序。
到这里就要说回去前面的第6点。如果配置的目的是在这服务器上直接收取邮件,那就要修改软件的启动配置,增加地址校验器和邮件投递的参数。
1)首先要编写地址校验器脚本。可以参考文档中的例子,编写如下的 JavaScript 脚本(作为示例比较简单直接):
// local-verifier.js
try {
var address = WScript.Arguments(0);
var user = address.split(/@/)[0] || "";
var domain = address.split(/@/)[1] || "";
if (domain !== "WIN-9RBDQSEPFHR") {
WScript.Stdout.WriteLine("invalid domain:"+domain);
WScript.Quit(2); // reject (550)
} else if (user === "mailuser1") {
WScript.Stdout.WriteLine("mailuser1 ");
WScript.Stdout.WriteLine("mailuser1");
WScript.Quit(0); // accept for delivery to mailbox
} else if (user === "mailuser2") {
WScript.Stdout.WriteLine("mailuser2 ");
WScript.Stdout.WriteLine("mailuser2");
WScript.Quit(0); // accept for delivery to mailbox
} else {
WScript.Stdout.WriteLine("");
WScript.Stdout.WriteLine(address);
WScript.Quit(1); // accept other as local system user
}
} catch (e) {
WScript.Stdout.WriteLine("mailbox unavailable:"+address);
WScript.Stdout.WriteLine(e);
WScript.Quit(3);
}
命名为 local-verifier.js 然后保存到 C:\ProgramData\E-MailRelay 目录下。接着修改目录内的 emailrelay-start.bat 文件,在文件的最后面加上:
--address-verifier=C:\ProgramData\E-MailRelay\local-verifier.js --domain=WIN-9RBDQSEPFHR --filter=deliver:
三个参数的意义分别是指定地址校验脚本、本地地址域名和本地邮件投递过滤器。
下面就是这次测试生成的启动批处理脚本(为了清晰笔者添加了换行):
start "emailrelay" "C:\Program Files\E-MailRelay\emailrelay.exe"
--client-auth C:\ProgramData\E-MailRelay\emailrelay.auth
--client-tls
--close-stderr
--forward-on-disconnect
--forward-to localhost:25
--log
--log-address
--log-file C:\ProgramData\E-MailRelay\emailrelay-log-%%d.txt
--log-time
--pid-file C:\ProgramData\E-MailRelay\emailrelay.pid
--pop
--pop-auth C:\ProgramData\E-MailRelay\emailrelay.auth
--pop-by-name
--remote-clients
--server-auth C:\ProgramData\E-MailRelay\emailrelay.auth
--server-tls
--server-tls-certificate C:\ProgramData\E-MailRelay\emailrelay-install.pem
--spool-dir C:\ProgramData\E-MailRelay\spool
--verbose
--address-verifier=C:\ProgramData\E-MailRelay\local-verifier.js
--domain=WIN-9RBDQSEPFHR
--filter=deliver:
如果要修改其它设置,方法就是两种:
1)按 E-MailRelay 的文档内容,直接修改启动批处理文件中的命令参数。笔者建议是这种。
2)运行安装目录下的 emailrelay-gui.exe,就是把安装过程的选择再做一次,之前生成的 emailrelay.auth 身份校验信息配置文件会自动备份。但 UI 的参数能力是有限的。
任何设置调整都需要重启服务才能生效,比如可以在 CMD 命令行下使用 SC 命令查询和控制服务启停:
C:\Users\Administrator>sc query emailrelay
SERVICE_NAME: emailrelay
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
C:\Users\Administrator>sc start emailrelay
SERVICE_NAME: emailrelay
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x1f40
PID : 3552
FLAGS :
C:\Users\Administrator>sc query emailrelay
SERVICE_NAME: emailrelay
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
可以使用 netstat 命令检查端口侦听情况:
C:\Users\Administrator>tasklist | find "emailrelay"
emailrelay-service.exe 3868 Services 0 3,900 K
emailrelay.exe 5756 Services 0 9,016 K
C:\Users\Administrator>netstat -anop tcp | find "5756"
TCP 0.0.0.0:25 0.0.0.0:0 LISTENING 5756
TCP 0.0.0.0:110 0.0.0.0:0 LISTENING 5756
E-MailRelay 本身会对发起连接的客户端 IP 地址进行验证,默认仅允许同一子网内的连接发生操作。但还是应该通过防火墙作进一步的限制才更可靠。
1)测试 SMTP 发送邮件。通过 PowerShell cmdlet Send-MailMessage 发送电子邮件进行测试,比如:
Send-MailMessage -Body "Test" -From mailuser1@localhost -SmtpServer localhost `
-Subject "Test-Mail" -To mailuser2@localhost -Credential "smtpuser"
这是一封测试邮件,由邮箱用户1发送给邮箱用户2,发送邮件时使用专门的 SMTP 校验信息。发送时会弹出窗口要求输入 smtpuser 的密码。
2)测试 POP3 收取邮件。
最简单的测试方法是使用任何支持 TELNET 连接的软件,比如 putty,连接到本机的 110 端口,然后输入 POP3 操作命令[2]检查邮件。
大致会有如下的过程:
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2024.08.09 23:38:58 =~=~=~=~=~=~=~=~=~=~=~=
+OK POP3 server ready <23329.1723217938@WIN-9RBDQSEPFHR>
(按一下回车跳过看不见的握手期间多余字符)
-ERR
USER mailuser2
+OK user: mailuser2
PASS password
+OK
STAT
+OK 1 339
LIST
+OK 1 message(s)
1 339
.
RETR 1
+OK 339 octets
Received: from WIN-9RBDQSEPFHR ([::1]) by WIN-9RBDQSEPFHR with ESMTPA ; Fri, 9 Aug 2024 23:38:37 +0800
MIME-Version: 1.0
From: mailuser1@WIN-9RBDQSEPFHR
To: mailuser2@WIN-9RBDQSEPFHR
Date: 9 Aug 2024 23:38:37 +0800
Subject: Test-Mail
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
Test
.
QUIT
+OK signing off
虽然说,手敲 POP3 命令基本功了属于是,但估计现在甚至没几个系统管理员知道有手敲命令这么一回事。
如果测试失败,未能在账号中列出邮件,那么就要检查日志文件。所以安装时日志的选项应勾选 verbose 以获得详细内容,观察邮件信息传递的过程。
其次是检查邮件池目录下,是否存在因为消息发送失败而留下的扩展名为 .bad 的文件。比如:
emailrelay.5756.1723187740.2.envelope.bad
比较常见的情况是会在日志中发现如下的内容:
emailrelay: 20240809.151707.201: info: ::1; server authentication enabled but not a trusted address: ::1
解决办法就是修改运行配置目录下的身份验证信息文件 emailrelay.auth,增加对可信的本地IP地址范围定义,比如增加:
server none 127.0.0.1/8 localipv4
server none 192.168.0.0/16 localipv4
server none ::1 localipv6
server none fe80::/64 localipv6
然后重启服务即可生效。
发送失败的邮件,只要删除了 .bad 扩展名就能被重新处理发送。还可以启用 admin 功能,用 telnet 方式连接 SMTP 端口登录后发送 unfail-all 命令删除扩展名后再发送 forward 命令触发执行邮件转发。这些都在作者非常详细的说明文档中介绍了。
E-MailRelay 作为轻量级、开源的 SMTP 服务器软件,可以方便地取代 Windows Server 自带的 SMTP 服务器组件,且还提供了更多的功能特性。
利用 E-MailRelay 软件结合 PowerShell 脚本,可以方便地实现以电子邮件方式向系统管理员发送通知,尤其是对于一些无人值守、运行时间较长的批处理任务,在任务完成时发送电邮通知系统管理员,是很方便的。
但要注意,轻量级并不等于简单。始终 SMTP/POP3 协议有其复杂性,系统管理员需要认真读透软件的文档后选择合适的配置方式。
参考引用:
[1] 从 Windows Server 2025 开始已移除或不再开发的功能(预览版)
[2] Post Office Protocol - Version 3
本站微信订阅号:
本页网址二维码: