You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Exim4 邮件投递状态触发脚本需求咨询

Exim4 邮件投递状态触发脚本需求咨询

当然可以!Exim4本身就自带了专门的钩子机制,完全不用你去手动tail日志、写复杂的解析脚本——正好精准匹配你的需求。我给你拆解下具体怎么实现,一步步来:

  • 1. 利用Transport的钩子触发脚本(核心方案)
    Exim4的transport配置是处理邮件投递的核心模块,它支持on_success和on_failure两个关键选项,分别在邮件成功投递、投递失败/退回时调用外部脚本。

比如你配置远程SMTP投递的transport(通常在/etc/exim4/conf.d/transports/30_exim4-config_remote_smtp这类文件里),可以这样修改:

remote_smtp:
  driver = smtp
  # 保留原来的其他配置项...
  # 成功投递时触发脚本,传递收件人、发件人、邮件ID等参数
  on_success = /usr/local/bin/exim_delivery_success.sh $recipients $sender_address $message_id
  # 投递失败时触发脚本,额外传递失败状态码
  on_failure = /usr/local/bin/exim_delivery_failure.sh $recipients $sender_address $message_id $delivery_status

这里的$recipients、$delivery_status都是Exim的内置变量,会自动把投递的关键信息传递给脚本,你不用自己去解析日志提取。

  • 2. 编写处理脚本的注意事项
    脚本的逻辑完全由你自定义,但要注意几个细节:
    • 给脚本加可执行权限:chmod +x /usr/local/bin/exim_delivery_success.sh
    • 确保Exim的运行用户(通常是Debian-exim)能执行脚本、读写相关文件,避免权限问题
    • 脚本要尽量轻量化,如果有复杂的处理逻辑(比如写入数据库),最好把耗时操作放到后台执行,比如nohup /usr/local/bin/heavy_process.sh &,别阻塞Exim的投递队列

举个失败脚本的简单例子,用来标记无效邮箱:

#!/bin/bash
RECIPIENT=$1
DELIVERY_STATUS=$4

# 识别收件人不存在的错误(比如550状态码)
if echo "$DELIVERY_STATUS" | grep -q "550"; then
  # 这里可以把邮箱写入无效列表或者更新数据库
  echo "$RECIPIENT" >> /var/lib/exim4/invalid_recipients.txt
fi
  • 3. 实时监控批量投递状态
    你可以在成功/失败脚本里,把投递状态以结构化的格式(比如JSON)写入一个日志文件或者数据库:
# 成功脚本里的示例代码
echo '{
  "timestamp": "'$(date -Iseconds)'",
  "recipient": "'$1'",
  "status": "success",
  "message_id": "'$3'"
}' >> /var/log/exim_delivery_monitor.log

之后不管是用tail -f实时查看,还是写个简单的小工具(比如Python Flask页面)解析这个日志展示,都能轻松实现批量发送的实时监控。

  • 4. 生效配置并测试
    修改完Exim的配置文件后,记得重新加载配置让它生效:
systemctl reload exim4

然后发几封测试邮件(包括故意发一个不存在的邮箱),检查脚本是否触发,无效邮箱列表或者监控日志是否有正确记录。

这种方案比解析日志可靠太多了——是Exim主动通知脚本,不会因为日志轮转、格式变化导致漏处理,完美适配你自动标记无效邮箱和实时监控的需求。

备注:内容来源于stack exchange,提问作者Pownyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:19:52