Executar script ao receber email

8

Eu executo um servidor de correio Postfix / Dovecot para uso pessoal. Há apenas algumas caixas de correio reais, essencialmente just [email protected]e [email protected].

Eu freqüentemente uso o virtualarquivo para criar caixas de correio virtuais encaminhadas para [email protected]. Eu tenho vários deles para contas descartáveis, como compras únicas em lojas online, jogos online que quero experimentar sem me preocupar com spam em andamento etc. Para fazer isso, SSH e execute os seguintes comandos:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
sudo postmap virtual
sudo service postfix restart

Faço isso com frequência suficiente para automatizar o processo até certo ponto. Eu considerei simplesmente escrever um script de shell que utilizasse a caixa de correio virtual e a caixa de correio real como argumentos e fizesse as alterações, mas estou esperando algo ainda mais fácil.

Gostaria de poder enviar um email [email protected]para outra caixa de correio no servidor com o nome da caixa de correio virtual como o corpo da mensagem. O problema seria as sudochamadas, mas posso criar um novo usuário cuja única responsabilidade é lidar com isso, que deve lidar com isso.

Principalmente a pergunta é a seguinte: como eu criaria um evento que seria acionado por um email? Existe um serviço em algum lugar que faz isso? Posso configurar o Postfix ou o Dovecot para escutar esse email e executar comandos nesse evento?

Adam Smith
fonte
Você verificou este link ?
precisa saber é o seguinte
@ Kirill-a não, eu não tinha. Parece que poderia ser proposto para resolver este problema, e agora eu finalmente ter uma boa razão para aprender PHP
Adam Smith
Você não precisa aprender PHP: basta substituir seu próprio shell script pelo script PHP e pronto.
MariusMatutiae
@MariusMatutiae se você ou kirill-a gostaria de escrever uma resposta sobre o tema, em seguida, (supondo que ele funciona) eu vou felizmente atribuir a recompensa
Adam Smith
@ Kirill-um ping de cortesia para o meu comentário, acima.
Adam Smith

Respostas:

8

O procedimento correto para executar um script (eu uso um script de shell) após o recebimento de uma mensagem de email é o seguinte. Envolve a modificação do arquivo de configuração do postfix , master.cf (que, no meu Debian, está localizado em / etc / postfix ) adicionando a seguinte linha:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

que instrui o postfix a executar o script (é necessário executá-lo) quando ocorrer algum evento.

Para especificar quando executar o script, faça o seguinte: suponha que ele seja executado quando [email protected] receber uma mensagem. Coloque a seguinte linha

 [email protected] FILTER my_shell_script:dummy

dentro do arquivo /etc/postfix/address.txt ; você precisará criar um banco de dados adequado para o postfix usar esse arquivo, o que você realiza por meio de

  postmap /etc/postfix/address.txt

que produz como saída um arquivo chamado /etc/postfix/address.db . Agora volte ao arquivo /etc/postfix/main.cf e adicione a seguinte linha:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Agora reinicie o postfix ,

  postfix reload

e você deve estar pronto para ir.

MariusMatutiae
fonte
2
Você não quer dizer 'check_recipient_access hash: / etc / postfix / address' aqui? Você usou "acesso" onde acho que quis dizer "endereço", com base em suas instruções.
Lee Fuller
3
É o mesmo se você estiver executando virtual_mailboxes para vários domínios virtuais? Eu segui essas instruções literalmente - e se eu não declarar um virtual_alias, recebo um retorno. Nesse caso, ele envia a mensagem para a caixa de correio, mas não aciona o script.
Lee Fuller
Eu não fiz isso funcionar. Esta resposta funcionou: serverfault.com/questions/322657/…
jlh 19/03/19
Pelo que entendi, essa solução também tem o problema de que ela só será acionada para mensagens recebidas por SMTP. sendmaildireto no servidor não acionará isso.
Philip Couling
@PhilipCouling Veja esta resposta: unix.stackexchange.com/a/179407 . Você pode usar a pickupopção
Stephan
4

Eu posso ver duas soluções óbvias.

Se você estiver usando o procmail como o MDA no seu servidor ou desejar converter para usá-lo, poderá executar qualquer script arbitrário em qualquer email arbitrário através da |ação de receita do procmail (canal). Esperamos que não seja iniciado como root, mas deve ser fácil criar um script que execute a mágica necessária e que possa ser invocado sem senha como root por um usuário relevante. A saída do script pode até ser alimentada novamente no mesmo e-mail e entregue posteriormente, transformando a receita em uma ação de filtro.

Uma alternativa (que deve exigir menos manutenção prática) é criar uma única caixa de correio e configurar o Postfix$recipient_delimiter para ser algo que normalmente não é usado para esse fim; por exemplo, .ou -. Observe que o address_delimeter é uma configuração para todo o servidor. Digamos que você configure a caixa de correio [email protected]e defina $recipient_delimeter = .. Isso permitirá então o dummy.<anything>@example.comque será entregue na caixa de correio local correspondente [email protected]. Para desativar um destes, adicionedummy.<whatever>@example.compara uma tabela de destinatários apropriada com uma ação de rejeição. A desvantagem é que ela será uma caixa de correio abrangente para o prefixo, portanto, você deve dificultar a localização do prefixo por acidentes ou ataques de dicionário. A vantagem é que, no caso normal (o remetente respeita seus desejos e não revende seu endereço de e-mail), essa abordagem não requer manutenção, e você sempre pode alterar seu prefixo posteriormente e listar explicitamente as combinações que deseja continuar recebendo e-mails. .

um CVn
fonte
Não estou vinculado ao Postfix por qualquer outro motivo que não seja o que tenho atualmente. Eu preferiria encontrar uma solução que funcionasse com o meu MDA / MTA atual, no entanto. Quanto delimitador de: Eu quase não confiar em que o remetente irá respeitar meus desejos e não revender o meu endereço de e-mail, ou eu estaria dando-lhes o endereço permanente :)
Adam Smith
@ AdamSmith A diferença é que, com algo como a minha segunda alternativa, você pode desativar o endereço que forneceu a uma entidade específica sem causar problemas em nenhum outro lugar, e os endereços parecem sensatos, mesmo para verificadores automáticos idiotas. Quanto à manutenção do MDA / MTA, o procmail pode ser usado como um substituto para o Postfix MDA; não é necessário substituir o Postfix como seu MTA.
um CVn
O procmail não é mais mantido: veja lwn.net/Articles/416901 , um artigo com o título: Relatos da morte de procmail não são terrivelmente exagerados. É melhor jogar com segurança e seguir a sugestão de @ kirill-a.
MariusMatutiae
O procmail ainda é bastante usado e (IMHO) continua sendo a melhor solução para a filtragem ad hoc. A observação de @ MariusMatutiae de que ele está efetivamente morto se aplica apenas ao seu desenvolvimento. Não consigo pensar em nenhum bug do procmail que experimentei e fiz coisas ridículas como implementar listas de discussão completas nele. Talvez não tenha recebido mais desenvolvimento, porque a única direção a seguir seria além do seu escopo (por exemplo, anti-spam, melhor atendido pelo SpamAssassin ou por exemplo, milter-greylist ).
Adam Katz
E você está dizendo isso para mim porque ....?
MariusMatutiae
2

Caso o link seja desativado, aqui está o resumo.

Primeiro, vá master.cfe registre seu script "myhook" adicionando a seguinte linha:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Além disso, edite a linha smtp para instruir o Postfix a executar o filtro para qualquer email que chegue pela entrega SMTP:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Observe que, se você estiver enviando e-mails usando o comando "sendmail", o filtro não será acionado. Nesse caso, adicione a opção após o método de entrega "retirada":

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Reinicie o postfix: postfix reload

Torne seu script legível e executável por qualquer pessoa: chmod +rx script.sh

Observe que o script é sempre acionado para qualquer email que chegue. Para especificar o endereço exato, consulte a resposta @MariusMatutiae.

Kirill-a
fonte
que me fez "erro de transporte de correio desconhecido" ...
user1133275