后缀:pipe道脚本反弹发送到特定的虚拟用户

我正在build立一个小票系统,基本上我的电子邮件服务器的一些邮件帐户被传送到一个PHP脚本,将照顾电子邮件。

服务器正在运行,我可以通过SMTP发送电子邮件,没有任何问题,我也可以在用户虚拟邮箱上接收它们,并通过IMAP访问它们。

但是,有一个问题,我使用这个规则来pipe理电子邮件:

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引用的SQL查询语句每次都应该将特定邮箱传递给PHP时返回以下内容:

 FILTER ticket:dummy 

然后我有一个在master.cf定义的钩子,像这样:

 ticket unix - nn - - 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发送testing邮件并接收错误:

 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消息(或者没有)。 谢谢。

是的,是有意的行为。 你的反弹没有通过check_recipient_access因为smtpd指令和你的日志,反弹电子邮件根本不触摸smtpd (反弹 – > qmgr – > lmtp)


您的问题的一个可能的解决scheme是使用transport_maps而不是check_recipient_access 。 这个指令是由trivial-rewrite过程调用的,所有的电子邮件都应该通过这个特殊的过程,无论电子邮件是反弹smtpd还是皮卡 。 这个方法有一些注意事项,后面会解释。

对于这种方法,你应该修改SQL查询,使其返回

 ticket:dummy 

代替

 FILTER ticket:dummy 

为您的特殊用户。

这种方法的注意事项是你的mysqld绝不可能无法到达,永远不可能。 SQL服务器死了=没有邮件stream。 您可以在此主题中查看关于此事的一些build议。