PHP / PHPMailer / SMTP를 이용하여 메일 발송하게 하는 라이브러리

PHP의 mail() 함수를 이용하여 메일을 보낼 수 있다. 그런데 이렇게 발송한 메일은 스팸으로 인식되는 경우가 많다. 정상적으로 메일을 수신토록 하려면 SMTP를 이용하는 게 좋다.

PHPMailer는 SMTP를 이용하여 메일 발송하게 하는 라이브러리다. 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';
같은 카테고리의 다른 글
PHP / Session / 세션 값 출력하는 방법

PHP / Session / 세션 값 출력하는 방법

세션(Session)에 값을 저장했을 때, 그 값을 출력하는 방법을 간단한 예제로 알아보겠습니다. 세션을 초기화합니다. 이때 id가 하나 발급됩니다. session_start(); 세션의 no에 123을, username에 abc를 저장합니다. $_SESSION = 123; $_SESSION = 'abc'; 세션의 id를 출력합니다. echo session_id(); 세션의 no의 값을 출력합니다. echo $_SESSION; 세선의 username의 값을 출력합니다. echo $_SESSION; 세션의 모든 값을 출력합니다. var_dump( $_SESSION ); 다음은 전체 ...

PHP / Session / 로그인, 로그아웃, 로그인 상태에서만 보이는 콘텐츠 만들기

PHP / Session / 로그인, 로그아웃, 로그인 상태에서만 보이는 콘텐츠 만들기

PHP의 세션을 이용하여 로그인, 로그아웃을 만들 수 있습니다. 그리고 로그인한 사용자만 볼 수 있는 콘텐츠를 만들 수도 있습니다. 다음은 이를 구현한 아주 간단한 예제입니다. inc_head.php 모든 페이지에 들어갈 코드입니다. include 함수로 각 페이지에서 불러올 것입니다. 세션의 username 값이 있다면, 즉 로그인 상태라면 $jb_login에 TRUE를 할당합니다. <?php session_start(); if( isset( $_SESSION ...

PHP / 함수 / 날짜, 시간 / date(), localtime(), mktime(), time(), microtime()

PHP / 함수 / 날짜, 시간 / date(), localtime(), mktime(), time(), microtime()

date() 개요 Timestamp를 원하는 형식으로 출력하는 함수입니다. 문법 date( format, timestamp ) format : 필수 항목입니다. 출력할 형식을 정합니다. timestamp : 선택 항목입니다. 값이 없으면 현재 timestamp를 사용합니다. 예제 <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>PHP</title> <style> body { ...

PHP / 함수 / md5() / 문자열에서 md5 해시값 생성하는 함수

PHP / 함수 / md5() / 문자열에서 md5 해시값 생성하는 함수

개요 md5()는 문자열에서 md5 해시값을 생성하는 함수입니다. 해시값에서 원래의 문자열을 만들지는 못합니다. 문자열이 같다면 같은 해시값을 만드므로, 비밀번호를 암호화하여 저장하는 용도로는 맞지 않습니다. It is not recommended to use this function to secure passwords, due to the fast nature of this hashing algorithm. 문법 md5( string $str ) str : ...

PHP / 회원 관리 / 비밀번호 변경 페이지

PHP / 회원 관리 / 비밀번호 변경 페이지

change-password.php $_SESSION의 값으로 로그인 여부를 판단합니다. 로그인 상태가 아니라면 로그인 페이지로 이동합니다. 로그인 상태라면 $current_password의 값으로 새 비밀번호를 입력했는지 확인합니다. 새 비밀번호를 입력했다면 현재 비밀번호가 맞는지 확인합니다. 맞지 않다면 '현재 비밀번호가 틀렸습니다.'를 출력합니다. 현재 비밀번호가 맞다면 새로 입력한 비밀번호 두 개가 일치하는지 확인합니다.일치하지 않는다면 '새 비밀번호가 일치하지 않습니다.'를 출력합니다. 새 비밀번호 두 개가 ...

PHP / 파일 업로드 만들기

PHP / 파일 업로드 만들기

PHP로 파일 업로드 기능을 구현해본다. 다음은 파일을 업로드하기 위한 간단한 HTML 문서. <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>PHP</title> </head> <body> <form action="" method="POST" enctype="multipart/form-data"> <p><input type="file" name="myfile"></p> <p><input type="submit" name="action" value="Upload"></p> </form> </body> </html> 파일을 업로드하면 $_FILES 번수에 배열로 name, type, size, ...

PHP / MariaDB / 데이터베이스 값 가져와서 출력하기

PHP / MariaDB / 데이터베이스 값 가져와서 출력하기

이 강좌에서 사용하는 데이터베이스는 employees입니다. (employees 설치 하기) employees 출력하기 employees 테이블에는 직원 목록이 있습니다. 그 목록을 가져와서 출력해보겠습니다. 데이터베이스 연결 정보 employees 데이터베이스에 연결하기 위한 정보를 입력합니다. localhost, username, password는 적절히 변경합니다. $jb_conn = mysqli_connect( 'localhost', 'username', 'password', 'employees' ); 쿼리 작성하기 쿼리를 만듭니다. 아래는 employees 테이블에서 5개의 레코드를 가져오는 쿼리입니다. $jb_sql = "SELECT * FROM employees LIMIT ...

PHP / 당월 초일, 당월 말일 구하는 방법

PHP / 당월 초일, 당월 말일 구하는 방법

당월 초일과 당월 말일은 date() 함수를 이용하여 구할 수 있다. 초일은 항상 1일이므로, 아래처럼 날짜에 01을 넣어서 구한다. date( 'Y-m-01' ) 말일은 날짜 자리에 t를 넣어서 구한다. date( 'Y-m-t' ) 다음은 당월 초일과 말일을 출력하는 간단한 예이다. <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>HTML</title> <style> ...

PHP / 조건문 / switch

PHP / 조건문 / switch

switch는 하나의 변수를 여러 값과 비교할 때 유용한 조건문입니다. 문법 switch ( $var ) { case value1: statement1; break; case value2: statement2; break; ... default: statement3; } $var의 값을 value1과 비교하여 value1과 같으면 statement1을 실행하고 ...

PHP / 메모

PHP / 메모

HTML 확장자에서도 PHP 코드 실행시키는 방법 PHP는 보통 확장자가 php인 파일에서 실행됩니다. 하지만 설정을 추가하여 다른 확장자 파일에서도 php가 실행되도록 할 수 있습니다. 만약 아파치 웹서버에서, 확장자가 html인 파일에서도 php가 실행되도록 하려면, 설정 파일에 다음 코드를 추가합니다. AddType application/x-httpd-php .html