O Procmail resolve isso trivialmente, desde que seu servidor tenha a CPU e a largura de banda para sustentar o fluxo. Se você já tem um script que cuida disso, simplesmente canalize cada mensagem recebida para o seu script. Coloque o seguinte no seu $HOME/.procmailrc
:
:0
| /path/to/your/script
O script recebe a mensagem como sua entrada padrão e é responsável por entregar ou manipular a mensagem daqui em diante. (Em outras palavras, o Procmail não entregará esta mensagem em sua caixa de entrada. Veja abaixo como modificar esse comportamento.)
(O Procmail não é estritamente necessário para isso, mas adiciona uma boa rede de segurança para que o seu script não precise lidar com todas as possíveis condições de erro. Você poderia simplesmente dobrar o pipeline no seu .forward
se o seu script Isso é basicamente o que o comentário de @ number5 também diz, exceto que ele faz isso no arquivo de configuração do Postfix, ao invés de usar o recurso .forward
.
Se duas instâncias do script não puderem ser executadas simultaneamente (por exemplo, porque precisa de acesso exclusivo a um banco de dados de back-end), adicione um arquivo de bloqueio:
:0:yourscript.lock
| /path/to/your/script
Isso fará com que o Procmail procure o arquivo yourscript.lock
e, se existir, espere até que ele desapareça; em seguida, crie o arquivo, execute a receita e remova o arquivo de bloqueio.
O uso de um arquivo de bloqueio força as entregas a serem serializadas. Isso reduzirá o desempenho, no entanto. Se for possível, seria melhor tornar o script robusto na execução paralela.
Por outro lado, se o seu script incorrer em uma carga pesada no servidor, talvez você não queira executar várias instâncias simultâneas; Nesse cenário, o desempenho pode realmente melhorar se você forçar a entrega serializada.
Se também quiser uma cópia na sua caixa de entrada, copie uma cópia ao enviar para o seu script:
:0c # or :0c:yourscript.lock
| /path/to/your/script
Você também pode adicionar uma condição para que, por exemplo, apenas mensagens com uma linha de assunto específica são canalizadas para o seu script. As condições são especificadas com um asterisco como o primeiro caractere, seguido por uma expressão regular que precisa corresponder aos cabeçalhos da mensagem.
:0
* ^Subject: xyzzy$
| /path/to/your/script
Se o acima não for adequado, a receita a seguir extrairá todos os anexos de um diretório e enviará um email para cada mensagem recebida. Looping sobre os anexos é provavelmente melhor feito a partir de um script externo como acima, mas isso deve, pelo menos, dar-lhe um sopro de como seria fazer algo um pouco mais envolvido com o próprio Procmail.
METAMAIL_TMPDIR='mktemp -d /tmp/extracted.XXXXXXXXX'
# Crude attachment extraction ... how are you currently doing this?
:0c
| metamail -w -d
COUNT='find "$METAMAIL_TMPDIR" -printf "%i\n" | wc -l'
:0
| ( echo Subject: $COUNT attachments extracted into $METAMAIL_TMPDIR; echo; echo ) \
| sendmail -oi [email protected]