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 echo
para realmente executar mail
o 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 echo
quando 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