Amazon SES와 PHPMailer를 연계해서 EC2에서 메일 송신해 보기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번 블로그에서는 Amazon SES와 PHPMailer를 연계해서 EC2에서 메일을 송신해 보는 과정을 정리해 봤습니다.
사전 설정
먼저 EC2는 Amazon Linux 2023을 이용하고 있습니다.
EC2의 보안 그룹 인바운드 규칙에는 다음을 추가합니다.
| 유형 | 포트 | 프로토콜 | 소스 |
|---|---|---|---|
| SMTP | 25 | TCP | 0.0.0.0/0 |
| POP3 | 110 | TCP | 0.0.0.0/0 |
| IMAP | 143 | TCP | 0.0.0.0/0 |
| 사용자 지정 TCP | 587 | TCP | 0.0.0.0/0 |
| HTTP | 80 | TCP | 0.0.0.0/0 |
이어서 아파치를 설치합니다.
# 패키지 업데이트
sudo dnf update -y
# Apache 설치
sudo dnf install -y httpd
# Apache 시작
sudo systemctl start httpd
# 부팅 시 자동 시작 설정
sudo systemctl enable httpd
# 상태 확인
sudo systemctl status httpd
아파치 설치가 끝났다면 PHPMailer 설치를 진행합니다.
# PHP 설치
sudo dnf install -y php
sudo systemctl restart httpd
# Composer 설치 후 PHPMailer 설치
cd /var/www/html
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
composer require phpmailer/phpmailer
Amazon SES 설정
Apache를 설치했다면 Amazon SES를 설정합니다.
자격 증명 생성
먼저 SES 콘솔 화면에서 [자격 증명]을 클릭한 다음 [자격 증명 생성]으로 들어갑니다.

[도메인]을 선택하고 EC2 서버의 도메인을 입력합니다.
※ *.jaewook.도메인.com과 같이 *를 쓸 필요 없이 jaewook.도메인.com를 입력하는 것으로 문제 없습니다.

마지막으로 AWS가 권장하고 있는 디폴트 값을 유지한 상태로 자격 증명 생성을 끝마칩니다.
여기서 도메인을 Route53에서 관리하고 있다면 [Route53에 DNS 레코드 개시]를 체크해 두면 자동으로 CNAME 레코드를 등록합니다. 별도 DNS 서버를 운영하고 있다면 체크를 해제합시다.

Route53를 이용하고 있다면 [Route53에 DNS 레코드 개시]를 체크한 것으로 자동으로 CNAME이 등록 되었을 것이고, DNS 서버에 별도로 등록이 필요하다면 [DNS 레코드 게시]를 클릭하여 CNAME을 확인하고 등록 작업을 진행합니다.

마지막으로 자격 증명에서 이메일을 선택하여 본인 이메일을 입력합니다.
현재 SES는 [샌드박스 모드]이기 때문에 인증한 주소에만 발송 가능한 상태입니다. 샌드박스를 해제한다면 누구에게나 발송이 가능하지만, 테스트 환경이기 때문에 본인 이메일 주소만을 입력하고 입력한 이메일 주소로 메일이 잘 전송 되는지 확인할 생각입니다.
이메일을 입력하고 자격 증명을 생성했다면 입력한 이메일로 인증 요청 메일이 올 것이기 때문에 확인합니다.

SMTP(Simple Mail Transfer Protocol) 설정
이어서 SMTP 보안 인증 생성을 진행합니다.
SES 콘솔 화면에서 [SMTP 설정]을 클릭하여 [SMTP 보안 인증 생성]을 진행합니다.

적절하게 [사용자 이름]을 입력하고 [사용자 생성]을 클릭합니다.
사용자를 생성하면 아래와 같은 정보를 확인할 수 있으니 .csv 파일로 받거나 기록해 둡니다.
- IAM 사용자 이름
- SMTP 사용자 이름
- SMTP 비밀번호

테스트 PHP 파일 작성
마지막으로 테스트 PHP 파일을 작성합니다.
# PHP 파일 작성
sudo vi /var/www/html/test_mail.php
PHP 코드는 다음과 같습니다.
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '/var/www/html/vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'email-smtp.ap-northeast-1.amazonaws.com';
$mail->SMTPAuth = true;
$mail->Username = 'SES SMTP 유저명';
$mail->Password = 'SES SMTP 패스워드';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('no-reply@도메인 주소');
$mail->addAddress('본인 메일 주소');
$mail->Subject = 'SES テスト';
$mail->Body = 'テストメールです';
$mail->send();
echo '送信成功';
} catch (Exception $e) {
echo "送信失敗: {$mail->ErrorInfo}";
}
메일 전송 테스트
이제 웹 브라우저에서 [도메인/test_mail.php]으로 접속을 시도해 보면, [送信成功]이라는 화면이 표시되는 것을 확인할 수 있습니다.
이메일 혹은 스팸 메일 쪽에서 확인해 보면 메일이 성공적으로 도착한 것을 확인할 수 있습니다.

스팸 메일로 분류된 이유는 현재 샌드박스 모드 + 새 도메인이라 메일 신뢰도가 낮은 상태이기 때문입니다.
실제 운용 시에는 아래 대응으로 스팸 분류를 줄일 수 있습니다.
| 방법 | 대응 효과 |
|---|---|
| 샌드박스 해제 | 신뢰도 향상 |
| DMARC 레코드 추가 | 스팸 판정 감소 |
| 발송 실적 쌓기 | 도메인 평판 향상 |
정리
이번 글에서는 Amazon SES와 PHPMailer를 연계하여 EC2 환경에서 메일을 송신하는 과정을 확인해 보았습니다.
EC2에 Apache와 PHP, PHPMailer를 설치한 뒤 Amazon SES에서 도메인 인증과 SMTP 자격 증명을 생성하고, PHPMailer를 통해 SES SMTP 엔드포인트로 메일을 전송하는 구성입니다.
실제로 테스트를 진행한 결과, 웹 브라우저를 통해 PHP 스크립트를 실행하는 것만으로 SES를 경유한 메일 발송이 정상적으로 이루어지는 것을 확인할 수 있었습니다.
현재는 SES 샌드박스 환경에서 테스트를 진행했기 때문에 인증된 이메일 주소로만 메일을 발송할 수 있지만, 샌드박스 해제 이후에는 서비스 환경에서도 동일한 방식으로 활용할 수 있습니다.
또한 메일이 스팸으로 분류될 가능성을 줄이기 위해서는 SPF, DKIM, DMARC 설정을 적절히 구성하고, 도메인 평판을 관리하는 것이 중요합니다. 특히 SES에서 제공하는 DKIM 인증을 활성화하고 DMARC 정책을 적용하면 메일 신뢰도를 높이는 데 도움이 됩니다.
Amazon SES를 활용하면 별도의 메일 서버를 직접 구축하거나 운영하지 않아도 안정적으로 메일 송신 기능을 구현할 수 있습니다. 회원가입 인증 메일, 비밀번호 재설정 메일, 알림 메일 등 다양한 서비스에서 손쉽게 활용할 수 있으므로, 메일 송신 기능이 필요한 경우 Amazon SES를 적극적으로 검토해 보는 것도 좋을 것 같습니다.










