O processamento de vários e-mails em uma caixa de correio Postfix fazendo o cronjob executado por segundo é considerado uma boa prática?

0

Eu preciso processar pelo menos três mil e-mails recebidos por hora que são recebidos em uma caixa postal postfix. O processamento envolve a extração de anexos de email e o envio do conteúdo de um anexo de email para um endereço de email externo. Para cada anexo de email, envio um email. Eu acho que eu poderia conseguir isso escrevendo um script para o cronjob dormir a cada segundo, mas não tenho certeza se isso é uma boa prática (fazer isso facilmente me dá aproximadamente 3600 e-mails processados por hora). Por favor, informe sobre a melhor maneira de abordar isso. Eu já tenho um script que extrai e-mails e envia e-mail, o único problema com os scripts é que ele só pode manipular um e-mail de cada vez. Se eu usar um minuto por minuto, posso processar apenas 60 e-mails por hora enquanto o destino é realmente pelo menos 3000 e-mails por hora. Por favor, informe.

    
por user40952 24.07.2013 / 08:40

1 resposta

1

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]
    
por 24.07.2013 / 10:23