如何使用终端中的邮件命令向多个收件人发送电子邮件,每个收件人都会收到不同的附件?

如何使用终端中的邮件命令向多个收件人发送电子邮件,每个收件人都会收到不同的附件?

这是我的场景。我有一个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

相关内容