ターミナルからメールコマンドを使用して、複数の受信者にそれぞれ異なる添付ファイル付きのメールを送信するにはどうすればよいでしょうか?

ターミナルからメールコマンドを使用して、複数の受信者にそれぞれ異なる添付ファイル付きのメールを送信するにはどうすればよいでしょうか?

これが私のシナリオです。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

関連情報