Como fazer o postfix entregar através de um comando

2

Eu configurei um servidor de postfix que receberá vários e-mails e entregarei -los para OpenERP. Está funcionando atualmente, mas eu gostaria de melhorar esquema geral para que o postfix seja entregue (ou seja, Delivered-To) para o OpenERP alias de e-mail.

Mais detalhes sobre a instalação

O grande esquema é o seguinte:

  1. Instalado postfix-pgsql . No meu arquivo main.cf , tenho algo como:

    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. A consulta em 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. Então eu tenho o alias "oerp" em /etc/aliases :

    oerp: "| openerp_mailgate ...args... "
    

O problema

Esta configuração funciona razoavelmente bem. Mails estão sendo entregues, etc. Mas então, eu tem um MTA fora do meu controle (meu postfix pode retransmitir isso para pessoas de fora) que retransmite os e-mails que chegam para "mydomain.com" ao meu postfix.

Nesse MTA, existem várias regras. Por exemplo, eu e-mail para "[email protected]", o MTA irá re-entregar o email para "[email protected]" e "[email protected]". Que redelivery Não toque nos cabeçalhos originais.

O "[email protected]" será enviado para o meu postfix e, em última análise, será acabam sendo canalizados para o script mailgate. Mas o cabeçalho "Delivered-To" será ser alterado para "oerp @ localhost".

OpenERP procura o cabeçalho "Delivered-To" (entre outros) da mensagem para sabe o que fazer com isso. Mas neste caso o "Delivered-To" sempre será o mesmo e, portanto, não podemos usá-lo para nada importante.

Gostaria de alterar o esquema para que o postfix envie o email para o meu script mailgate sem recorrer ao alias "oerp @ localhost" e o "Delivered-To" permanece inalterado (no exemplo espera-se que seja "[email protected]").

Alguma ideia? Eu tenho jogado com o master.cf , mas não consegui realizar qualquer coisa.

    
por manu 11.09.2014 / 00:55

2 respostas

2

Resumo da solução que encontrei:

  1. Remova o alias que corresponde a 'oerp @ localhost' ao script.

  2. Coloque o script como um canal em master.cf .

  3. Crie um mapa de transporte que corresponda ao seu domínio OpenERP para ser entregue ao script definido anteriormente em master.cf .

  4. Use o pg_aliases.cf para um mapa de caixa de correio virtual em vez de alias. Em seguida, remova o alias oerp em /etc/aliases .

Resposta longa

A solução anterior simplesmente deu o mesmo alias para cada partida, resultando na falta de confiabilidade do 'Delivered-To'. Agora, o que fiz foi reformular toda a solução e usar uma caixa de correio virtual, como:

virtual_mailbox_domains = mydomain.com
virtual_mailbox_maps = pgsql:/etc/postfix/pg-aliases.cf

Isso leva outra visão ao problema, e o IMO está mais correto: Em vez de fornecer a mesma caixa de correio "aliased" para cada mensagem, simplesmente encontre uma caixa de correio virtual positiva .

O pg-aliases.cf foi modificado (embora isso não seja estritamente necessário, acho mais conveniente para fins de registro):

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');

Agora, você precisa definir um transporte que realmente entregue os e-mails recebidos ao script mailgate. Isso é feito em duas etapas:

Primeiro, configure o script mailgate no arquivo master.cf , assim:

openerp   unix  -       n       n       -       1       pipe
   flags=DFR user=openerp argv=/path/to/mailgate.py -d dbname ... etc ..

Observe que 1 como limite. Isso é feito para que o acesso simultâneo ao servidor OpenERP não seja possível, do contrário as mensagens provenientes de vários endereços @mydomain.com podem duplicar no banco de dados devido ao isolamento transacional.

Escreva um arquivo /etc/postfix/transports simples:

mydomain.com  openerp

E instrua main.cf a ler este arquivo de transporte:

transport_maps = hash:/etc/postfix/transports

Você pode esquecer o mapa de transporte use virtual_transport=openerp se o único domínio virtual que você tem é este. No entanto, você pode achar útil ter outros domínios internos para mensagens internas, etc.

    
por 11.02.2015 / 02:14
1

Uma solução alternativa: você pode desativar o cabeçalho Delivery-To quando canalizar para o comando usando o parâmetro prepend_delivered_header . Quando o cabeçalho delivery-To estiver faltando, o OpenERP examinará o To header.

Adicione esta linha a main.cf

prepend_delivered_header = file, forwarding

Isso desativará o Delivery-To que está sendo adicionado ao entregar via comando.

Os documentos do postfix disseram abaixo sobre prepend_delivered_header

prepend_delivered_header (default: command, file, forward)

The message delivery contexts where the Postfix local(8) delivery agent prepends a Delivered-To: message header with the address that the mail was delivered to. This information is used for mail delivery loop detection.

By default, the Postfix local delivery agent prepends a Delivered-To: header when forwarding mail and when delivering to file (mailbox) and command. Turning off the Delivered-To: header when forwarding mail is not recommended.

Specify zero or more of forward, file, or command.

    
por 09.02.2015 / 10:51

Tags