我正在构建一个小型票务系统,其中基本上我的电子邮件服务器的一些邮件帐户被传输到负责处理电子邮件的 PHP 脚本中。
服务器正在运行,我可以通过 SMTP 发送电子邮件而不会出现任何问题,我也可以在用户虚拟邮箱上接收它们并通过 IMAP 访问它们。
但是,有一个问题,我正在使用这条规则来传输电子邮件:
smtpd_recipient_restrictions = check_recipient_access mysql:/etc/postfix/mysql-virtual-recipient-access.cf, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
/etc/postfix/mysql-virtual-recipient-access.cf
基本上,每次将特定邮箱传送到 PHP 时,引用的 SQL 查询都会返回以下内容:
FILTER ticket:dummy
然后我有一个master.cf
像这样定义的钩子:
ticket unix - n n - - pipe
flags=F user=www-data argv=/webroot/tiketman/AppCore/Mail/Incoming.php ${sender} ${size} ${recipient}
如果我从服务器内部或外部的地址发送电子邮件,此设置可以正常工作,但是像Mail Delivery Notifications
源自我的服务器一样退回电子邮件,例如
<[email protected]>: Host or domain name not found. Name service error for
name=sfasdadf.com type=A: Host not found
不会被过滤,也不会通过管道传输到 PHP 并最终到达用户邮箱。
以下是/var/log/mail.log
发送测试电子邮件并收到错误返回的情况:
Sep 19 23:09:11 mail postfix/smtp[8773]: 764E2409DF: to=<[email protected]>, relay=none, delay=0.14, delays=0.11/0.01/0.02/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=sfasdadf.com type=A: Host not found)
Sep 19 23:09:11 mail postfix/cleanup[8771]: 970D2409E1: message-id=<[email protected]>
Sep 19 23:09:11 mail postfix/bounce[8774]: 764E2409DF: sender non-delivery notification: 970D2409E1
Sep 19 23:09:11 mail postfix/qmgr[8638]: 970D2409E1: from=<>, size=3583, nrcpt=1 (queue active)
Sep 19 23:09:11 mail postfix/qmgr[8638]: 764E2409DF: removed
Sep 19 23:09:11 mail dovecot: lmtp(8777): Connect from local
Sep 19 23:09:11 mail dovecot: lmtp(8777, [email protected]): FXZGJnebHFRJIgAAvu7YNA: msgid=<[email protected]>: saved mail to INBOX
Sep 19 23:09:11 mail postfix/lmtp[8776]: 970D2409E1: to=<[email protected]>, relay=mail.ptdyncs.com[private/dovecot-lmtp], delay=0.04, delays=0.01/0.01/0.01/0.02, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> FXZGJnebHFRJIgAAvu7YNA Saved)
Sep 19 23:09:11 mail dovecot: lmtp(8777): Disconnect from local: Client quit (in reset)
Sep 19 23:09:11 mail postfix/qmgr[8638]: 970D2409E1: removed
我该如何解决这个问题,而又不改变这个东西的架构,因为我需要能够为每个虚拟用户设置一个钩子来处理 SQL 中的消息(或不处理任何消息)。谢谢。
答案1
是的,这是预期行为。你的弹跳没有通过,check_recipient_access
因为邮件传输协议指令,从您的日志来看,退回的电子邮件永远不会触及邮件传输协议完全 (反弹 -> qmgr -> lmtp)
您的问题的一个可能的解决方案是使用transport_maps
而不是check_recipient_access
。此指令由进程调用trivial-rewrite
,所有电子邮件都应通过此特殊进程,无论电子邮件是否弹跳,邮件传输协议或者捡起。此方法有一些注意事项,稍后将进行说明。
为了使此方法有效,您应该修改 SQL 查询,以便它返回
ticket:dummy
代替
FILTER ticket:dummy
为您的特殊用户。
此方法的注意事项是您的 mysqld 必须永远无法访问。SQL 服务器死机 = 没有邮件流。您可以在以下位置查看有关此问题的一些建议此主题。