我已经设置了一个 postfix 服务器,它将接收多封电子邮件并将它们发送到 OpenERP。它目前运行正常,但我想改进整体架构,以便 postfix 可以向 OpenERP 电子邮件别名发送(即 Delivered-To)。
有关安装的更多详细信息
大架构如下:
已安装
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');
然后我有“oerp”别名
/etc/aliases
:oerp: "| openerp_mailgate ...args... "
问题
此设置运行良好。邮件正在投递,等等。但是,我有一个不受我控制的 MTA(我的 postfix 可以为外部用户中继到它),它将发往“mydomain.com”的电子邮件中继到我的 postfix。
在该 MTA 中,有几条规则。例如,如果您将电子邮件发送至“[电子邮件保护]“,MTA 将重新将电子邮件投递至”[电子邮件保护]“ 和 ”[电子邮件保护]“。重新投递不会影响原始报头。
这 ”[电子邮件保护]“将传递给我的 postfix,最终,它将被传送到 mailgate 脚本。但“Delivered-To”标头将更改为“oerp@localhost”。
OpenERP 查找消息的“Delivered-To”标头(以及其他信息)以了解如何处理它。但在这种情况下,“Delivered-To”将始终相同,因此我们无法将其用于任何重要的事情。
我想更改架构,以便 postfix 将电子邮件发送到我的 mailgate 脚本,而无需诉诸“oerp@localhost”别名,并且“Delivered-To”保持不变(在示例中,它预计为“[电子邮件保护]“)。
有什么想法吗?我一直在玩,master.cf
但什么也没完成。
答案1
我找到的解决方案摘要:
删除与脚本匹配“oerp@localhost”的别名。
将脚本作为管道放置在
master.cf
。创建与您的 OpenERP 域相匹配的传输图,以便传送到先前在 中定义的脚本
master.cf
。使用 来
pg_aliases.cf
作为虚拟邮箱映射,而不是 来作为别名。然后删除 中的 oerp 别名/etc/aliases
。
长答案
以前的解决方案只是为每个匹配项提供相同的别名,导致“Delivered-To”不可靠。现在我所做的是重新设计整个解决方案并使用虚拟邮箱,例如:
virtual_mailbox_domains = mydomain.com
virtual_mailbox_maps = pgsql:/etc/postfix/pg-aliases.cf
这从另一个角度看待问题,在我看来更正确:不要给每封邮件提供相同的“别名”邮箱,只需找到积极的虚拟邮箱。
已pg-aliases.cf
修改(虽然这不是严格需要的,但我发现这对于记录目的来说更方便):
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 脚本。这分两步完成:
首先,在文件中配置 mailgate 脚本master.cf
,如下所示:
openerp unix - n n - 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
如果您拥有的唯一虚拟域是这个,您可能会忘记传输图的使用。但是,您可能会发现拥有其他内部域来处理内部消息等很有用。
答案2
Delivery-To
一个替代解决方案: 你可以在管道命令中使用参数关闭报头prepend_delivered_header
。当 delivery-To 报头缺失时,OpenERP 会查看To
报头。
将此行添加到main.cf
prepend_delivered_header = file, forwarding
Delivery-To
通过命令传递时将无法添加此功能。
这Postfix 文档下面说prepend_delivered_header
prepend_delivered_header(默认:命令、文件、转发)
Postfix local(8) 投递代理在 Delivered-To: 消息头中添加邮件投递地址的邮件投递上下文。此信息用于邮件投递循环检测。
默认情况下,Postfix 本地投递代理在转发邮件和投递到文件(邮箱)和命令时会添加 Delivered-To: 标头。不建议在转发邮件时关闭 Delivered-To: 标头。
指定零个或多个 forward、file 或 command。
答案3
经过很多头痛之后我整理此解决方案根据几个不同的来源,这大大减少了工作量,关键步骤是配置virtual_alias_domains
以及virtual_alias_maps
确保虚拟映射是到my-alias@localhost
而不是只是my-alias
。在我的示例中,命令别名是将电子邮件管道传输到网站 API 端点,但它也可以很容易地管道传输到其他东西。
以下是您需要采取的步骤:
- 为您的域名设置 A 和 MX 记录,A 记录 @ 指向您将在其上接收电子邮件的服务器的 IP,MX 记录的主机名是 @,值是
10 mail.your-domain-name
sudo apt-get install postfix
- 选择“互联网站点”并输入您的域名(完全合格)
sudo vi /etc/postfix/main.cf
mydestination
将 mail.your-domain-name 添加到值列表中- 附加
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual
到文件末尾
sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
sudo newaliases
sudo apt-get vi /etc/postfix/virtual_domains
example.net #domain
example.com #domain
your-domain-name #domain
(#domain 字段抑制警告)
sudo postmap /etc/postfix/virtual_domains
sudo apt-get vi /etc/postfix/virtual
info@your-domain-name [email protected]
everyone@your-domain-name [email protected] [email protected]
email_processor@your-domain-name curl_email@localhost
@your-domain-name [email protected]
[email protected] [email protected]
sudo postmap /etc/postfix/virtual
sudo /etc/init.d/postfix reload