터미널의 잘못된 동작에서 이메일 보내기

터미널의 잘못된 동작에서 이메일 보내기

Gmail을 통해 터미널에서 이메일을 보내기 위해 웹에서 작성한 다음 스크립트가 있습니다.

#!/bin/bash

#sendGmail "FROM" "TO" "SUBJECT" "BODY" "ATTACHMENTS (optional)"
FROM=$1
TO=$2
SUBJECT=$3
BODY=$4

# Function to check if entered file names are really files
function check_files()
{
output_files=""
for file in $1; do
    if [ -s $file ]; then
        output_files="${output_files}${file} "
    fi
done
echo $output_files
}

if [ "$FROM" == "" ]; then
    FROM="[email protected]"
else    
     if [[ "$FROM" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then
        echo error in FROM
        exit
    fi
fi

if [[ "$TO" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then
    echo error in TO
    exit
fi

if [ -z "$5" ]; then
    echo $BODY | mail -r $FROM -s $SUBJECT $TO
else
    ATT=$5
    ATTACHMENTS=""
    attachments=$(check_files "$ATT")
    for attachment in $attachments; do
        ATTACHMENTS="$ATTACHMENTS $attachment"
    done
    echo $ATTACHMENTS

    echo $BODY | mail -r $FROM -s $SUBJECT -A $ATTACHMENTS $TO
fi

echo email sent!

하지만 이메일을 보내면 다음과 같은 동작이 발생합니다.

  • 첨부 파일 유무: "임의의 제목"인 경우 이메일 은 및 으로 $subject전송됩니다 .$TO[email protected][email protected]theme@ mipc.localdomain
  • 첨부 파일 없음: $BODY이메일 본문
  • 첨부 파일 있음: 이메일 본문이 비어 있습니다.

편집: @ilkkachu 덕분에 첫 번째 문제가 해결되었습니다. 새 코드:

#!/bin/bash

#sendGmail "FROM" "TO" "SUBJECT" "BODY" "ATTACHMENTS (optional)"
FROM=$1
TO=$2
SUBJECT=$3
BODY=$4

if [ "$FROM" == "" ]; then
    FROM="[email protected]"
else    
     if [[ "$FROM" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then
        echo error in FROM
        exit
    fi
fi

if [[ "$TO" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]; then
    echo error in TO
    exit
fi

if [ -z "$5" ]; then
    echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" "$TO"
else
    ATT=$5
    ATTACHMENTS=""
    for attachment in $ATT; do
        if [ -f $attachment ]; then
            ATTACHMENTS="$ATTACHMENTS-A $attachment "
        else
            echo something wrong with $attachment, therefore not attached
        fi  
    done

    echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" $ATTACHMENTS "$TO"
fi

echo email sent!

답변1

그 이유는분사. SUBJECT포함된 경우 와 some random theme동일 mail -s $SUBJECT합니다 mail -s some random theme. 내용은 $subject여백에 단어로 분할되어 있습니다. 따옴표를 사용해야 합니다 mail -s "$SUBJECT".

첨부 파일과 관련하여 각 파일에 대한 옵션을 추가해야 할 수 있으므로 -A대신 필요할 수 있습니다. 파일 이름에 공백이 포함되어 있지 않으면 다음과 같이 각 파일 이름에 추가하여 이를 수행할 수 있습니다. 옵션과 파일 이름을 분리해야 하므로 여기에는 따옴표가 필요하지 않습니다.-A file1 file2-A file1 -A file2-AATTACHMENTSATTACHMENTS="$ATTACHMENTS -A $attachment"$ATTACHMENTSmail

물론 올바른 방법은 배열을 사용하여 명령줄 인수를 보유하는 것이지만 for루프가 이미 첨부 파일에 토큰화를 발생시키므로 배열이 도움이 되지 않습니다.

그래서:

for f in files... ; do
    ATTACHMENTS="-A $f"
done
echo "$BODY" | mail -r "$FROM" -s "$SUBJECT" $ATTACHMENTS "$TO"

또한 첨부 파일을 받는 것이 무엇인지 확인했다고 가정합니다 mail. -A많은 버전이 있지만 mail이 옵션에 대해 아는 사람은 없습니다. 예를 들어,매뉴얼 페이지는 die.net에 있습니다.액세서리 용 -a, -A기타 용도로. 따라서 작동하지 않는지 다시 확인하는 것이 좋습니다.

관련 정보