Criando um alias de postfix “[email protected]” para enviar para todos os usuários de um domínio

4

Estou usando o Postfix + Dovecot com um banco de dados MySQL como backend e PostfixAdmin para administrar usuários e domínios. Agora estou procurando uma abordagem fácil e automatizada para definir o alias por domínio do padrão [email protected] com a resolução para todos os usuários do domínio fornecido. Eu quero configurá-lo uma vez, e ele continuará funcionando como esperado, mesmo se as contas forem adicionadas ou excluídas - portanto, criar um arquivo com uma lista de contas manualmente ou usar alguma lista de e-mails não oferece opções.

Deve ser muito fácil recuperar todos os usuários existentes de um determinado domínio do banco de dados:

SELECT username
  FROM vmail
 WHERE domain='%d';

(com %d sendo o espaço reservado para o domínio). Mas como posso dizer ao postfix para fazer isso por e-mails direcionados a [email protected] e, claro, somente quando esse e-mail vem de uma fonte confiável ( permit_sasl_authenticated , permit_mynetworks ?)?

Eu pesquisei por algumas horas agora, mas tudo o que encontrei foram "catch-alls" (exatamente o oposto do que eu quero), soluções baseadas em shell scripts (caminhando no diretório do domínio) ou usando abordagens de lista de discussão - nada disso se ajusta às minhas necessidades.

    
por Izzy 24.08.2015 / 16:49

1 resposta

5

Você pode usar virtual_alias_maps para definir o alias [email protected]. Aqui o formato usado por virtual 5 .

pattern address1, address2, address3, ...

Então você precisa construir uma consulta para concatenar todas as linhas. Retirado desta discussão: Posso concatenar várias linhas MySQL em um campo? ? , você pode usar essa consulta.

SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
  FROM vmail
 WHERE DOMAIN='%d'
   AND '%s'='all@%d'

Isso precisa ir para o seu mysql_virtual_alias_maps.cf e pode ser anexado à consulta existente usando UNION - para que o resultado pareça, por exemplo, assim:

query = SELECT goto FROM alias WHERE address='%s' AND active = '1' UNION 
SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
  FROM vmail
 WHERE DOMAIN='%d'
   AND '%s'='all@%d'

(pode ser necessário estar todos em uma linha - a formatação aqui é aplicada apenas para facilitar a leitura).

Para permitir somente permit_mynetworks e allow_sasl_authenticated, coloque a restrição na seguinte ordem

smtpd_recipient_restrictions =  ....
                        permit_mynetworks
                        permit_sasl_authenticated
                        check_recipient_access regexp:/etc/postfix/restrict.all.alias
                        reject_unauth_destination

Em /etc/postfix/restrict.all.alias, defina

/^all@/  REJECT access denied

Ele permitirá o e-mail para todos os domínios @ quando enviados pela mynetworks ou enviados por um usuário autenticado, mas serão rejeitados depois disso.

    
por 24.08.2015 / 17:38

Tags