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