본문 바로가기

Study/Ubuntu 공부

Ubuntu Bash 쉘로 html 메일 전송하는 방법

반응형

안녕하세요? 오만뒤입니다.

 

요즘 google 없이는 개발을 할 수가 없는 것 같네요.

뭔가 궁금한게 있거나 막히는 부분이 있으면 googlling을 자주 해보는 편인데 제가 찾는 정보가 하나도 빠짐없이 모두 다 있더군요!

다만 google에서 검색하는 거의 모든 정보들은 영어로 되어 있어서 이게 좀 불편하긴 한 것 같네요.

 

오늘은 리눅스 쉘 명령을 이용해서 메일을 전송하는 방법에 대해서 설명을 드리고자 합니다.

저는 ubuntu에서 bash shell 기준으로 설명을 드리겠습니다.

 

mail 발송 관련된 정보를 google에서 검색하다보면 거의 대부분이 php로 보내는 방법이 대부분이더군요.

쉘 명령을 통해서 한 방에 보낼 수 있는 방법은 많지 않아서 어쩌면 이 정보가 누군가에게 유용한 정보가 될 수도 있겠다 싶네요.

 

항상 windows 환경에서 개발을 하다가 linux 환경에서 개발을 해보니 쉘 스크립트와 다양한 패키지로 뭐든 제가 구현하고 싶을 것들을 구현할 수 있었습니다. 쓸모 없는 서론이 너무 길었던 것 같네요.

 


 

[Background]

 

우선 쉘에서 메일을 보내려면 2가지 선행되어야 할 작업이 있습니다.

 

- 첫 번째, SMTP 설정이 되어 있어야 합니다.

postfix와 같은 패키지를 설치하면 크게 어렵지 않게 SMTP 서버 구성이 가능하더군요.

 

- 두 번째, mailutils 패키지가 설치되어 있어야 합니다.

sudo apt-get install mailutils

위의 명령으로 mailutils 패키지를 설치하실 수 있습니다.

 


 

[Step 1. mail 명령으로 쉘 명령 1줄로 메일을 보내는 방법]

echo "This is mail send test" | mail -s "This is mail title" abc@abc.com

 

위의 명령 한 줄로 메일을 보낼 수 있습니다.

mail의 제목은 "This is mail title"이고 내용은 "This is mail send test" 이며, 메일을 수신하는 주소는 
"abc@abc.com" 입니다.

 

이야! 대박! 단 한 줄로 메일을 보낼 수 있다니!

심지어는 메일 내용이 공백으로 되어 있어도 메일이 전송되더군요!

 

하지만 여기서 몇 가지 문제에 봉착하게 됩니다.

아래와 같이 html 테그를 이용해서 메일을 보내도 html 테그까지 그대로 text로 표현이 되더군요

뿐만 아니라, 한글 문자열은 깨진 채로 전송이 됩니다.

 

HTML 테그를 이용하여 메일을 전송하였으나 테그가 그대로 출력됨!

 

 

 

[Step2. MIME 헤더를 추가하여 html 메일을 보내보자!]

 

메일에는 헤더가 포함되어 있습니다.

위의 명령으로 메일 헤더를 따로 입력하지 않은 상태에서 메일을 전송하였으나, 메일이 전송되는 과정에서 필요한 정보들이 채워지지 않았기 때문에 default 설정으로 메일이 전송되어 버립니다.

(특별한 설정이 없는 경우 기본적인 영어만 표현가능한 7Bit 형식으로 메일이 전송되어 버리기 때문에 전송되는 메일의 내용이 꺠질 수 있습니다.)

 

어떤 인코딩 방식을 사용할지와 어떤 방식으로 전송할지와 어떤 컨텐츠로 구성되었는지 등의 메일 헤더를 추가로 설정할 필요가 있습니다.

 

echo "This is mail send test" | mail -a "From: def@abc.com" -a "MINE-Version: 1.0" -a "Content-Type: text/html" -s "This is mail title" abc@abc.com

 

위와 같이 메일을 보내는 주소와 MIME 버젼과 콘텐트 타입을 지정해주면 비로소 Outlook에서 html tag가 parsing 된 채로 메일이 표시되더군요.

 

 

[Step3. 한글이 깨지는 경우 해결 방법]

 

위와 같은 방법으로 html 메일이 제대로 전송되는 것을 확인하였지만, 여전히 넘어야 할 산이 있습니다.

바로 한글이 깨져서 표시되는 문제를 해결해야 합니다.

아까 설명드렸던 것처럼 메일의 전송 방식을 지정해주지 않으면 기본적으로 7Bit 형식으로 전송이 되게 됩니다.

그럼 한글과 같이 8Bit 데이터의 MSB(0x80) 부분이 깨져서 한글이 제대로 표시되지 않게 됩니다.

 

echo "This is mail send test" | mail -a "From: def@abc.com" -a "MINE-Version: 1.0" -a "Content-Type: text/html; charset=utf-8" -a "Content-Transfer-Encoding: 8Bit" -s "This is mail title" abc@abc.com

 

위의 명령을 추가함에 따라서 텍스트 인코딩 방식이 지정되었고, 뿐만 아니라 인코딩된 텍스트를 전송할 때 8Bit를 모두 전송할 수 있게 됩니다.

이제서야 비로소 한글이 포함된 HTML 메일이 깨지는 현상 없이 올바르게 표현됩니다.

 

 

[Appendix. 인코딩 방식 확인하는 방법]

 

추가로 한글 인코딩 방식을 확인하는 방법은 아래와 같습니다.

$ env | grep LANG

LANG=en_US.UTF-8

제 PC는 UTF-8 방식의 인코딩을 사용하고 있네요.

메일 보낼때 반드시 UTF-8 문자코드를 지정하시고 HTML meta tag에도 charset을 UTF-8로 지정하시면 됩니다.

 

이상으로 ubuntu linux bash shell에서 text 명령으로 html 메일을 보내는 방법에 대한 설명을 모두 마칩니다.

 

이상 오만뒤였습니다!

반응형