Como enviar e-mails para vários destinatários, cada um recebendo um anexo diferente usando o comando mail do terminal?

Como enviar e-mails para vários destinatários, cada um recebendo um anexo diferente usando o comando mail do terminal?

Aqui está o meu cenário. Eu tenho um arquivo txt. e-mailADD.txt. contém IDs de e-mail em cada linha

[email protected]
[email protected]
[email protected]

E eu tenho arquivos em uma pasta

abc.pdf
def.pdf
hij.pdf

e assim por diante

quero um script para enviar email para o primeiro ID com o primeiro anexo. em seguida, outro e-mail para o segundo ID com o segundo anexo e assim por diante.

os IDs de e-mail e os anexos serão armazenados em ordem alfabética. o número de IDs de e-mail e anexos armazenados será igual.

Por favor sugira.

Tive essa ideia de jesse_b, mas não envolve anexos diferentes para cada ID de e-mail.

#!/bin/bash
file=/location/of/emailAdd.txt

while 
    read -r email; 
    do
      #printf '%s\n' 'Hello, world!' | sudo mail -s 'This is the email subject' "$email"
    done < "$file"

Responder1

Acho que seria mais fácil começar a percorrer os anexos e extrair o destinatário ao longo do caminho, já que o shell expandirá o glob em ordem alfabética. Seu script poderia ficar assim:

#!/usr/bin/env sh

line=1

for i in *.pdf
do
    echo "$i"
    recipient="$(awk -v line="$line" 'NR==line' emailADD.txt)"
    if [ -n "$recipient" ]
    then
        printf "recipient: %s\n" "$recipient"
        line=$((line+1))
        printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$i" "$recipient"
    fi
done

Remova echopara realmente executar mailo comando, mas execute-o primeiro para ter certeza de que fará o que você precisa.

Responder2

Se você for enviar muitos e-mails, poderá obter melhor desempenho evitando a abertura de emailADD.txt uma vez por anexo. Se você estiver usando o bash, poderá <()processar os anexos sem armazenar seus nomes em um arquivo:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$pdf" "$email"; done

Você pode remover echoquando parecer que ele fará o que você deseja.

No entanto, se você não executar isso de maneira automática/regular, considere gerar o texto dos comandos completos (incluindo o printf), redirecionar a saída para um arquivo e, em seguida, executar os comandos nesse arquivo. Isso permite a inspeção dos comandos, evita surpresas se o emailADD.txt ou a lista de anexos mudar no meio da execução e fornece um registro do que foi feito (que pode ser salvo ou descartado). Assim:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do echo "printf '%s\n' 'Hello, world' | mail -s 'This is the email subject' -a '$pdf' '$email' " ; done >| cmds

informação relacionada