G메일 SMTP를 이용해서 메일 자동 발송하기 - php 환경
"상담 게시글이 올라오면, 담당자에게 자동으로 알림 메일이 가도록 해주세요!"
라는 요구사항을 만나고 이 글까지 오셨다면, 초보 개발자분 이거나 혹은 마케터 혹은 개발자가 아닌 분들이 대부분이실 것 같습니다. 이미 자동메일 발송에 대한 개발을 경험하신 시니어 개발자분들은 충분한 솔루션을 가지고 있거든요.
상담 게시글은 올라간다는 것은 DB의 특정 테이블에 새로운 행이 Insert 된다는 이야기니까, 웹사이트의 코드를 가만히 따라가보면 분명히 상담을을 DB에 인서트 해주는 부분이 있을 겁니다. DB업데이트를 해주는 코드 이후로 메일 발송 코드를 작성해주면 되는 것이겠죠?
참고로 이 과정을 얼마 전에 Make 같은 노코딩 툴로도 진행을 해보았었는데요, 말이 No-Code 이지 사실 손이 더 많이 가고 부정확하고 훨씬 더 세팅이 어려웠습니다. 특히나 이메일 자동발송 기능은 '스팸정책'과도 밀접한 관련이 있어서, 자동발송에는 여러가지 제약이 많이 따라오거든요. 차라리 이 참에 코드로 짜서 해결하는 방법을 스터디 해두는 것이 훨씬 경제적인 방법이 될 것이라고 확인하는 바입니다.
그러면, 메일 서버가 없는 일개 개인의 입장에서 어떻게 하면 자동메일 발송 시스템을 만들 수가 있을까요?
그 과정을 따라가보기로 합니다!
1. PHPMailer 라이브러리 사용을 준비해줍니다.
Composer 등을 이용하면 좋겠지만, 기존에 이미 다른 사람이 만들어 놓은 웹사이트라서 PHPMailer 라이브러리를 수동으로 다운로드 받아서 적용하기로 합니다.
아래는 GitHub 경로.
https://github.com/PHPMailer/PHPMailer
GitHub - PHPMailer/PHPMailer: The classic email sending library for PHP
The classic email sending library for PHP. Contribute to PHPMailer/PHPMailer development by creating an account on GitHub.
github.com
[Code] 버튼을 클릭한 후 Download ZIP을 클릭합니다. 그리고 내 PC 적당한 곳에 PHPMailer 라이브러리 소스를 다운로드 받습니다.
압축을 풀면, src 폴더에 있는 PHPMailer.php, SMTP.php, Exception.php 파일을 프로젝트 내 적절한 위치(예: lib/phpmailer/)에 복사합니다.
음.. 그런데 FTP에 접속을 해보니, 3년 전에 이 웹사이트가 만들어질 때, 이미 plugin폴더로 구성을 해두었더군요. 내가 만든 사이트가 아니니.. 저 PHPMailer는 어디에 어떻게 쓰이고 있는 지 저는 모릅니다.(대부분 남이 만들어 놓은 사이트를 열어보게 되면 마주하게 되는 현실입니다. php 기반의 소형 사이트라서 당연히 산출물이나 인수인계 문서도 없을 확률이 높겠습니다.)
어차피 3년 전 코드이기도 해서, 간단하게 폴더 하나를 더 만들어서 사용하기로 합니다.
[PHPMailer2025]라는 폴더를 생성하고, G메일 SMTP에 활용할 파일 3가지만 업로드 해두었습니다.
2. G메일 설정 (App Password 생성)
구글이 제공해주는 G메일 SMTP를 사용하기 위해서는 내가 사용하는 G메일 계정에서 2단계 인증을 마친 후 App Password를 생성해서 활용해야 합니다. 이 과정은 이전 포스팅 자료를 참고해주세요.
Google - Gmail SMTP 사용을 위한 세팅 : 2025년 버전
Google - Gmail SMTP 사용을 위한 세팅 : 2025년 버전
Google - Gmail SMTP 사용을 위한 세팅 : 2025년 버전 SMTP를 빌려 사용하려면, 역시나 갓구글의 G메일이 가장 효율이 좋은 것 같습니다. 다만 불편한 것은 불친절한 사용 설명들이죠.지난 2023년 즈음에도
kincoding.com
Google - Gmail SMTP 사용을 위한 세팅
Google - Gmail SMTP 사용을 위한 세팅 G메일에서 제공하는 SMTP를 사용하여 메일발송을 해야 하는 경우가 있습니다. 보통 자체 서버를 운용하는 게 아니라, 웹호스팅 등을 사용하고 있는 경우라면 SMTP
kincoding.com
3. PHP에서 메일 발송용 코드를 짜 봅시다.
원리는 대략 이렇습니다.
- PHPMailer 인스턴스를 생성한다.
- G메일의 SMTP를 사용하기 위해서 보내줘야 하는 정보들을 인스턴스에 담는다.
- send() 함수를 통해서 SMTP로 전송한다.
- 나머지 실제 발송은 G메일의 SMTP가 처리한다.
그럼 제가 사용한 php 코드를 살펴보겠습니다.(요구사항이 발생한 곳이 php 환경이라 php로 짜보았습니다.)
가능한 주석을 상세하게 달아두려고 했습니다. 찬찬히 살펴보시면, 대략적인 흐름을 확인하실 수 있을 겁니다.
(이해하기 어려운 경우에는 AI의 도움을 받아보세요^^)
// 상담 게시판에 고객이 문의를 작성하면, DB에 Insert하고 담당자에게 알림 메일을 보냄.
// 윗쪽에는 상담게시판에 작성된 내용을 폼전송하여 DB에 Insert를 처리하는 등의 코딩이 있음.
// PHPMailer 파일 경로 설정
// G5_PATH 상수가 정의되지 않은 비정상적인 상황에 대비하여 정의되지 않았다면 빈 문자열로 처리
// ↑ GNUBoard를 사용한 사이트라서 추가한 내용입니다.(필요없는 경우에는 생략)
define('PHPMailer_ROOT_PATH', (defined('G5_PATH') ? G5_PATH : '') . '/plugin/PHPMailer2025');
// PHPMailer 라이브러리 파일 포함
require_once PHPMailer_ROOT_PATH . '/PHPMailer.php';
require_once PHPMailer_ROOT_PATH . '/SMTP.php';
require_once PHPMailer_ROOT_PATH . '/Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// 폼 타입별 메일 제목, 메일 본문 (HTML, Plain), 리다이렉트 URL, 수신자 이메일 설정
$mail_tit = ""; // 메일 제목의 일부로 사용될 폼 제목
$message = ""; // 메일 본문 (HTML 형식)
$alt_message = ""; // 메일 본문 (Plain Text 형식, HTML 미지원 클라이언트용)
$url = ""; // 문의 등록 성공 후 리다이렉트 될 contact_success.php 페이지의 url 파라미터 값
$recipient_email = ""; // 이메일을 수신할 담당자 이메일 주소
// --- 이메일 발송 로직 시작 ---
// G메일 SMTP 설정 정보
$smtp_host = 'smtp.gmail.com'; // G메일 SMTP 서버 주소
$smtp_port = 587; // G메일 TLS 암호화 포트 (SSL은 465).
// PHPMailer 설정 부분을 보시면 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; 라고 되어 있음.
// 이 부분은 이메일 전송 시 TLS 암호화 방식을 사용하겠다고 명시하는 설정
$smtp_username = 'my_email@gmail.com'; //G메일 앱을 생성한 본인의 G메일주소
$smtp_password = 'xxxxxxxxxxxxxxxx'; // G메일 앱 비밀번호, (2단계 인증 필요)
$from_email = $smtp_username; // 보내는 이메일 주소(본인 메일을 다시 적용했음. 마음대로 세팅)
$from_name = '문의 접수 시스템'; // 수신자에게 보여질 보내는 사람 이름
// PHPMailer 인스턴스 생성
$mail = new PHPMailer(true); // true 설정 시 예외 발생 (try-catch로 잡기 용이)
try {
// SMTP 서버 설정
$mail->isSMTP(); // SMTP 사용 설정
$mail->Host = $smtp_host; // SMTP 서버 주소
$mail->SMTPAuth = true; // SMTP 인증 활성화
$mail->Username = $smtp_username; // SMTP 사용자 이름 (G메일 주소)
$mail->Password = $smtp_password; // SMTP 비밀번호 (앱 비밀번호)
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS 암호화 사용 (ssl은 PHPMailer::ENCRYPTION_SMTPS 및 포트 465 사용)
$mail->Port = $smtp_port; // 사용할 TCP 포트 (TLS 기본값: 587)
// 인코딩 및 문자셋 설정
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64'; // 한글 제목/내용에 주로 사용되는 인코딩 방식 (선택 사항)
// 보내는 사람 설정
$mail->setFrom($from_email, $from_name);
// 받는 사람 설정
if (!empty($recipient_email)) { // 수신자 이메일이 설정되어 있는지 확인
$mail->addAddress($recipient_email); // 담당자 이메일 주소
// 추가 수신자가 있다면 아래 라인 주석 해제 후 사용
// $mail->addAddress('추가담당자@yourdomain.com', '추가 담당자 이름');
// 참조(CC), 숨은 참조(BCC) 추가 시 사용
// $mail->addCC('참조이메일@yourdomain.com');
// $mail->addBCC('숨은참조이메일@yourdomain.com');
// 이메일 제목 및 내용 설정
$mail->isHTML(true); // 본문을 HTML로 설정
$mail->Subject = "[".$mail_tit."] 새로운 문의가 접수되었습니다."; // 이메일 제목 (폼 타입 명시)
$mail->Body = $message; // HTML 본문 (switch 문에서 생성)
$mail->AltBody = $alt_message; // Plain Text 본문 (HTML 미지원 클라이언트용)
// 메일 발송 실행
$mail->send();
// echo '메일이 성공적으로 발송되었습니다.'; // 개발/디버깅 시 확인용
error_log("Email sent successfully for form type: " . $type . ", Recipient: " . $recipient_email); // 발송 성공 로그 기록 (운영 시 필요)
} else {
// 수신자 이메일이 설정되지 않은 경우 메일 발송 시도하지 않음
error_log("Warning: Email send skipped. No recipient email set for form type: " . $type); // 경고 로그 기록 (운영 시 필요)
}
} catch (Exception $e) {
// 메일 발송 중 오류 발생 시 처리
// 사용자에게 오류를 직접 표시하지 않는 것이 일반적입니다.
// 에러 로그에 자세한 정보를 기록하여 관리자가 확인하도록 합니다.
error_log("메일 발송 실패. 폼 타입: {$type}, Recipient: {$recipient_email}, PHPMailer Error: {$mail->ErrorInfo}"); // 에러 로그 기록 (운영 시 필요)
// echo "메일 발송에 실패했습니다. 오류: {$mail->ErrorInfo}"; // 개발/디버깅 시 확인용 (운영 시 주석)
}
// --- 이메일 발송 로직 끝 ---
[참고사항]
PHPMailer를 사용하면, 스팸으로 걸러지는 경우가 거의 없습니다.
PHP의 기본 mail() 함수는 SMTP 인증 등을 제대로 지원하지 않아 G메일과 연동하기 어렵기 때문에, 그 보다 성능이 좋은 PHPMailer 라이브러리를 사용한 것입니다.
마치며
개발에 손을 대고 있다면, 언젠가는 '자동메일 발송'을 가능하게 해달라는 요구사항을 받기 마련입니다. 실제 사용된 코드를 보여드리기 위해 php 환경에서 발생한 케이스를 포스팅했습니다만, 다른 언어 환경에서도 G메일의 SMTP를 활용해서 메일을 발송하는 과정은 대동소이합니다.
처음이 항상 어려운 법이지, 한 두 번 정도 이 과정을 경험하면서 흐름을 익히고 나면, AI에게 잘 물어보면서 위 과정을 진행한다면 대개 성공까지 완만하게 도달하실 수 있을거라 생각이 됩니다.
개발자들의 전유물 같았던, 메일자동발송 기능도 찬찬히 뜯어보면 생각보다 쉽게 원하시는 결과에 이를 수 있을 거라 확신합니다.
오늘도 즐거운 코딩생활, 즐코딩.
KINcoding.com
'PHP' 카테고리의 다른 글
PHP 사용을 위한 VSCode 기본 설치 내용 (0) | 2024.05.16 |
---|---|
XAMPP 설치(ft. Local에서 PHP를 사용할 일이 생겼...) (2) | 2024.05.14 |
댓글