如何使postfix通过命令传递

我已经build立了一个后缀服务器,将收到几封电子邮件,并将其发送给OpenERP。 目前它正在工作,但是我想改进总体模式,以便postfix将OpenERP邮件别名发送(即Delivered-To)。

有关安装的更多细节

大scheme如下:

  1. 安装了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 
  2. 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'); 
  3. 然后我在/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但没有完成任何事情。

我发现的解决scheme摘要:

  1. 用脚本删除与“oerp @ localhost”匹配的别名。

  2. 将脚本作为pipe道放在master.cf

  3. 创build一个与您的OpenERP域相匹配的传输映射,以便将其传递到先前在master.cf定义的脚本。

  4. 使用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:标题。

指定零个或多个转发,文件或命令。