如何配置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
相关产品推荐
相关产品推荐

