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

如何配置Exim4使VM自发送邮件并本地捕获特定域名邮件?

当然可行啦!这其实是Exim4非常实用的本地测试场景,我之前刚好帮朋友配置过类似需求,给你一步步拆解实现方法:

核心思路

我们要给目标域名设置一条高优先级的本地路由规则,让Exim4在处理发往该域名的邮件时,直接跳过外部发送流程,转而把邮件交给你的PHP脚本处理——和接收外部邮件时的逻辑完全一致。

具体配置步骤

1. 添加本地路由规则

首先找到Exim4的配置文件:

  • 如果你用的是单文件配置(比如/etc/exim4/exim4.conf),直接编辑这个文件;
  • 如果你用的是Debian/Ubuntu默认的拆分配置,就在/etc/exim4/conf.d/router/目录下新建一个自定义路由文件(比如99_local_test_router,数字越大优先级越高)。

在路由配置里添加以下规则:

local_test_router:
  driver = accept
  domains = your-target-domain.com  # 替换成你要拦截的特定域名
  transport = local_php_script_transport
  no_more  # 关键:匹配后不再走其他外部发送路由

2. 配置邮件传输规则

接下来要定义上面路由里用到的local_php_script_transport,告诉Exim4把邮件传给你的PHP脚本。在传输配置区域操作:

  • 单文件配置直接在文件里找TRANSPORTS部分;
  • 拆分配置则在/etc/exim4/conf.d/transport/下新建文件(比如99_local_php_transport)。

添加以下内容:

local_php_script_transport:
  driver = pipe
  command = /usr/bin/php /path/to/your/processing-script.php  # 替换成你的PHP脚本绝对路径
  user = www-data  # 脚本运行用户,根据你的环境调整(比如apache、www-data)
  group = www-data
  return_output  # 可选:捕获脚本输出,方便调试

这个pipe驱动会把邮件内容通过管道传给PHP脚本,和接收外部邮件时的处理逻辑完全一致。

3. 验证配置并重启服务

先检查配置有没有语法错误:

exim4 -bV

如果输出没有报错,就重启Exim4服务:

systemctl restart exim4

如果是拆分配置,记得先运行update-exim4.conf生成最终配置文件,再重启服务。

4. 测试效果

用sendmail发送测试邮件:

echo "Test email content" | sendmail test@your-target-domain.com

然后检查你的PHP脚本是否收到了邮件内容,同时查看Exim4日志(/var/log/exim4/mainlog),确认邮件没有被发送到外部,而是被本地处理了。

额外注意事项
  • 要拦截多个域名?把domains改成domains = domain1.com : domain2.com,用冒号分隔即可;
  • 确保PHP脚本有足够的权限读取管道内容,Exim4运行用户也需要有执行脚本的权限;
  • 如果调试时遇到问题,可以查看Exim4的mainlog和rejectlog,里面会有详细的路由匹配和传输日志。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:38