如何让 postfix 通过命令传递信息

如何让 postfix 通过命令传递信息

我已经设置了一个 postfix 服务器,它将接收多封电子邮件并将它们发送到 OpenERP。它目前运行正常,但我想改进整体架构,以便 postfix 可以向 OpenERP 电子邮件别名发送(即 Delivered-To)。

有关安装的更多详细信息

大架构如下:

  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. 然后我有“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

我找到的解决方案摘要:

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

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

  3. 创建与您的 OpenERP 域相匹配的传输图,以便传送到先前在 中定义的脚本master.cf

  4. 使用 来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

相关内容