터미널에서 mail 명령을 사용하여 각각 다른 첨부 파일을 받는 여러 수신자에게 이메일을 보내는 방법은 무엇입니까?

터미널에서 mail 명령을 사용하여 각각 다른 첨부 파일을 받는 여러 수신자에게 이메일을 보내는 방법은 무엇입니까?

내 시나리오는 다음과 같습니다. txt 파일이 있습니다. 이메일ADD.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

쉘이 알파벳 순서로 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

관련 정보