이것이 내 시나리오입니다. 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