如何使用終端機中的郵件命令向多個收件者傳送電子郵件,每個收件者都會收到不同的附件?

如何使用終端機中的郵件命令向多個收件者傳送電子郵件,每個收件者都會收到不同的附件?

這是我的場景。我有一個txt檔案。 emailADD.txt。它每行都包含電子郵件 ID

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

我的資料夾中有文件

abc.pdf
def.pdf
hij.pdf

等等

我想要一個腳本將帶有第一個附件的電子郵件發送到第一個 ID。然後向第二個 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

我認為從循環附件開始並一路提取收件人會更容易,因為 shell 會按字母順序擴展全局。您的腳本可能如下所示:

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

相關內容