안녕하세요 

이번 포스팅에서는 리눅스 터미널에서 mail 명령어로 메일을 보낼 경우 보내는 서버(smtp) 를 구글 gmail 로 설정하여 발송하는 방법에 대해서 확인 해보도록 하겠습니다.  

리눅스에서 메일 발송

리눅스 서버를 이용하면 터미널이나 shell 또는 crontab 등의 스케줄러에 의한 프로그램 또는 스크립트 실행에 따라서 메일을 발송하는 기능이 필요할 경우가 있습니다.

이럴 경우 mail 이나 mailx, mutt 와 같은 커맨드(유틸리티) 를 이용하여 메일을 발송 할 수 있습니다.
이렇게 메일을 터미널 상에서 직접 발송할 경우 해당 리눅스 서버가 smtp 서버, 즉 메일 발송 서버가 됩니다.

그런데 상황에 따라서 서버에서 직접 메일을 발송하는 경우에 대해서 제약이 발생될 경우가 많습니다.
예를 들어 대표적으로 사용중인 서버의 공인 IP 가 차단 될 경우 입니다.

이러한 일은 운영하면서 몇번의 경험이 있습니다 VPS나 클라우드와 같이 손쉽게 리눅스 가상 시스템을 만들고 그리고 공인IP를 부여 받아서 사용할 경우 해당 IP의 그전 이력에 문제가 있을 경우가 있습니다.
이런 사유에 의해서 메일 발송시 수신하는 측에서 block ip로 되는 경우가 있습니다.

사용중인 여러 서버 중에서 특정 서버 IP 에서 MS hotmail 로 보내면 MS Hotmail 에서 block 이 된다던가 유사하게 특정 어떤 서버에서 gmail 로 메일을 보내면 블럭(block) 이 된다 던가 하는 경우가 있습니다.

• block 되어 있을 경우 maillog 에 기록 되는 내용

-- MS outlook.com
postfix/smtp[15780]: 5D54D4078E0E: to=<...@hotmail.com>, relay=hotmail-com.olc.protection.outlook.com[104.47.6.33]:25, 
delay=1.4, delays=0.04/0.02/1.1/0.23, dsn=5.7.1, status=bounced (host hotmail-com.olc.protection.outlook.com[104.47.6.33] 
said: 550 5.7.1 Unfortunately, messages from [......] weren't sent. Please contact your Internet service provider since part of their network is on our block list (S3140). 
You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors. [VE1EUR02FT059.eop-EUR02.prod.protection.outlook.com] (in reply to MAIL FROM command))


-- Google Gmail
1923540FB1AC: to=<....@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.187.26]:25, delay=1.7, delays=0.19/0.17/0.89/0.47, dsn=5.7.26, 
status=bounced (host gmail-smtp-in.l.google.com[64.233.187.26] said: 550-5.7.26 This message does not have authentication information or
 fails to 550-5.7.26 pass authentication checks. To best protect our users from spam, the 550-5.7.26 message has been blocked. Please visit 550-5.7.26  
https://support.google.com/mail/answer/81126#authentication for more 550 5.7.26 information. c140si395251pfb.379 - gsmtp (in reply to end of DATA command))

또는 AWS EC2 같은 경우 25번 포트의 사용이 제한이 설정되어 있어서 어떠한 메일 서비스로도 발송이 되지 않습니다.

그래서 허용 요청을 해서 승인을 받아야 메일을 발송 할 수 있습니다.

이처럼 서버에서 직접 메일을 발송할 경우 발송이 불가한 상황이 있을 수 있으며 터미널에서 메일을 보낼 경우에도 이런 제약사항이 있을 경우 별도의 메일러(smtp) 를 설정하여 메일을 보낼 수 있습니다.

포스팅에서는 여러 메일러 서비스 중에서 gmail 로 설정하여 메일을 발송 하도록 설정 하였습니다.


포스팅 OS 환경

CentOS 7.9
CentOS / Oracle Linux 8.4
Ubuntu(우분투) 18.04
Ubuntu(우분투) 20.04
          

메일 관련 패키지 설치

먼저 각 OS 별로 메일 발송을 위해 필요한 패키지 설치를 진행하도록 하겠습니다.

• CentOS 7

yum -y install postfix \
cyrus-sasl-plain make \
ca-certificates coreutils

• CentOS / Oracle Linux 8

dnf -y install postfix \
cyrus-sasl-plain make \
ca-certificates coreutils

• Ubuntu(우분투) 18.04/ 20.04

sudo apt-get install mailutils \
libsasl2-2 libsasl2-modules \
postfix ca-certificates coreutils 

설치중에 설정 내역이 출력 되며 몇가지 선택할 수 있는데 Internet Site 를 선택 하면 되고 , 입력 란에는 서버의 호스트명을 입력 하면 됩니다.

구글 계정 로그인 방식 설정

postfix 설정에 앞서 구글 계정의 로그인 관련하여 설정이 일부 필요 합니다.

애플리케이션에서 로그인 할 경우 “보안 수준이 낮은 앱의 액세스” 허용을 하거나 또는 앱 비밀번호 를 생성하여 사용해야 합니다.

앱 비밀번호는 2차 인증 설정이 되어야 있어야 사용할 수 있습니다.

2가지 방법 중 한가지를 선택 해서 진행하시면 됩니다.
         

보안 수준이 낮은 앱의 액세스

보안 수준이 낮은 앱의 액세스 로 설정하기 위해서는 아래 링크를 통해 접속을 합니다.(로그인 필요)

구글 계정 로그인 방식 설정

postfix 설정에 앞서 구글 계정의 로그인 관련하여 설정이 일부 필요 합니다.

애플리케이션에서 로그인 할 경우 “보안 수준이 낮은 앱의 액세스” 허용을 하거나 또는 앱 비밀번호 를 생성하여 사용해야 합니다.

앱 비밀번호는 2차 인증 설정이 되어야 있어야 사용할 수 있습니다.

2가지 방법 중 한가지를 선택 해서 진행하시면 됩니다.
         

보안 수준이 낮은 앱의 액세스

보안 수준이 낮은 앱의 액세스 로 설정하기 위해서는 아래 링크를 통해 접속을 합니다.(로그인 필요)

https://myaccount.google.com/lesssecureapps

다만 사용하는 VPS 나 클라우드 환경에 따라서 위와 같이 설정하고 접속을 하면 아래와 같이 외국에서의 접속으로 판단하여 경고 메일이 오는 경우가 있습니다(패스워드 유출로 판단)

앱 비밀번호

구글 계정에 2차 인증 설정이 되어있다면 앱 비밀번호 를 생성 하여 사용 할 수 있습니다.
아래 링크에서 2차 인증 설정 및 앱 비밀번호를 생성 할 수 있습니다.

https://myaccount.google.com/u/2/security

접속하면 아래 화면 에서 앱 비밀번호를 생성을 진행 합니다.

그 다음 앱 종류는 “메일” 을 선택 하고 기기는 “기타” 로 설정 하시면 됩니다.

앱 기기 명을 간략하게 입력 후 생성 버튼을 클릭 합니다.

그러면 16자리의 앱 비밀번호를 발급 받을 수 있습니다.

postfix 설정

설치한 MTA(Mail Transfer Agent) 인 postfix 에 대해서 설정을 진행 하도록 하겠습니다.
설정 내역은 OS 모두 동일 합니다.


디렉토리 이동 및 설정 파일 백업

~# cd /etc/postfix

~# cp -rp main.cf main.cf.ori

main.cf 파일 수정

~# vi main.cf


## 아래 내용을 추가 합니다.

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd
inet_protocols = ipv4

패스워드 파일 생성(gmail_passwd)

~# sudo vi /etc/postfix/gmail_passwd

# 파일에 아래 내용을 입력 합니다

[smtp.gmail.com]:587 구글ID@gmail.com:구글계정패스워드

또는

[smtp.gmail.com]:587 구글ID@gmail.com:앱비밀번호

파일명은 포스팅에서의 예시 입니다. 다른 파일명을 사용 하여도 되며 파일명 변경시 위의 main.cf 에서도 변경 하면 됩니다

sasl_passwd 권한 변경 및 테이블 DB 생성

~# sudo chmod 400 /etc/postfix/gmail_passwd

~# sudo postmap /etc/postfix/gmail_passwd

설정이 완료 되었다면 이제 postfix 서비스를 재시작 합니다.

서비스 재시작

~# sudo systemctl restart postfix

메일 발송 테스트 및 로그 확인

설치 및 설정이 완료 되었습니다.

이제 메일 발송이 정상적으로 수행 되는지 터미널에서 아래와 같이 실행하여 테스트 메일을 발송 합니다.

echo "Mail Sending Test, Hotname : $(hostname)" \
 | mailx -s "Subject : Email Test" \
계정@수신자메일서비스.com

메일이 도착하지 않았다면 메일 로그를 통해서 문제점 확인이 필요 합니다.

CentOS/Oracle Linux 계열 
/var/log/maillog

Ubuntu(우분투)
/var/log/mail.log

※위 포스팅이 문제 있을 시 삭제처리 하겠습니다.

출처 : https://hoing.io/archives/1191