이 글에서는 리눅스 명령줄(셸)에서, 그리고 Bash/Shell 스크립트 안에서 이메일을 보내는 여러 가지 방법을 소개합니다.
굳이 명령줄에서 이메일을 보낼 필요가 있을까요? 일상적인 소통 목적이라면 아마 아닐 겁니다. 대부분의 사람들은 사용자 인터페이스가 잘 갖춰진 메일 클라이언트를 통해 서로 메시지를 주고받으니까요. 하지만 특정 작업이 완료되었거나 어떤 이벤트가 발생했을 때 컴퓨터가 자동으로 알림 메일을 보내도록 하고 싶다면 이야기가 달라집니다.
이런 종류의 이메일 알림은 디스크 공간 부족 경고, 오류 발생 통보, 정전 알림 등에 널리 활용됩니다. 나아가 최근 출시한 앱의 신규 가입자 현황을 매일 요약해서 받아보는 알림을 만들 수도 있습니다. 아래에서 이를 구현할 수 있는 도구들과 함께 실제 예제를 살펴보겠습니다.
메일 발송 전 알아두어야 할 사항
이 글의 모든 예제는 외부 SMTP 서버를 통해 메일을 보낸다는 전제 하에 작성되었습니다. Amazon SES나 MailGun 같은 전용 이메일 발송 서비스를 사용할 수도 있고, Gmail이나 Outlook.com 같은 온라인 메일 제공업체가 제공하는 SMTP 정보를 이용해 발송할 수도 있습니다.
자체 SMTP 호스트를 직접 구축해 메일을 보내는 방법은 다루지 않습니다. 그 이유는 간단합니다. 가정용(주거용) IP 주소에서 발송되는 메일은 스팸으로 차단될 가능성이 매우 높고, 그렇게 되면 알림 메일이 정상적으로 작동하지 않는 것인지, 아니면 차단되고 있는 것인지 문제 원인을 파악하기가 무척 어려워지기 때문입니다.
적절한 프로그램 선택하기
이메일을 보낼 수 있는 소프트웨어 패키지는 셀 수 없이 많습니다. 모든 것을 다룰 생각은 없습니다. 여러분이 찾는 것은 '그냥 잘 동작하는' 도구일 테니까요.
MSMTP는 이 용도에 딱 맞는 도구입니다. 따라서 이 글에서는 MSMTP 사용법에 초점을 맞추겠습니다.
예전에는 SSMTP를 선호했습니다만, 해당 패키지의 개발이 중단되었기 때문에 좋은 대안인 MSMTP를 사용하는 것이 바람직합니다.
그 밖의 선택지로는 sendmail, mail, mutt 명령어가 있습니다. 모두 사용할 수 있지만, MSMTP는 사용과 설정이 쉽고 시스템 메일과 충돌하지 않는 독립적인 설정을 유지할 수 있다는 장점이 있습니다.
MSMTP로 이메일 보내기
MSMTP는 이메일을 보내는 기능만 담당하는 프로그램입니다. 덕분에 Bash 스크립트에서 이메일을 발송하기에 완벽하게 적합합니다.
MSMTP를 설치한 후에는 다음 명령으로 사용자 매뉴얼을 확인할 수 있습니다:
man msmtp
MSMTP 설치
Debian/Ubuntu 계열 시스템에서는 다음 명령으로 필수 패키지인 MSMTP와, 아직 설치되어 있지 않다면 ca-certificates 패키지를 설치합니다:
sudo apt update sudo apt install msmtp ca-certificates
이 글 전체에서 sudo 명령은 root(관리자) 권한으로 명령을 실행할 때 사용됩니다.
MSMTP 설정
MSMTP는 사용자별(per-user) 설정과 시스템 전역(global) 설정을 모두 지원합니다. 여기서는 모든 서비스가 MSMTP를 통해 이메일을 보낼 수 있도록 전역 설정으로 구성하겠습니다.
MSMTP에는 예제 설정 파일이 함께 제공되므로, 이것을 템플릿으로 활용하면 편리합니다. /etc/ 폴더에 복사해 사용하겠습니다:
sudo cp /usr/share/doc/msmtp/examples/msmtprc-system.example /etc/msmtprc
nano 텍스트 편집기로 설정 파일을 엽니다:
sudo nano /etc/msmtprc
이제 이메일 발송에 사용할 SMTP 서버 정보를 입력하면 됩니다. 서로 다른 서버나 주소에서 발송하고 싶다면 여러 개의 메일 계정을 정의할 수도 있습니다.
아래는 두 개의 Gmail 주소를 등록한 설정 예제입니다:
# Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail 1 account gmail1 host smtp.gmail.com port 587 from admin@wsxdn.com user username1 password password1 # Gmail 2 account gmail1 host smtp.gmail.com port 587 from admin@wsxdn.com user username2 password password2 # Set a default account account default : gmail1
파일을 저장하면 MSMTP 사용 준비가 끝납니다.
이메일 보내기
MSMTP 설정이 완료되었다면 바로 사용할 수 있습니다. 이메일 발송을 위해 추가 소프트웨어는 필요 없습니다. printf 명령으로 이메일 내용을 만든 뒤 파이프(|)로 msmtp 명령에 전달하기만 하면 됩니다:
printf "Subject: Testing\nHello there!." | msmtp -a gmail2 admin@wsxdn.com
"Subject: Testing\nHello there!." – 이것이 실제로 발송될 이메일입니다. Subject: 뒤에 제목 텍스트를 붙여 제목을 정의하고, \n(새 줄) 다음에 본문 텍스트를 이어서 작성합니다. 필요에 따라 \n을 추가로 삽입하면 줄바꿈이 포함된 일반 텍스트 메시지를 만들 수 있습니다.
-a 옵션은 어떤 메일 계정으로 발송할지 지정하는 데 사용됩니다. 지정하지 않으면 기본(default) 계정이 사용됩니다.
Mutt로 첨부 파일이 있는 이메일 보내기
첨부 파일이 포함된 이메일을 보내는 일은 조금 더 까다롭습니다. 작업을 수월하게 하려면 추가 소프트웨어가 필요합니다. mutt는 최소한의 설정만으로 스크립트에서 첨부 파일 발송 기능을 사용할 수 있게 해주는 이메일 클라이언트입니다.
다음 명령으로 설치합니다:
sudo apt install mutt
mutt를 설치하면 의존성으로 Postfix 메일 전송 에이전트(MTA)가 함께 설치되며, 메일 설정을 묻는 화면이 나타날 수 있습니다. 이때 No configuration(설정 없음)을 선택해도 안전합니다. Postfix를 설정할 필요는 없습니다. 앞서 언급했듯이 이 시스템에서 직접 메일을 발송하면 스팸 필터링 때문에 수신지에 도달하지 못할 가능성이 높기 때문입니다.
MSMTP와 마찬가지로 mutt도 사용자별 설정과 전역 설정을 지원합니다. 모든 사용자와 서비스가 첨부 파일 메일을 보낼 수 있도록 전역 설정을 사용하겠습니다. 다음 명령으로 파일을 생성하고 nano 편집기로 엽니다:
nano /etc/muttrc
아래 설정을 입력합니다(값은 자신의 메일 설정에 맞게 교체하세요):
set sendmail="/usr/bin/msmtp" set use_from=yes set realname="Your Name" set admin@wsxdn.com set envelope_from=yes
이제 mutt 설정이 완료되었으며, 첨부 파일이 포함된 이메일을 보낼 수 있습니다:
mutt -a attachment.txt -s "My Subject" -- admin@wsxdn.com < "Email message body"
사용자별 설정 vs 전역 설정
위에서는 전역 설정을 정의했습니다. 만약 설정이 특정 사용자에게만 적용되기를 원한다면 — 예를 들어 각 사용자가 자신의 계정으로만 메일을 보내도록 하고 싶다면 — 설정 파일을 시스템 경로가 아닌 해당 사용자의 홈 디렉터리에 아래 이름으로 배치하면 됩니다:
~/.msmtprc ~/.muttrc