Como encaminhar e-mail de entrada para seu aplicativo com o Exim

dwori / Shutterstock. com
Exim é um agente de transferência de mensagens (MTA) popular para sistemas Unix. Ele oferece uma ampla variedade de opções de rotas e transporte. Neste artigo, mostraremos como usar o Exim para canalizar e-mails recebidos em seu próprio script.
Presumiremos que você já tem um servidor Exim funcionando que é capaz de receber e-mails. O wiki oficial fornece orientação informativa se você estiver começando do zero com uma nova instalação.
Gerenciando a configuração Exim
As abordagens de configuração disponíveis variam de acordo com a distribuição do sistema operacional. Uma instalação Exim construída a partir da fonte usará src / configure. default como seu arquivo de configuração.
O arquivo para Exim instalado a partir de um gerenciador de pacotes é normalmente / etc / exim / config ou /etc/exim. conf. Você pode encontrar o caminho que é usado atualmente executando exim -bP configure_file.
Os sistemas operacionais baseados em Debian têm um sistema um pouco mais complicado. Existem dois métodos de configuração possíveis: um único arquivo, /etc/exim4/exim4. conf. template, ou arquivos de configuração divididos em /etc/exim4/conf.d. Você precisa executar update-exim4. conf depois de fazer as alterações. Isso cria um único arquivo mesclado que é realmente lido pelo Exim.
Publicidade
O Exim deve ser reiniciado toda vez que você alterar sua configuração. Execute o service exim4 restart para aplicar suas alterações.
Criando um roteador
A primeira etapa para enviar e-mail para seu aplicativo é definir um roteador personalizado. Os roteadores comparam os e-mails recebidos com um conjunto de condições para determinar o mecanismo de entrega a ser usado.
Os roteadores são processados na ordem sequencial em que se encontram no arquivo de configuração. Qualquer roteador acima do seu no arquivo pode corresponder primeiro aos e-mails recebidos.
Adicione o seu roteador ao seu arquivo de configuração na seção CONFIGURAÇÃO DOS ROTEADORES. Se estiver usando a configuração dividida do Debian, você pode criar um novo arquivo em /etc/exim4/conf.d/routers. Os roteadores serão combinados em ordem alfabética quando você usar essa abordagem.
Este é um exemplo de roteador:
roteador_exemplo: driver = aceitar domínios = transporte_exemplo. com = transporte_exemplo
Este é um roteador básico que corresponde a qualquer e-mail enviado para example. com. Quando uma correspondência é processada, o Exim aceitará a mensagem e a entregará usando o transporte example_transport. Vamos criar isso a seguir.
Criação de um transporte
Depois que um e-mail é aceito por um roteador, ele é entregue por um transporte. Os transportes são responsáveis por implementar a rotina de entrega de mensagens. Drivers diferentes podem enviar pela Internet usando SMTP, transferir para um usuário Unix local ou gravar em um arquivo.
Publicidade
A criação de um transporte personalizado com base em um driver integrado permite enviar e-mails correspondentes ao seu próprio aplicativo. Você pode então lidar com cada e-mail individualmente, fora do Exim.
Ao contrário dos roteadores, a ordem dos transportes não importa. Cada e-mail recebido corresponderá ao único transporte especificado pelo roteador que o aceita. Adicione seu transporte em qualquer lugar na seção CONFIGURAÇÃO DE TRANSPORTES de seu arquivo Exim. Os usuários Debian com configuração dividida ativada podem criar um arquivo em /etc/exim4/conf.d/transports.
Este é um transporte que invoca um script PHP:
example_transport: driver = pipe command = / usr / bin / php /var/www/html/handle_incoming_email. php user = www-data group = www-data
Quando combinado com o roteador de exemplo acima, qualquer e-mail enviado para @ example. com será entregue para handle_incoming_email. php. O Exim fornece todo o e-mail em formato compatível com RFC como a entrada padrão do comando para você ler em sua linguagem de programação.
// Obtenha o conteúdo do e-mail a partir da entrada padrão em PHP $ email = fopen & # 40; " php: // stdin ", " r " & # 41 ;; // Para: usuário@example. com// Assunto: E-mail de demonstração // // Este é um e-mail.
O transporte é configurado com o driver de tubo. Isso usa um canal Unix para fornecer o e-mail de entrada ao seu comando. O comando será executado como o usuário e grupo que você especificar.
Usando variáveis de ambiente
O Exim irá definir várias variáveis de ambiente antes de executar o seu comando. Eles podem ser usados para acessar informações sobre a mensagem sem a necessidade de analisar o formato completo do e-mail.
As variáveis disponíveis incluem:
- DOMÍNIO – O domínio para o qual o e-mail recebido foi enviado.
- MESSAGE_ID – ID interno do Exim que representa o e-mail.
- DESTINATÁRIO – O endereço de e-mail para o qual a mensagem foi enviada.
- SENDER – O endereço de e-mail de origem da mensagem.
Você pode adicionar variáveis adicionais ao ambiente do comando, definindo a opção de ambiente em seu transporte. Isso aceita uma lista separada por vírgulas de pares de valores-chave:
transporte_exemplo: ambiente = foo = bar, demo = exemplo
Valores de retorno
Seu comando deve sair com um código de status 0 para confirmar uma entrega bem-sucedida. Um código de saída diferente de zero será interpretado como uma falha na entrega. O remetente receberá uma mensagem devolvida.
Publicidade
Este comportamento é desabilitado configurando a opção ignore_status em seu transporte. O Exim tratará os códigos de status diferentes de zero como bem-sucedidos.
Além disso, você pode usar a opção temp_errors para definir os códigos de saída do script que indicam que um erro foi encontrado, mas deve ser temporário. Quando o Exim vê um desses códigos de status, a entrega da mensagem será adiada e tentada novamente mais tarde.
O conteúdo das mensagens devolvidas pode ser personalizado com a opção return_fail_output. Quando definido como verdadeiro, o Exim incluirá o conteúdo da saída padrão do seu script no e-mail devolvido. O mecanismo facilita o uso do código do seu aplicativo para fornecer respostas de rejeição personalizadas aos remetentes.
Invocação de comando
O Exim geralmente invoca o seu comando diretamente do transporte. Se você definir a opção use_shell, ele passará o comando para / bin / sh. Isso pode ser útil em cenários em que seu script requer que um ambiente de shell completo esteja disponível.
A execução do comando atinge o tempo limite após uma hora com a configuração padrão. Um tempo limite é tratado como um erro de entrega. O comando será encerrado e uma mensagem devolvida retornada ao remetente. O tempo limite pode ser personalizado com a configuração de tempo limite. Além disso, definir a opção timeout_defer fará com que os tempos limites sejam tratados como erros temporários, permitindo outra tentativa de entrega após um atraso.
example_transport: timeout = 5m timeout_defer
Publicidade
Você também deve considerar que o seu script pode ser executado simultaneamente se vários e-mails chegarem ao mesmo tempo. Seu aplicativo deve ser capaz de suportar essa possibilidade. Os sistemas de bloqueio que permitem que apenas uma instância seja executada simultaneamente devem ser desabilitados para o seu script de gerenciamento de e-mail.
Conclusão
O Exim é facilmente configurado para rotear e-mails recebidos para o seu próprio aplicativo. Uma configuração simples que direciona todas as mensagens recebidas pode ser alcançada com um roteador básico acoplado a um transporte usando o driver de pipe.
Você precisa fornecer um binário que aceite um e-mail na entrada padrão como parte de seu aplicativo. O binário será invocado pelo Exim sempre que uma nova mensagem for recebida. Você deve então analisar o e-mail de maneira compatível com os padrões para extrair o conteúdo do corpo e os cabeçalhos das mensagens relevantes para o seu sistema.
Nenhum comentário