これが私のシナリオです。txtファイルがあります。emailADD.txt。各行にメールIDが含まれています。
[email protected]
[email protected]
[email protected]
そしてフォルダ内にファイルがあります
abc.pdf
def.pdf
hij.pdf
等々
最初の添付ファイルを最初の ID にメールで送信するスクリプトが必要です。次に、2 番目の添付ファイルを 2 番目の ID に別のメールを送信する、というように繰り返します。
電子メール ID と添付ファイルは両方ともアルファベット順で保存されます。保存される電子メール ID と添付ファイルの数は等しくなります。
提案してください。
このアイデアは jesse_b から得たものですが、各メール ID に異なる添付ファイルを添付する必要はありません。
#!/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"
答え1
シェルは glob をアルファベット順に展開するので、添付ファイルをループして受信者を抽出することから始める方が簡単だと思います。スクリプトは次のようになります。
#!/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
echo
実際にコマンドを実行するには削除しますmail
が、最初にそれを使用して実行し、必要な処理が実行されることを確認します。
答え2
大量のメールを送信する場合は、添付ファイルごとに emailADD.txt を開かないようにすることで、パフォーマンスが向上する可能性があります。bash を使用している場合は、添付<()
ファイルの名前をファイルに保存せずに添付ファイルを処理するために、次のように使用できます。
$ 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
echo
望みどおりに機能すると思われる場合は、削除できます。
ただし、これを自動的/定期的に実行しない場合は、完全なコマンドのテキスト (printf を含む) を生成し、出力をファイルにリダイレクトしてから、そのファイル内のコマンドを実行することを検討してください。これにより、コマンドを検査でき、emailADD.txt または添付ファイル リストが実行中に変更された場合の予期しない事態を回避し、実行内容の記録 (保存または破棄可能) が得られます。次のようになります。
$ 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