我已经build立了一个后缀服务器,将收到几封电子邮件,并将其发送给OpenERP。 目前它正在工作,但是我想改进总体模式,以便postfix将OpenERP邮件别名发送(即Delivered-To)。
大scheme如下:
安装了postfix-pgsql 。 在我的main.cf文件中,我有这样的东西:
alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = localhost virtual_alias_domains = mydomain.com virtual_alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf
在pgsql-aliases.cf的查询
query = SELECT 'oerp@localhost' FROM mail_alias a, ir_config_parameter d WHERE (d.key = 'mail.catchall.domain') AND (d.value = '%d') AND (a.alias_name = '%u');
然后我在/etc/aliases有“oerp” /etc/aliases :
oerp: "| openerp_mailgate ...args... "
这个设置工作得很好。 邮件正在交付等。但是,然后,我有一个失控的MTA(我的后缀可以中继到外部人),将邮件传递到我的后缀“mydomain.com”。
在这个MTA中有几个规则。 比如,我给你发邮件到“[email protected]”,MTA会把邮件重新发送到“[email protected]”和“[email protected]”。 该重新投递不会触及原始标题。
“[email protected]”将交给我的后缀,最终,它将最终被传送到邮件门户脚本。 但“Delivered-To”标题将被改为“oerp @ localhost”。
OpenERP查找消息的“Delivered-To”头(等等),以知道如何处理它。 但在这种情况下,“Delivered-To”将始终如一,因此我们不能将其用于任何重要的事情。
我想更改模式,以便postfix将邮件发送到我的mailgate脚本,而不诉诸“oerp @ localhost”别名和“Delivered-To”保持不变(在这个例子中,它预计是“contact @ mydomain。 COM“)。
有任何想法吗? 我一直在玩master.cf但没有完成任何事情。
用脚本删除与“oerp @ localhost”匹配的别名。
将脚本作为pipe道放在master.cf 。
创build一个与您的OpenERP域相匹配的传输映射,以便将其传递到先前在master.cf定义的脚本。
使用pg_aliases.cf作为虚拟邮箱地图,而不是别名。 然后删除/etc/aliases中的oerp /etc/aliases 。
以前的解决scheme只是为每个匹配提供相同的别名,导致“Delivered-To”的不可靠性。 现在我所做的是重新整理整个解决scheme,并使用虚拟邮箱来代替:
virtual_mailbox_domains = mydomain.com virtual_mailbox_maps = pgsql:/etc/postfix/pg-aliases.cf
这对问题提出了另一种看法,而IMO更为正确:相反,对每封邮件给予相同的“别名”邮箱,只需find一个肯定的虚拟邮箱即可。
pg-aliases.cf被修改了(虽然这不是严格的需要,我觉得为了logging目的更方便):
query = SELECT '%u@%d' FROM mail_alias a, ir_config_parameter d WHERE (d.key = 'mail.catchall.domain') AND (d.value = '%d') AND (a.alias_name = '%u');
现在您需要定义一个实际将传入邮件传递到mailgate脚本的传输。 这是分两步完成的:
首先,在master.cf文件中configurationmailgate脚本,如下所示:
openerp unix - nn - 1 pipe flags=DFR user=openerp argv=/path/to/mailgate.py -d dbname ... etc ..
注意1作为限制。 这样做是为了不可能对OpenERP服务器进行并发访问,否则由于事务隔离,来自几个@mydomain.com地址的消息可能会在数据库中加倍。
写一个简单的/etc/postfix/transports文件:
mydomain.com openerp
并指示main.cf读取此传输文件:
transport_maps = hash:/etc/postfix/transports
如果你有唯一的虚拟域是这个,你可能会忘记使用virtual_transport=openerp的传输图。 但是,您可能会发现有其他内部域用于内部消息等。
一种替代解决scheme:通过使用参数prepend_delivered_header ,可以在pipe道到命令时closuresDelivery-To标题。 当delivery-To头缺失时,OpenERP将查找To头。
将此行添加到main.cf
prepend_delivered_header = file, forwarding
这将禁用Delivery-To通过命令交付时添加。
postfix的文档在下面说prepend_delivered_header
prepend_delivered_header(默认:命令,文件,转发)
Postfix本地(8)传送代理程序将邮件传递到的地址预先传递给“已发送:”邮件标头的邮件传送上下文。 此信息用于邮件传递循环检测。
默认情况下,Postfix本地传送代理在转发邮件时以及在传送到文件(邮箱)和命令时预先设置Delivered-To:标题。 不build议在转发邮件时closuresDelivered-To:标题。
指定零个或多个转发,文件或命令。