PHP / PHPMailer / SMTP를 이용하여 메일 발송하게 하는 라이브러리
PHP의 mail() 함수를 이용하여 메일을 보낼 수 있다. 그런데 이렇게 발송한 메일은 스팸으로 인식되는 경우가 많다. 정상적으로 메일을 수신토록 하려면 SMTP를 이용하는 게 좋다.
PHPMailer는 SMTP를 이용하여 메일 발송하게 하는 라이브러리다. PHPMailer를 이용하여 메일을 발송하는 방법을 정리한다.
목차
다운로드 및 업로드
- GitHub에서 소스를 다운로드한다.(https://github.com/PHPMailer/PHPMailer)
- 압축을 풀고 서버에 업로드한다.
Composer를 이용하여 설치할 수도 있지만, 서버를 제어할 권한이 없는 경우도 많으므로 다운로드 방식을 택하였다.
메일 보내기 테스트
기본 코드
- 다음은 GitHub의 예제 코드에서 꼭 필요한 것만 추려낸 것이다. 실행하면 메일을 발송하고 Message has been sent를 출력한다.
- require로 php 파일을 불러오는데, 경로는 해당 파일의 위치로 맞춘다.
- smtp 정보는 해당 서버의 설정에 맞게 입력한다.
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; require 'src/Exception.php'; require 'src/PHPMailer.php'; require 'src/SMTP.php'; $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = 'xxx'; $mail->SMTPAuth = true; $mail->Username = 'xxx'; $mail->Password = 'xxx'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = xxx; $mail->setFrom('from@from.com', 'FROM'); $mail->addAddress('to@to.com', 'TO'); $mail->isHTML(true); $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->send(); echo 'Message has been sent'; ?>
네이버 SMTP 사용하기
구글 SMTP 사용하기
Microsoft 365 SMTP 사용하기
- Microsoft 365, 즉 Exchange Online의 SMTP를 사용하고 싶다면 다음과 같이 설정한다.
- Username과 발신자 주소가 다르면 발송이 되지 않으니, 발신자 주소와 동일한 계정을 사용한다.
$mail->Host = 'smtp.office365.com'; $mail->SMTPAuth = true; $mail->Username = 'user@example.com'; $mail->Password = 'password'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587;
메일 폼 만들기
- 제목과 내용을 입력 후 [제출]을 클릭하면 메일이 발송된다.
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; require 'src/Exception.php'; require 'src/PHPMailer.php'; require 'src/SMTP.php'; $subject = $_POST[ 'subject' ]; $content = $_POST[ 'content' ]; if ( !is_null( $subject ) ) { $mail = new PHPMailer( true ); $mail->isSMTP(); $mail->Host = 'smtp.office365.com'; $mail->SMTPAuth = true; $mail->Username = 'user@example.com'; $mail->Password = 'password'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; $mail->setFrom( 'user@example.com', 'FROM' ); $mail->addAddress( 'user@example.com', 'TO' ); $mail->isHTML( true ); $mail->Subject = $subject; $mail->Body = $content; $mail->send(); $send = 'Yes'; } ?> <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>PHP</title> <style> body { font-family: sans-serif; } input, textarea { font-family: sans-serif; } textarea { width: 600px; height: 300px; } </style> </head> <body> <?php if ( $send == 'Yes' ) { echo '<p>Message has been sent.</p>'; } ?> <form action="mail.php" method="POST"> <p><input type="text" name="subject" placeholder="제목" required /></p> <p><textarea name="content" required></textarea></p> <p><input type="submit" /></p> </form> </body> </html>
TIP
한글이 깨지는 경우
한글 등 문자가 깨지는 경우 다음 코드를 추가한다.
$mail->Charset = 'UTF-8';