터미널에서 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

쉘이 전역을 알파벳순으로 확장하므로 첨부 파일을 반복하고 수신자를 추출하여 시작하는 것이 더 쉬울 것이라고 생각합니다. 스크립트는 다음과 같습니다.

#!/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

관련 정보