测试环境Sandbox/catch(catchall)邮件配置:拦截外发邮件至指定邮箱
测试环境邮件自动转发到单个邮箱的解决方案
当然可以!这种测试场景太普遍了——既不想让测试邮件跑到真实用户手里,又得验证邮件的目标地址、内容是不是完全正确,包括你输入真实邮箱的情况。给你几个实用的方案:
1. 邮件服务器层面重定向(最推荐)
如果你们测试环境用的是自建邮件服务器(比如Postfix、Exim),直接在服务器上配置规则,就能让所有 outgoing 邮件不管目标是谁,最终都转发到你的测试邮箱,而且原始收件人信息会完整保留(你能在邮件的To:字段看到原本要发的地址)。
举个Postfix的配置例子:
- 打开
main.cf,添加或修改:virtual_alias_maps = hash:/etc/postfix/virtual - 编辑
/etc/postfix/virtual文件,添加一行全局匹配规则:/.+/ your-test-email@example.com - 执行命令让配置生效:
postmap /etc/postfix/virtual postfix reload
这样所有测试环境发出的邮件都会自动转到你的测试邮箱,你能完整验证邮件的生成逻辑,完全不用担心泄露。
2. 应用层拦截替换(适合没法改邮件服务器的场景)
如果没法操作邮件服务器,可以在应用代码里加个测试环境专属的拦截逻辑:发送邮件时,把原始收件人、抄送人信息放到邮件正文或自定义邮件头里,再把实际收件人换成测试邮箱。
比如用Python的示例代码:
import smtplib from email.mime.text import MIMEText def send_email(to_address, subject, body, env="production"): if env == "test": # 测试环境:保留原始收件人信息,转发到测试邮箱 modified_body = f"⚠️ 测试环境邮件 | 原始收件人: {to_address}\n\n{body}" actual_to = "your-test-email@example.com" subject = f"[测试] {subject}" else: # 生产环境:正常发送 modified_body = body actual_to = to_address # 构建并发送邮件 msg = MIMEText(modified_body) msg['Subject'] = subject msg['To'] = actual_to # 这里替换成你的邮件服务器配置 with smtplib.SMTP('your-smtp-server', 587) as server: server.starttls() server.login('your-username', 'your-password') server.send_message(msg)
这样你收到测试邮件时,一眼就能看到原本要发送的真实地址,同时不会真的发给用户。
3. 用邮件测试工具捕获邮件
还有个更省心的办法:用Mailhog或Mailcatcher这类工具,它们会在测试环境搭建一个本地的“假邮件服务器”,所有应用发送的邮件都会被捕获到工具的Web界面里,你可以在界面里查看每封邮件的原始收件人、内容、附件,完全不会发送到真实邮箱。
配置也很简单:只需要把应用的SMTP服务器地址改成这些工具的地址(比如Mailhog默认是localhost:1025),就能自动捕获所有测试邮件了。
最后提醒
- 一定要通过环境变量控制这些逻辑的开关,确保只在测试环境启用,千万别误用到生产环境!
- 如果是团队测试,可以把测试邮箱设为共享邮箱,方便大家一起查看验证。
内容的提问来源于stack exchange,提问作者realbart
相关产品推荐
相关产品推荐

