Как отправлять электронные письма нескольким получателям, при этом каждый из них получает отдельное вложение, используя команду mail из терминала?

Как отправлять электронные письма нескольким получателям, при этом каждый из них получает отдельное вложение, используя команду mail из терминала?

Вот мой сценарий. У меня есть 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

Связанный контент