라이트세일 LAMP 이메일 발송을 위한 PHP라이브러리 sendmail 설치 확인 및 방법 (php.ini 설정 변경까지) (네이버 smtp.naver.com 사용하기)
php에서 자체적으로 제공하는 메일 발송 함수인 mail()를 사용하여 이메일 발송 테스트를 하였다. 메일은 정상적으로 발송되는지 실패하는지 여부 조차 알수 없었다. 아래 스크립트 파일을 하나 생성 후 테스트를 해본다.
<?php
$mailto="수신자@gmail.com";
$subject="mail test";
$content="test";
$result=mail($mailto, $subject, $content);
if($result){
echo "mail success";
}else {
echo "mail fail";
// error_log($mailto, 0);
}
?>
만약 실패한다면 sendmail설치여부와 php.ini 설정 등을 모두 살펴보아야한다. 안타깝게도 아마존 AWS 라이트세일를 이용하여 LAMP 인스턴스를 생성하였다면 php.ini 설정도 모두 주석처리되어 있으며, sendmail 역시 설치되어 있지않기 때문에 스스로 모든 설치와 설정을 해주어야한다. 아래 내용을 보고 하나씩 따라하면 된다.
메일 발송이 성공이지만 메일이 수신되지 않는 경우 아래 명령어를 실행하여 로그를 확인해서 조치를 취해야한다.
cat /var/log/mail.log
메일 발송 후 처리 결과를 확인하기 위해 아래 명령어를 실행하여 실시간으로 로그를 확인하는 것을 추천한다.
tail -f /var/log/mail.log
sendmail 설치여부 확인하기
다음 명령어를 사용하여 sendmail 설치여부를 확인할 수 있다.
bitnami@ip-xxx:/home$ sudo apt-cache policy sendmail
sendmail:
Installed: (none)
Candidate: 8.15.2-22
Version table:
8.15.2-22 500
500 http://cdn-aws.deb.debian.org/debian bullseye/main amd64 Packages
bitnami@ip-xxx:/home$
Installed: 에 none 이라고 나온다면 sendmail이 서버에 설치되지 않았다는 것을 의미한다. Candidate: 항목에 표시된 버전을 apt 명령어로 설치할 수 있다.
만약 위처럼 정보가 나오지 않는다면 아래 명령어를 통해 apt 리스트를 최신으로 업데이트 해준다.
sudo apt-get update
sendmail 설치하기
sudo apt-get install sendmail
위명령어를 실행 후 계속 하겠냐는 질문(Do you want to continue?) 에 “Y”를 타이핑 해주면 설치가 된다.
bitnami@ip-xxxxx:/home$ sudo apt-cache policy sendmail
sendmail:
Installed: (none)
Candidate: 8.15.2-22
Version table:
8.15.2-22 500
500 http://cdn-aws.deb.debian.org/debian bullseye/main amd64 Packages
bitnami@xxxx:/home$ sudo apt-get install sendmail
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
liblockfile-bin liblockfile1 lockfile-progs procmail sendmail-base sendmail-bin sendmail-cf sensible-mda
Suggested packages:
sendmail-doc rmail logcheck resolvconf sasl2-bin
The following NEW packages will be installed:
liblockfile-bin liblockfile1 lockfile-progs procmail sendmail sendmail-base sendmail-bin sendmail-cf sensible-mda
0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,975 kB of archives.
After this operation, 4,511 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
설치된 위치 확인하기
/etc/mail
/etc/ 폴더 아래 /mail/폴더에 설치가 되며, 하위에 /tls/ 폴더에 설정 파일이 포함되어있다.
sendmailconfig 설정
sudo sendmailconfig
위 명령어 타이핑 후 모든 질문에 “Y”로 답변한다.
php.ini 파일에 sendmail_path 지정하기
다음 명령어를 실행하여 편집기를 열어준다. nano 에디터 사용법을 모른다면 vi 에디터를 사용해도 좋다.
sudo nano /opt/bitnami/php/etc/php.ini
vi /opt/bitnami/php/etc/php.ini
sendmail_path 설정 위치를 찾아 이동해야한다. control + w 키를 누르고 sendmail_path 라는 글자입력, 엔터키(리턴키)를 눌러 해당위치로 찾아간다.
sendmail_path = “env -i /usr/sbin/sendmail -t -i” 로 설정해준다. 그럴리야 없겠지만 만일, php.ini 파일 전체 내용안에서 sendmail_path 라는 변수 자체를 찾을 수 없다면 파일 내용 맨 아래에 추가해주면 된다.
php.ini 파일을 저장하고 nano 편집기를 끝내자! control + x 키 > y 키 > 엔터키를 순서대로 눌러준다.
php.ini파일을 수정 후 php-fpm을 재시작 하지 않으면 적용이 되지 않는다. 아래 명령어를 입력해서 php-fpm과 아파치를 재시작해 준다.
sudo /opt/bitnami/ctlscript.sh restart php-fpm
sudo /opt/bitnami/ctlscript.sh restart apache
만약 위 명령어를 실행했음에도 제대로 동작하지 않는다면 아마존 라이트세일 홈 화면에서 인스턴스를 선택해서 재부팅해주면 된다.
메일 발송은 정상적으로 되었다고 알려주는데, 실질적으로 메일이 오지 않는다.
로그를 확인해보니 타임아웃이 걸리고 있다.
stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.
stat=Deferred: Connection timed out with mx3.naver.com.
보내는 사람을 강제로 박아보았다.
sendmail_path = “env -i /usr/sbin/sendmail -t -i 보내는사람@naver.com”
메일을 보낼때 설정하는 것과 별반 다르지 않았다. 역시 실패!!
su 계정으로 로그인하여 netstat 명령어를 실행하여 보았다.
netstat -ntlp | greo sendmail
내 경우에는 sendmail인 MTA를 사용하여 메일을 보내려고 할 때 이 오류가 발생했다. Deferred: Connection timed out 오류가 발생하면 메일 서버가 방화벽으로 인해 smtp 공급자에 연결할 수 없다는 의미란다. 따라서 방화벽을 확인하고 사용자 정의 포트 번호를 지정하지 않은 한 서버가 smtp 포트인 포트 25, 587 및 465를 수신하고 있는지 확인하라고 한다.(참고:How to Fix “stat=Deferred: Connection timed out error in sendmail”)
네이버의 경우 465번 포트를 사용하는데 나의 서버는 587번 포트와 25번 포트만 열려있었다.
어떻게 추가하지? 혹시나 해서 네이버 메일 설정을 변경해보는 테스트를 해보았다.
네이버 메일 설정에가서 확인해보면 네이버의 POP3/SMTP는 465번 포트를 사용한다.
그래서 나는 네이버 메일 설정에서 POP/SMTP는 사용안함설정으로 변경하고 IMAP/SMTP설정을 사용함으로 변경하였다.
그리고 vi /opt/bitnami/php/etc/php.ini 명령어를 싱행하여 php.ini설정에서 지정했던 465 포트를 587로 변경하고 서버를 재부팅하였다.
그러나 여전히 메일이 수신되지않았다. 네이버 설정과 php.ini를 원래대로 복구처리했다.
sendmail.mc 파일 수정
vi /etc/mail/sendmail.mc 명령어를 실행하여 smtps를 사용하기 위해 한줄을 추가해주었다.
DAEMON OPTIONS(`Port=smtps, Name=TLSMTA, M=s`)dnl
그런다음 sendmail를 재시작해주었다. 재시작 명령어는 아래와 같다.
systemctl restart sendmail
465번 포트가 열렸는지 확인해보았지만 기존 포트도 모드 사라졌다. 뭔가 설정을 잘못 한듯하여 원상 복구하였다.
이 방법으로 사용할 수 없는 것일까?? 나중에 좀더 알아보자. 메일발송용 465번포트만 열어주면 될 것 같은데 잘 모르겠네…
우선은 PHPMailer 를 사용하여 해결했다. 아래 블로그 글을 참고하였다.
LINUX에서 방화벽 설정 때문에 포트 번호를 열어서 사용해야할 때
포트 확인하기
- 열려 있는 모든 포트 보기 : netstat -nap
- 내가 사용하려는 포트 번호가 열려있는지 확인하기 : netstat -nap | grep `포트번호`
- 현재 LISTEN중인 포트 확인하기 : netstat -nap | grep LISTEN
포트 열기
iptables -I INPUT 1 -p tcp –dport `포트번호` -j ACCEPT
I | 새로운 규칙 추가 |
p | 패킷의 프로토콜 명시 |
j | 규칙에 해당되는 패킷을 어떻게 처리할 것인지 |
외부에서 `입력한 포트 번호`로의 연결을 받아들인다는 규칙을 방화벽 1번 규칙으로 추가한다는 뜻이다.
포트 삭제하기
- 추가한 규칙으로 삭제하기 : iptables -D INPUT -p tcp –dport `포트번호` -j ACCEPT
[관련자료]
Enable SMTPS Port 465 in Postfix SMTP Server For Email Submission