Que utilitário pode adicionar uma linha deliver_to a um email com base em Para: e Cc :?

0

TLDR: Eu preciso de um utilitário que leia um e-mail e examine os campos Para: e Cc: para encontrar um endereço de e-mail de uma lista de endereços conhecidos. Se encontrar um, eu quero que ele envie o e-mail com uma linha extra de envelope deliver_to: <address> .

Plano de fundo

Meu ISP entrega todos os e-mails da empresa para uma caixa postal "domain mailbox" / "Catch all", mas não grava o destinatário do envelope em lugar algum. Temos um servidor de troca recebido dessa caixa de correio (usando o chamado "conector POP3") e distribuí-lo para as caixas de correio dos usuários. Correio e mensagens de correio electrónico das listas de correio são entregues numa caixa de correio predefinida. Estou substituindo a troca e esta é a única peça que resta. Eu posso recuperar e-mails com o getmail usando MultidropPOP3Retriever , mas o getmail espera encontrar uma linha de envelope com o endereço de e-mail do destinatário (por exemplo, delivered_to: [email protected]) que meu ISP não fornece. Então eu tenho que fazer o meu melhor e recuperá-lo de Para: / CC :.

    
por ndemou 10.10.2018 / 13:08

2 respostas

2

Acontece que minha resposta estava na extensa documentação do getmail. Eu preciso usar as chamadas do getmail MultiGuesser .

No entanto, como no meu caso, meu ISP estava adicionando uma linha como essa nos cabeçalhos de envelope:

for <[email protected]>

e como o MultiGuesser não é perfeito (por exemplo, não é possível adivinhar se o destinatário está bcc'ed), finalmente implementei a ideia original de adicionar delivered_to lines. Eu mantive o MultiGuesser apenas no caso do meu ISP parar de adicionar essa linha útil. O utilitário é um script bash que usa formail (sugerido por dirkt em sua resposta). Não é rápido porque cria arquivos temporários para todos os e-mails que processa, mas funciona bem.

#!/bin/bash
# Reads email from stdin and prints it to stdout with a twist:
# If it finds a line like " for <[email protected]>" in the envelope
# it will assume it refers to the receipient and will add a "Delivered-To"
# envelope line that will make getmail happy. -- Nick Demou 2018

# bash options for safety in case of errors
set -euf -o pipefail

# read stdin to temp file
cat - > /tmp/deliver.to.$$
logger -p mail.info "getmail, filtering via temp file /tmp/deliver.to.$$"

formail -X "" < /tmp/deliver.to.$$ > /tmp/deliver.to.$$.env
# logger -p mail.info "getmail, extracted envelope/headers to /tmp/deliver.to.$$.env"

ID='grep 'SMTP id ' /tmp/deliver.to.$$.env 2>/dev/null| head -1|sed -e 's/^ *//'' || ID=UNKNOWN
# logger -p mail.info "getmail, extracted ID $ID"

ADDR='grep '^ *for <.*@domain\.com>' /tmp/deliver.to.$$.env 2>/dev/null|head -1|sed -e 's/^.*<\([^>]*\)>.*$//'' || ADDR=UNKNOWN
# logger -p mail.info "getmail, extracted delivery address $ADDR"

if echo $ADDR | grep -q '^[^@]*@domain.com *$' ; then
        cat /tmp/deliver.to.$$ | formail -A "Delivered-To: $ADDR"
else
        cat /tmp/deliver.to.$$
fi
logger -p mail.info "getmail filtered mail for $ADDR, $ID"

rm /tmp/deliver.to.$$
rm /tmp/deliver.to.$$.env

Meu getmailrc contém um filtro como este, que chama o script acima:

[filter-1]
type = Filter_external
path = /opt/envelope-add-delivered-to.sh
    
por 11.10.2018 / 15:11
1

Se "utilitário" significa "shell script para o remetente / receptor", dê uma olhada em formail . Para o processamento automático de mensagens recebidas por usuário, consulte procmail .

Se você estiver substituindo o servidor Exchange por um servidor de e-mail Linux, provavelmente desejará fazer isso no servidor de alguma forma.

    
por 10.10.2018 / 13:24

Tags