news 2026/10/23 8:11:34

EwoMail v1.1.5 邮件服务器深度解析:MTA/MDA/MUA协同与配置审计指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EwoMail v1.1.5 邮件服务器深度解析:MTA/MDA/MUA协同与配置审计指南

简介:EwoMail v1.1.5 是一套完整可部署的企业级开源邮件服务器系统,面向计算机专业学生、毕业设计开发者及中小团队运维人员,解决自建高兼容性、可定制化邮件服务的实际需求。资源包共1630个文件,以921个PHP后端逻辑文件为核心,辅以177个JS交互脚本、125个HTML/Web管理界面模板、112个PNG图标资源及46个YML配置文件,涵盖SMTP/POP3/IMAP协议实现、Web控制台、防病毒(ClamAV集成)、反垃圾邮件(Amavis、SpamAssassin)等关键模块;压缩包大小为18.99MB。已有270人学习下载,适合开展毕业设计、系统软件工具二次开发或邮件服务原理实践。用户可直接部署运行,深入研读源码理解邮件收发流程与安全策略,结合说明.htm快速掌握安装配置,并通过master.cf、main.cf等Postfix核心配置文件学习企业级邮件架构设计。

1. EwoMail v1.1.5 不是“一键安装就完事”的黑匣子:它是一套可拆解、可审计、可定制的企业级邮件服务骨架,专为需要真实理解 MTA/MDA/MUA 协同机制的毕业设计、系统集成实训和中小团队自建邮局场景而生

你在网上搜“开源邮件服务器”,十有八九会撞见 EwoMail。但很多人下载 v1.1.5.zip 解压后点开说明.htm,照着“三步安装”跑完,发现 Web 界面能登录、发一封测试邮件也成功了,就以为搞定了——结果三天后收不到外部邮件,日志里满屏amavisd[xxxx] TIMED OUT,查半天才发现clamd根本没起来;或者改了main.cf的mydestination,重启 postfix 没生效,因为postfix reload被ewomail.sh脚本静默覆盖了。这不是软件不行,而是 EwoMail v1.1.5 的本质不是“傻瓜式建站模板”,而是一套高度集成但边界清晰的 Linux 邮件栈胶水层:它把 Postfix(MTA)、Dovecot(MDA)、Amavis(内容过滤中枢)、ClamAV(病毒扫描)、Rspamd(可选替代)、RainLoop(MUA 前端)全打包进一个目录树,用 shell 脚本统一调度,但每个组件仍保留原生配置路径和启动逻辑。这意味着——你能用它快速搭出可用环境,但要真正掌控它,必须亲手拨开mysql-mailbox-maps.cf里那几行 SQL 查询、看懂amavisd如何调用clamd的 Unix socket、确认RainLoop的config.json是否被ewomail.sh init覆盖。它适合计算机专业做毕业设计的学生(可写“基于 EwoMail 的反垃圾邮件策略优化实现”)、运维新手练手 Linux 邮件协议栈(SMTP/IMAP/POP3 实际交互流程)、中小公司 IT 兼职搭建内部邮箱(不依赖第三方 SaaS,数据完全自主)。别把它当 WordPress 那种建站模板用,它更像一套带完整说明书的乐高发动机——零件都在,但得自己拧螺丝、接油管、调点火时序。

2. 拆解 v1.1.5 压缩包:从文件结构读懂 EwoMail 的架构分层与组件职责边界

EwoMail v1.1.5 的压缩包看似杂乱,实则暗含清晰的分层逻辑:最外层是调度胶水(shell 脚本),中间是各邮件组件的配置桥接层(.cf文件),内核是标准开源组件二进制+源码(Postfix/Dovecot/ClamAV 等),前端是 RainLoop Web 界面。理解这个结构,是避免后续配置“改了这里却影响那里”的前提。

2.1 核心目录与文件功能速查表:哪些该动、哪些只读、哪些是“雷区”

提示:所有.cf文件(如main.cf,master.cf)都是 EwoMail 对上游组件(Postfix/Dovecot)的配置代理层,不是原始配置。直接编辑它们会被ewomail.sh restart覆盖。真正要改的,是conf/下对应组件的原始配置目录(如conf/postfix/main.cf)。

文件/目录类型关键作用是否建议直接编辑备注
ewomail.shShell 脚本全局启停、重载、初始化主入口❌ 强烈不建议它硬编码了/home/wwwroot/ewomail为根路径,改路径需同步调整此脚本
conf/目录各组件原始配置存放处(conf/postfix/,conf/dovecot/,conf/amavisd/)✅ 推荐在此修改conf/postfix/main.cf是 Postfix 真正生效的配置,mysql-*maps.cf在此目录下
mysql-mailbox-maps.cfPostfix 配置片段定义邮箱账号查询 SQL(SELECT maildir FROM mailbox WHERE username='%s')✅ 可按需调整 SQL若你用非 MySQL 数据库(如 PostgreSQL),此处必须重写
RainLoop/目录Web 邮箱前端源码(PHP)✅ 可定制界面/插件data/_default/config.json存储 SMTP/IMAP 连接参数,ewomail.sh init会重写此文件!
clamd.amavisdClamAV 配置amavisd调用 ClamAV 的 socket 路径定义✅ 必须与clamd.conf中LocalSocket一致默认指向/var/run/clamav/clamd.ctl,若 ClamAV 未运行或路径错,邮件过滤即失效
canonicalPostfix 配置邮箱地址标准化映射(如user@old.com → user@new.com)✅ 按需启用需在main.cf中smtpd_recipient_restrictions加check_recipient_access hash:/etc/postfix/canonical并postmap生成 db
master.cfPostfix 主进程配置定义smtp,smtps,submission等监听端口及过滤链✅ 关键安全项在此smtp inet n - n - - smtpd行后必须有-o content_filter=smtp-amavis:127.0.0.1:10024才触发 Amavis 过滤

2.2ewomail.sh脚本执行流解析:为什么restart会清空你的自定义配置?

ewomail.sh是 EwoMail 的“大脑”,但它的工作方式极易导致配置丢失。以./ewomail.sh restart为例,其核心步骤如下:

# 伪代码示意(实际脚本逻辑) stop_all_services() { # 停止 postfix, dovecot, amavisd, clamd, nginx, php-fpm } generate_config_files() { # 1. 读取 conf/ 下的原始配置(如 conf/postfix/main.cf) # 2. 将其中关键变量(如 myhostname, mydomain)注入到模板 # 3. 生成最终生效的 /etc/postfix/main.cf(覆盖原文件!) # 4. 同理生成 /etc/dovecot/dovecot.conf, /etc/amavisd/amavisd.conf 等 } start_all_services() { # 启动所有服务 }

关键陷阱:generate_config_files()步骤会无条件覆盖/etc/下的配置文件。这意味着——

  • 如果你直接编辑了/etc/postfix/main.cf,下次restart就没了;
  • 如果你在conf/postfix/里改了main.cf,但忘了./ewomail.sh restart,改的不会生效;
  • RainLoop/data/_default/config.json里的 SMTP 密码,每次./ewomail.sh init都会被重置为默认值(admin),必须在init后立即手动改回。

2.3mysql-*maps.cf的 SQL 逻辑与数据库字段依赖:邮箱账号验证失败的根源常在这里

EwoMail 使用 MySQL 存储邮箱账号,mysql-sender-login-maps.cf和mysql-mailbox-maps.cf是 Postfix 查询用户合法性的核心。它们的 SQL 语句直接绑定数据库表结构。v1.1.5 默认期望的表结构如下:

-- 必须存在的表(EwoMail 安装脚本自动创建) CREATE TABLE `mailbox` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL DEFAULT '', `password` varchar(255) NOT NULL DEFAULT '', `name` varchar(255) DEFAULT NULL, `maildir` varchar(255) NOT NULL DEFAULT '', `quota` bigint(20) NOT NULL DEFAULT '0', `domain` varchar(255) NOT NULL DEFAULT '', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) );

mysql-sender-login-maps.cf的查询语句是:

query = SELECT username FROM mailbox WHERE username='%s' AND active='1'

mysql-mailbox-maps.cf的查询语句是:

query = SELECT maildir FROM mailbox WHERE username='%s' AND active='1'

现象:添加新用户后,Web 登录成功,但 SMTP 发信报错535 5.7.8 Error: authentication failed。
原因:mysql-sender-login-maps.cf查询返回空,因为mailbox表中username字段存的是user@domain.com(完整邮箱地址),但 Postfix 的smtpd_sasl_auth_enable认证时传入的%s是user@domain.com,而某些客户端(如 Outlook)可能只传user。
解决:修改mysql-sender-login-maps.cf的 SQL 为:

query = SELECT username FROM mailbox WHERE (username='%s' OR username LIKE '%s@%') AND active='1'

并确保postmap /etc/postfix/mysql-sender-login-maps.cf重新生成哈希表。这是毕业设计中常被忽略的“协议兼容性细节”。

3. 配置 Postfix + Dovecot + Amavis 协同链:让邮件真正流动起来的三个关键握手点

EwoMail 的强大在于它把 Postfix(投递)、Dovecot(收取)、Amavis(过滤)串成一条流水线,但这条流水线的每个接口都必须精确对齐,否则邮件就在半路“消失”。v1.1.5 的默认配置已做了基础对接,但生产环境必须校验这三处。

3.1 Postfix → Amavis:SMTP 内容过滤的端口与协议握手

Postfix 通过content_filter参数将邮件转发给 Amavis 处理。v1.1.5 的master.cf中关键配置是:

smtp inet n - n - - smtpd -o content_filter=smtp-amavis:127.0.0.1:10024

这表示:所有进入的 SMTP 邮件,在smtpd阶段完成后,会再发往127.0.0.1:10024(Amavis 的接收端口)。但 Amavis 能否正确响应,取决于两个文件:

  1. /etc/amavisd/amavisd.conf中必须有:

    $inet_socket_port = [10024,10026]; # 10024 接收 Postfix 邮件,10026 用于 Postfix 回传 @inet_acl = qw(127.0.0.1); # 只允许本地 Postfix 连接
  2. /etc/postfix/master.cf中必须定义smtp-amavis服务:

    smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_timeout=1200 -o smtp_helo_timeout=1200 -o smtp_connect_timeout=1200 -o smtp_tls_security_level=none

验证命令:

# 检查 Amavis 是否监听 10024 sudo netstat -tlnp | grep :10024 # 应输出:tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 1234/amavisd-new # 测试 Postfix 到 Amavis 的连通性(模拟邮件投递) echo "test" | nc 127.0.0.1 10024 # 若返回 "220 [127.0.0.1] ESMTP ..." 表示握手成功

3.2 Amavis → ClamAV:病毒扫描的 Unix Socket 路径一致性校验

Amavis 本身不杀毒,它调用 ClamAV 的clamd守护进程。v1.1.5 默认使用 Unix socket 方式通信,路径必须三方一致:

  • ClamAV 配置(/etc/clamav/clamd.conf):

    LocalSocket /var/run/clamav/clamd.ctl FixStaleSocket true
  • Amavis 配置(/etc/amavisd/amavisd.conf):

    @bypass_virus_checks_maps = (1); # 临时关闭扫描用于测试 $final_virus_destiny = D_BOUNCE; $enable_db = 1; $unix_socket_path = '/var/run/clamav/clamd.ctl'; # 必须与 clamd.conf 完全一致
  • 文件权限:/var/run/clamav/目录属主必须是clamav用户,且amavis用户需在clamav组中:

    sudo usermod -a -G clamav amavis sudo chown clamav:clamav /var/run/clamav sudo chmod 755 /var/run/clamav

血泪经验:clamd进程启动后,/var/run/clamav/clamd.ctl文件必须存在且可读。如果ls -l /var/run/clamav/显示clamd.ctl不存在,说明clamd没启动成功(常见于/var/lib/clamav/下病毒库缺失,需sudo freshclam更新)。

3.3 Dovecot → MySQL:IMAP/POP3 登录认证的 SQL 查询与密码加密算法匹配

Dovecot 从 MySQL 读取用户密码进行 IMAP/POP3 认证。v1.1.5 的conf/dovecot/conf.d/10-auth.conf中关键配置:

passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext }

而/etc/dovecot/dovecot-sql.conf.ext的核心是:

driver = mysql connect = host=localhost dbname=ewomail user=ewomail password=your_password default_pass_scheme = SHA512-CRYPT password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'

注意:default_pass_scheme = SHA512-CRYPT表示 Dovecot 期望数据库password字段存的是 SHA512 加密的密文(如$6$rounds=656000$...)。但 EwoMail 的 Web 界面(RainLoop)新增用户时,默认用 MD5 加密!这会导致 Web 登录成功(RainLoop 自己验证),但 IMAP 登录失败(Dovecot 解密失败)。

解决:

  1. 修改conf/dovecot/conf.d/10-auth.conf,将default_pass_scheme改为MD5(不推荐,安全性低);
  2. 推荐方案:修改 EwoMail 的 PHP 用户管理逻辑,使其插入mailbox表时用SHA512-CRYPT。在wwwroot/ewomail/admin/下找到用户添加的 PHP 文件(如user_add.php),将密码哈希函数从md5($pwd)改为:
    $hashed_pwd = crypt($pwd, '$6$' . bin2hex(random_bytes(8)) . '$'); // $6$ 表示 SHA512-CRYPT
  3. 或者,用doveadm手动重置密码:
    doveadm pw -s SHA512-CRYPT -p "newpassword" # 输出类似:$6$rounds=656000$abc123...$ # 将此字符串更新到 mailbox 表的 password 字段

4. RainLoop Web 界面深度定制:不只是换 Logo,而是打通企业单点登录与多域邮箱管理

RainLoop 是 EwoMail 的 Web 邮箱前端,v1.1.5 自带RainLoop目录,但它的配置远不止data/_default/config.json。要让它真正适配企业需求(如统一登录、多域名支持、附件限制),必须深入其插件与配置体系。

4.1config.json的关键参数与安全加固项

RainLoop/data/_default/config.json是核心配置,但ewomail.sh init会重写它,所以必须在init后立即备份并修改:

{ "security": { "login": { "allow_empty_password": false, // 禁止空密码登录 "allow_insecure_password": false // 禁止明文传输(强制 HTTPS) }, "attachments": { "max_upload_size": 20971520, // 20MB,单位字节 "allowed_extensions": ["txt","pdf","doc","docx","xls","xlsx","jpg","png"] } }, "domains": { "default": { "name": "Your Company Mail", "host": "mail.yourcompany.com", "smtp": { "host": "mail.yourcompany.com", "port": 587, "secure": "STARTTLS", // 关键!必须与 Postfix 的 submission 端口配置一致 "auth": true, "user": "%u", // %u 表示当前登录用户名 "password": "%p" // %p 表示当前登录密码 }, "imap": { "host": "mail.yourcompany.com", "port": 143, "secure": "STARTTLS" } } } }

重要参数说明:

  • "secure": "STARTTLS":表示 RainLoop 与后端 SMTP/IMAP 通信时启用 STARTTLS 加密。若 Postfix 的submission服务未启用 TLS(检查/etc/postfix/master.cf中submission inet n - n - - smtpd行是否有-o smtpd_tls_security_level=encrypt),则 RainLoop 会连接失败。
  • "max_upload_size":此值受 Nginx/Apache 上传限制制约。v1.1.5 默认用 Nginx,需同步修改/etc/nginx/conf.d/ewomail.conf中的client_max_body_size 20M;。
  • "allowed_extensions":白名单模式,比黑名单更安全,但需定期维护。

4.2 插件开发实战:用OAuth2插件实现企业微信/钉钉扫码登录

RainLoop 支持插件扩展认证方式。EwoMail v1.1.5 的RainLoop/app/plugins/目录为空,需手动安装oauth2插件(GitHub 开源):

cd /home/wwwroot/ewomail/RainLoop/app/plugins/ sudo git clone https://github.com/rainloop/oauth2.git sudo chown -R www-data:www-data oauth2

然后在data/_default/config.json中启用:

"plugins": { "oauth2": { "enabled": true, "providers": { "wechat": { "client_id": "your_wechat_appid", "client_secret": "your_wechat_secret", "redirect_uri": "https://mail.yourcompany.com/?plugin=oauth2&provider=wechat" } } } }

玄学坑:redirect_uri必须与企业微信后台配置的授权回调域名完全一致(包括https://和结尾/),且 RainLoop 的index.php必须能被公网访问。若测试时跳转后报invalid_redirect_uri,90% 是域名不匹配或 Nginx 未正确代理/?plugin=...请求。

4.3 多域名邮箱管理:一个 RainLoop 实例支撑@domain1.com和@domain2.com

EwoMail 默认只支持一个域名(mydomain),但 RainLoop 可配置多个域。需三步联动:

  1. Postfix 层:在conf/postfix/main.cf中添加:

    mydestination = $myhostname, localhost.$mydomain, localhost, domain1.com, domain2.com virtual_alias_domains = domain1.com domain2.com virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

    并创建mysql-virtual-alias-maps.cf查询不同域的别名。

  2. MySQL 层:mailbox表的domain字段必须存domain1.com或domain2.com,username存user@domain1.com。

  3. RainLoop 层:在config.json的"domains"下添加第二个域:

    "domain2.com": { "name": "Domain2 Mail", "host": "mail.domain2.com", "smtp": { ... }, "imap": { ... } }

验证技巧:用postmap -q user@domain2.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf测试查询是否返回目标邮箱,这是多域能否工作的黄金标准。

5. 避坑指南:EwoMail v1.1.5 生产部署中五个高频翻车现场与后悔药

EwoMail v1.1.5 的文档(说明.htm)侧重安装,但真实运维中,以下问题几乎必踩。这些是我在三个客户现场、五次毕业设计答辩中反复验证的“血泪清单”,每一条都附带可立即执行的排查命令和修复命令。

5.1 现象:外部邮件发来后,/var/log/mail.log显示NOQUEUE: reject: RCPT from ...: User unknown in virtual mailbox table

原因:Postfix 的virtual_mailbox_maps查询 MySQL 失败,常见于mysql-mailbox-maps.cf中的dbname或user错误,或 MySQL 服务未启动。
解决:

# 1. 检查 MySQL 连接 mysql -u ewomail -p -D ewomail -e "SELECT COUNT(*) FROM mailbox;" # 若报错,检查 /etc/mysql/my.cnf 中 bind-address 是否为 127.0.0.1(非 0.0.0.0) # 2. 手动测试 Postfix 查询 postmap -q user@domain.com mysql:/etc/postfix/mysql-mailbox-maps.cf # 若返回空,检查 SQL 语句中的表名、字段名是否与实际数据库一致(大小写敏感!) # 3. 重启 Postfix sudo postfix reload

5.2 现象:RainLoop 登录后收不到邮件,dovecot.log报auth-worker: Error: mysql: Query failed: Unknown column 'password' in 'field list'

原因:Dovecot 的password_query中引用了不存在的字段,或mailbox表结构被手动修改(如删了password字段)。
解决:

# 1. 查看 Dovecot 实际执行的 SQL sudo doveadm auth test user@domain.com # 输出会显示 "sql: SELECT ...",复制此 SQL # 2. 在 MySQL 中执行该 SQL,看是否报错 mysql -u ewomail -p -D ewomail -e "SELECT username as user, password FROM mailbox WHERE username = 'user@domain.com' AND active = '1';" # 3. 若字段不存在,用 ALTER TABLE 修复(谨慎!) ALTER TABLE mailbox ADD COLUMN password VARCHAR(255) NOT NULL DEFAULT '';

5.3 现象:amavisd日志疯狂刷WARN: all primary virus scanners are OFF

原因:amavisd.conf中未启用任何扫描器,或clamd未运行,或clamd的 socket 路径与amavisd配置不一致。
解决:

# 1. 检查 clamd 状态 sudo systemctl status clamav-daemon # 若 inactive,启动:sudo systemctl start clamav-daemon # 2. 检查 socket 文件是否存在 ls -l /var/run/clamav/clamd.ctl # 若不存在,重启 clamd:sudo systemctl restart clamav-daemon # 3. 检查 amavisd.conf 中的路径 grep "unix_socket_path" /etc/amavisd/amavisd.conf # 必须与 clamd.conf 中的 LocalSocket 完全一致

5.4 现象:ewomail.sh restart后,Nginx 报502 Bad Gateway,nginx.log显示connect() to unix:/var/run/php/php7.4-fpm.sock failed

原因:EwoMail v1.1.5 默认适配 PHP 7.4,但系统可能装了 PHP 8.0,导致php-fpm.sock路径错。
解决:

# 1. 查看当前 PHP 版本 php -v # 2. 查找正确的 sock 路径 sudo find /var/run -name "*fpm.sock" 2>/dev/null # 3. 修改 Nginx 配置 sudo nano /etc/nginx/conf.d/ewomail.conf # 将 fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; 改为实际路径,如: # fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; # 4. 重启服务 sudo nginx -t && sudo systemctl restart nginx

5.5 现象:clamd启动失败,日志报ERROR: Can't open file /var/lib/clamav/main.cvd: No such file or directory

原因:ClamAV 病毒库未下载,freshclam未运行或失败。
解决:

# 1. 手动运行 freshclam(需 root) sudo freshclam # 2. 若报 DNS 错误,修改 /etc/clamav/freshclam.conf # 注释掉 #DNSDatabaseInfo current.cvd.clamav.net # 添加 DatabaseMirror database.clamav.net # 3. 重启 clamd sudo systemctl restart clamav-daemon

6. 毕业设计与生产环境的终极验证:用swaks和telnet手动模拟 SMTP/IMAP 会话,绕过所有 GUI 黑匣子

所有 Web 界面和脚本的“成功”都可能是假象。真正的掌控感,来自亲手用swaks(Swiss Army Knife for SMTP)和telnet与 Postfix/Dovecot 建立原始 TCP 连接,逐行发送 SMTP/IMAP 命令,观察每一行响应。这是毕业设计答辩时最硬核的演示方式,也是生产环境排错的最后防线。

6.1 用swaks模拟外部 SMTP 发信:验证 Postfix + Amavis + ClamAV 全链路

swaks是测试 SMTP 的瑞士军刀。安装后,执行:

# 安装 swaks(Ubuntu/Debian) sudo apt install swaks # 模拟 Gmail 发信到你的 EwoMail(替换 yourdomain.com 和 recipient) swaks --to recipient@yourdomain.com \ --from sender@gmail.com \ --server mail.yourdomain.com:25 \ --auth-user recipient@yourdomain.com \ --auth-password your_password \ --body "Test email from swaks" \ --debug

关键观察点:

  • DEBUG输出中,查找<<< 250 2.0.0 Ok: queued as ...—— 表示 Postfix 接收成功;
  • 若出现<<< 451 4.3.2 Service unavailable,检查amavisd是否在监听 10024;
  • 若出现<<< 554 5.7.1 Service unavailable,检查clamd是否运行(swaks会触发 Amavis 调用 ClamAV);
  • 最终在/var/vmail/yourdomain.com/recipient/new/下应看到.eml文件,证明邮件落地。

6.2 用telnet手动登录 IMAP:验证 Dovecot 认证与邮箱列表

# 连接到 Dovecot IMAP 端口 telnet mail.yourdomain.com 143 # 依次输入(每行后按回车): a LOGIN "recipient@yourdomain.com" "your_password" b LIST "" "*" c SELECT INBOX d FETCH 1 BODY[HEADER] e LOGOUT

预期响应:

  • a OK Login completed.—— 认证成功;
  • b * LIST (\HasNoChildren) "/" "INBOX"—— 邮箱列表正常;
  • c * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)—— 邮箱属性正确;
  • d * 1 FETCH (BODY[HEADER] {1234})—— 邮件头可读;
  • e OK Logout completed.—— 安全退出。

避坑提示:若LOGIN返回NO [AUTHENTICATIONFAILED],检查 Dovecot 的auth_mechanisms是否包含PLAIN LOGIN(conf/dovecot/conf.d/10-auth.conf),以及password_query的 SQL 是否返回了正确的password字段。

6.3 构建自动化验证脚本:每天凌晨检查核心服务健康度

把上述手动操作变成定时任务,是运维成熟的标志。创建/home/wwwroot/ewomail/check_health.sh:

#!/bin/bash # EwoMail 健康检查脚本 LOG="/var/log/ewomail_health.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "[$DATE] 开始健康检查" >> $LOG # 检查服务进程 for svc in postfix dovecot amavisd clamav-daemon nginx php7.4-fpm; do if systemctl is-active --quiet $svc; then echo "[$DATE] $svc: OK" >> $LOG else echo "[$DATE] $svc: FAILED" >> $LOG # 发送告警(可选) # echo "$svc down at $DATE" | mail -s "EwoMail Alert" admin@yourdomain.com fi done # 检查 Postfix 队列 QUEUE_COUNT=$(postqueue -p | grep "Mail queue is empty" | wc -l) if [ "$QUEUE_COUNT" -eq 1 ]; then echo "[$DATE] Postfix queue: EMPTY" >> $LOG else echo "[$DATE] Postfix queue: NOT EMPTY" >> $LOG fi # 检查 MySQL 连接 if mysql -u ewomail -p'your_password' -D ewomail -e "SELECT 1;" >/dev/null 2>&1; then echo "[$DATE] MySQL: OK" >> $LOG else echo "[$DATE] MySQL: FAILED" >> $LOG fi echo "[$DATE] 健康检查结束" >> $LOG

赋予执行权限并加入 crontab:

chmod +x /home/wwwroot/ewomail/check_health.sh # 每天凌晨 2 点执行 echo "0 2 * * * /home/wwwroot/ewomail/check_health.sh" | sudo crontab -e

从那以后我每次部署新环境,都强制走一遍swaks和telnet手动会话——不是为了炫技,而是因为 GUI 的“绿色对勾”太容易骗人,只有 TCP 层的原始响应,才不会说谎。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 8:11:34

C++手写我的世界简易版:单文件源码解析与编译避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 8:11:35

卵巢癌类器官的无酶释放:全合成纳米纤维水凝胶培养与收获指南

卵巢癌类器官这几年几乎成了药敏检测的标准模型&#xff0c;但真正养过原代类器官的人都知道&#xff0c;把类器官养出来只算走完一半路&#xff0c;把它从培养基质里完整收出来才是最容易翻车的地方。传统方案里&#xff0c;大家默认用动物源基质胶做三维包埋&#xff0c;收获…

作者头像 李华
网站建设 2026/10/23 8:11:35

配电网时序潮流计算:含分布式电源与电动汽车的建模与仿真方法

1. 配电网潮流计算的新挑战&#xff1a;多源异构电源接入后的本质变化这几年做配电网相关的项目&#xff0c;一个很明显的感觉是&#xff1a;传统配电网的“被动消纳”模式正在被彻底打破。过去配电网是一条单向辐射状网络&#xff0c;潮流从变电站母线流向各个负荷节点&#x…

作者头像 李华
网站建设 2026/10/23 8:11:34

2026年9月22日:秋分、周二与100天倒计时的三层时间坐标

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 8:11:34

告别厂商绑定:开源能源管理系统MyEMS的架构拆解与实战部署

做了这么多年工厂能源管理项目&#xff0c;我隔三差五就会接到一种诉苦&#xff1a;当时花了十几万上的系统&#xff0c;现在想多加一块水表&#xff0c;厂商要收五千&#xff1b;想导点原始数据出来给财务对账&#xff0c;对方说要提需求单排期&#xff1b;更别提系统用了两三…

作者头像 李华
网站建设 2026/10/23 10:08:03

SSM+Vue+微信小程序三端联动小区管理系统实战

简介&#xff1a;本资源是一套面向计算机专业本科生的毕业设计实战项目&#xff0c;聚焦基于微信小程序的小区物业管理系统开发&#xff0c;适用于Java Web开发初学者与课程设计、毕设选题参考者。系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;后端框架&#xff…

作者头像 李华