Executar script no recebimento do email

7

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

Eu freqüentemente uso o arquivo virtual para criar caixas de correio virtuais encaminhadas para [email protected] . Eu tenho um número destes para contas descartáveis, como compras únicas de lojas on-line, jogos on-line que eu quero experimentar sem me preocupar com spam em andamento, etc. Para fazer isso, execute 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

Eu faço isso com frequência suficiente para que eu possa automatizar o processo até certo ponto. Eu considerei simplesmente escrever um script de shell que tomou a caixa de correio virtual e a caixa de correio real como argumentos e fez as alterações em si, mas estou esperando algo ainda mais livre.

Gostaria de poder enviar um email de [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 chamadas sudo , mas posso criar um novo usuário cuja única responsabilidade é lidar com isso, que deve lidar com isso.

A maioria das perguntas é a seguinte: como eu criaria um evento que seria acionado por um email? Existe algum serviço em algum lugar que faça isso? Posso configurar o Postfix ou o Dovecot para ouvir esse email e executar comandos nesse evento?

    
por Adam Smith 09.01.2015 / 22:19

3 respostas

5

O procedimento correto para executar um script (eu uso um script de shell) após o recebimento de uma mensagem de correio é o seguinte. Envolve modificar o arquivo de configuração 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 postfix para executar o script (você precisa torná-lo executável) quando algum evento ocorrer.

Para especificar quando executar o script, faça o seguinte: suponha que você queira 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 apropriado para postfix usar este arquivo, 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 para o 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 postfix ,

  postfix reload

e você deve ser bom para ir.

    
por 15.01.2015 / 14:18
4

Eu posso ver duas soluções óbvias.

Se você estiver usando o procmail como o MDA em seu servidor, ou estiver disposto a converter para usá-lo, então poderá executar qualquer script arbitrário em qualquer email arbitrário através do | (pipe) do procmail ação de receita. Espera-se que ele 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 chamado sem senha como root por um usuário relevante. A saída do script pode até mesmo ser enviada de volta para o mesmo e-mail e o e-mail entregue posteriormente, tornando a receita uma ação de filtro.

Uma alternativa (que deve exigir menos manutenção prática) é criar uma única caixa de correio e configurar o $recipient_delimiter para ser algo que normalmente não é usado para essa finalidade; por exemplo, . ou - . Observe que recipient_delimeter é uma configuração de todo o servidor. Vamos supor que você configurou a caixa de correio [email protected] e defina $recipient_delimeter = . . Isso permitirá, então, dummy.<anything>@example.com , que será entregue na caixa de correio local correspondente a [email protected] . Para desabilitar um deles, adicione dummy.<whatever>@example.com a uma tabela de destinatários apropriada com uma ação de rejeição. A desvantagem é que ele será uma caixa de correio pega-tudo para o prefixo, então você pode querer tornar o prefixo difícil de tropeçar por acidente ou por 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 requer manutenção zero, e você sempre pode alterar seu prefixo posteriormente e listar explicitamente essas combinações que deseja receber ao receber .

    
por 12.01.2015 / 11:11
1

No caso, se link desce, aqui está o resumo.

Primeiro, vá para master.cf e 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 informar ao Postfix para executar o filtro para qualquer email que chegar pela entrega SMTP:

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

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

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 chega. Para especificar o endereço exato, veja a resposta @MariusMatutiae.

    
por 16.01.2015 / 08:33