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