Вот мой сценарий. У меня есть txt-файл emailADD.txt. Он содержит идентификаторы электронной почты в каждой строке.
[email protected]
[email protected]
[email protected]
И у меня есть файлы в папке
abc.pdf
def.pdf
hij.pdf
и так далее
Мне нужен скрипт для отправки электронного письма на первый идентификатор с первым вложением. Затем еще одно электронное письмо на второй идентификатор со вторым вложением и так далее.
Идентификаторы электронной почты и вложения будут сохранены в алфавитном порядке. Количество сохраненных идентификаторов электронной почты и вложений будет одинаковым.
Пожалуйста, предложите.
Эту идею мне подал jesse_b, но она не подразумевает отдельных вложений для каждого идентификатора электронной почты.
#!/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 будет расширять 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