Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

Sending email with curl

제목

Sending email with curl

최신의 curl 은 이메일도 보낼 수 있다.

curl -s \
--ssl \
--url "smtp://${MXHOST}" \
--mail-from ${SENDER} \
--mail-rcpt ${RECIPIENT} \
--upload-file - << EOF
From: <${SENDER}>
To: <${RECIPIENT}>
Subject: ${subject}
${message}
EOF

Sending email - Everything curl 에서 공식 문서를 찾을 수 있다.

1. 해설

1.1. 사용되는 변수

  • ${MXHOST} : MX 호스트 (후술 참조)
  • ${SENDER} : 보내는 사람 이메일 주소
  • ${RECIPIENT} : 받는 사람 이메일 주소
  • ${subject} : 제목
  • ${message} : 내용

한글은 허용되지 않는다.

1.2. curl 명령행 파라미터

  • -s : 조용히
  • --ssl : 가능하다면, ssl 로...
  • --url : URL
  • --mail-from : 보낸 사람 이메일주소
  • --mail-rcpt : 받는 사람 이메일주소
  • --upload-file : 이메일 내용이 담겨 있는 파일경로. 대신에 "-"

2. 후술

2.1. 받는 사람 이메일 주소로부터 MX 찾아서 이메일 보내기

curl 은 MX lookup 을 하지 않는다 (Sending email - Everything curl 참조).

MX 호스트는 다음 중 1개를 이용해서 찾을 수 있다.

  • dig
  • host
  • nslookup

다음과 같이 하면 이메일 주소에서 Host 이름만 가져올 수 있다.

HOST=${RECIPIENT##*@}

dig 명령어로 찾는 방법은 다음과 같다.

Result=$( dig ${HOST} mx +short 2> /dev/null | head -1 )
RETVAL=$?
if [[ $RETVAL -eq 0 ]]; then
if [ "$Result" != "" ];then
MXHOST=$( echo ${Result} | awk '{ print $NF }' )
MXHOST=${MXHOST%.}
fi
fi

dig 명령어가 없다고 하더라도 에러 메시지가 출력되지는 않는다(2> /dev/null).

명령이 성공한 경우에만 마지막 필드에서 마지막 "." 을 제외한 부분을 가져온다.

host 나 nslookup 명령어를 이용하는 방법도 거의 유사하다.

dig 가 없으면 host 로 찾고, host 도 없으면 nslookup 으로 찾는 전체 소스코드는 다음과 같다.

SENDER 부터 message 까지 변경해서 사용하면 된다.

SENDER="보내는 사람 이메일 주소"
RECIPIENT="받는 사람 이메일 주소"
subject="제목"
message="내용"
HOST=${RECIPIENT##*@}
MXFOUND=N
MXHOST=""
Result=$( dig ${HOST} mx +short 2> /dev/null | head -1 )
RETVAL=$?
if [[ $RETVAL -eq 0 ]]; then
if [ "$Result" != "" ];then
MXHOST=$( echo ${Result} | awk '{ print $NF }' )
MXHOST=${MXHOST%.}
fi
MXFOUND=Y
fi
if [[ "$MXHOST" == "" && "$MXFOUND" != "Y" ]]; then
Result=$( host -t mx ${HOST} 2> /dev/null | grep mail | head -1 )
RETVAL=$?
if [[ $RETVAL -eq 0 ]]; then
if [ "$Result" != "" ];then
MXHOST=$( echo ${Result} | awk '{ print $NF }' )
MXHOST=${MXHOST%.}
fi
MXFOUND=Y
fi
fi
if [[ "$MXHOST" == "" && "$MXFOUND" != "Y" ]]; then
Result=$( nslookup -type=mx ${HOST} 2> /dev/null | grep "mail exchanger" | head -1 )
RETVAL=$?
if [[ $RETVAL -eq 0 ]]; then
if [ "$Result" != "" ];then
MXHOST=$( echo ${Result} | awk '{ print $NF }' )
MXHOST=${MXHOST%.}
fi
MXFOUND=Y
fi
fi
if [[ "$MXHOST" == "" && "$MXFOUND" == "Y" ]]; then
MXHOST=${HOST}
fi
if [ "$MXHOST" == "" ];then
echo "dig|host|nslookup command not exists!"
return 100
else
curl -s --ssl \
--url "smtp://${MXHOST}" \
--mail-from ${SENDER} \
--mail-rcpt ${RECIPIENT} \
--upload-file - << EOF
From: <${SENDER}>
To: <${RECIPIENT}>
Subject: ${subject}
${message}
EOF
fi

2.2. exim 으로 이메일 보내기

exim -v -f ${SENDER} ${RECIPIENT} <<EOF
From: <${SENDER}>
To: <${RECIPIENT}>
Subject: ${subject}
${message}
EOF

2.3. sendmail 로 이메일 보내기

sendmail -v -f ${SENDER} ${RECIPIENT} <<EOF
From: <${SENDER}>
To: <${RECIPIENT}>
Subject: ${subject}
${message}
EOF

2.4. mailx 로 이메일 보내기

mailx -r "${SENDER}" -s "${subject}" "${RECIPIENT}" <<EOF
${message}
EOF

에러가 발생하는 경우도 있다.

mailx: invalid option -- r

과거 버전은 -r 옵션이 없는 것으로 보이므로, 다음과 같이 한다.

mailx -s "${subject}" "${RECIPIENT}" <<EOF
${message}
EOF
제목

첨부파일