端末で mail コマンドを使用してそれぞれ異なる添付ファイルを受信する複数の受信者に電子メールを送信するにはどうすればよいですか?

端末で mail コマンドを使用してそれぞれ異なる添付ファイルを受信する複数の受信者に電子メールを送信するにはどうすればよいですか?

これが私のシナリオです。 txtファイルがあります。電子メールADD.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

シェルはグローバルをアルファベット順に拡張するので、添付ファイルを繰り返して受信者を抽出して開始する方が簡単になると思います。スクリプトは次のとおりです。

#!/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

関連情報