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';

Related Posts

PHP / MariaDB / 데이터베이스에 데이터 입력하기

PHP / MariaDB / 데이터베이스에 데이터 입력하기

이 강좌에서 사용하는 데이터베이스는 employees입니다. (employees 설치 하기) 폼(Form) 만들기 - employees_add.php 데이터를 입력할 폼을 만듭니다.(number, date 타입과 required는 HTML5부터 지원합니다.) 값은 employees_insert.php로 전송됩니다. <form action="employees_insert.php" method="POST"> <p><input type="number" name="emp_no" placeholder="NO" required></p> <p><input type="date" name="birth_date" required></p> <p><input type="text" name="first_name" placeholder="First Name" required></p> <p><input type="text" name="last_name" placeholder="Last Name" required></p> <p><select name="gender" ...

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 / 함수 / substr() / 문자열의 일부분을 추출하는 함수

PHP / 함수 / substr() / 문자열의 일부분을 추출하는 함수

개요 substr()은 문자열의 일부분을 추출하는 함수입니다. PHP 4 이상에서 사용할 수 있습니다. 문법 substr( string, start ) string : 추출의 대상이 되는 문자열입니다. start : 추출을 시작하는 위치입니다. length : 추출할 문자의 개수입니다. 값이 없으면 문자열의 끝까지 추출합니다. 음수일 때는 위치를 뜻하고, 그 위치 앞까지의 문자를 추출합니다. substr( 'abcdefg', 3 ); abcdefg에서 3 위치의 문자는 d입니다. ...

PHP / 회원 관리 / 세션(SESSION) 추가하기, 로그아웃 페이지

PHP / 회원 관리 / 세션(SESSION) 추가하기, 로그아웃 페이지

login.php 로그인 한 상태인지 로그인 하지 않은 상태인지 파악하기 위해 login-ok.php로 넘어가기 전에 세션을 시작합니다. 그리고 username을 $_SESSION에 담습니다. <?php $username = $_POST; $password = $_POST; if ( !is_null( $username ) ) { $jb_conn = mysqli_connect( 'localhost', 'codingfactory', '1234qwer', 'codingfactory.net_example' ...

PHP / 함수 / password_verify() / password_hash()로 만든 암호화된 문자열이 입력한 비밀번호와 같은지 확인하는 함수

PHP / 함수 / password_verify() / password_hash()로 만든 암호화된 문자열이 입력한 비밀번호와 같은지 확인하는 함수

개요 password_verify()는 password_hash()로 암호화한 비밀번호가 사용자가 입력한 값과 같은지 확인하는 함수입니다. 암호화된 문자열을 원래 문자열로 바꾸는 것이 아니고, 단지 같은지 다른지를 비교하여 TRUE 또는 FALSE를 반환합니다. 문법 password_verify ( string $password , string $hash ) $password : 사용자가 입력한 비밀번호입니다. $hash : password_hash()로 암호화된 문자열입니다. 예제 password_hash() 함수로 mypw를 암호화하고 변수 encrypted_password에 저장합니다. $encrypted_password = password_hash( 'mypw', PASSWORD_DEFAULT ...

PHP / Ubuntu / Apache / HTML 확장자에도 PHP 코드 인식되도록 설정하는 방법

PHP / Ubuntu / Apache / HTML 확장자에도 PHP 코드 인식되도록 설정하는 방법

Ubuntu에 Apache로 웹서버를 만들고 PHP를 사용할 수 있게 만든 경우, 기본적으로 확장자가 php인 경우에만 PHP 코드를 인식합니다. 만약 확장자가 html일 때로 PHP 코드가 인식되도록 하고 싶다면, Apache 설정을 바꿔줘야 합니다. /etc/apache2/mods-enabled/mime.conf 파일을 엽니다. 다음 코드를 추가합니다. AddType application/x-httpd-php .html 확장자가 htm인 경우에도 PHP를 인식하도록 하고 싶다면 다음처럼 합니다. AddType application/x-httpd-php .html .htm 웹서버를 다시 로드합니다. service apache2 ...

PHP / SQL Server / Ubuntu 18.04에서 연결하는 방법

PHP / SQL Server / Ubuntu 18.04에서 연결하는 방법

PHP에서 SQL Server에 연결하는 방법입니다. 서버 OS는 Ubuntu 18.04이고 Apache, PHP는 설치되어 있는 상태에서 시작합니다. 아래의 내용은 꼭 필요한 것만 모은 요약이며, 자세한 내용은 Microsoft 홈페이지에서 보실 수 있습니다. 소프트웨어 설치 다음의 명령을 차례대로 실행하여 필요한 소프트웨어를 설치합니다. curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list apt-get update ACCEPT_EULA=Y apt-get install msodbcsql17 apt-get install unixodbc-dev apt install ...

PHP / 연산자 / 논리 연산자

PHP / 연산자 / 논리 연산자

$a and $b $a와 $b가 모두 TRUE이면 TRUE를 반환합니다. $a or $b $a 또는 $b가 TRUE이면 TRUE를 반환합니다. 주의할 점은 둘 다 TRUE일 때도 TRUE라는 것입니다. 즉, 둘 다 FALSE일 때만 FALSE입니다. $a xor $b $a와 $b 중 하나만 TRUE일 때만 TRUE를 반환합니다. ! $a $a가 TRUE가 아니면 TRUE를 반환합니다. $a && $b $a와 $b가 모두 TRUE이면 TRUE를 반환합니다. $a ...

PHP / 함수 / var_dump() / 변수의 정보를 출력하는 함수

PHP / 함수 / var_dump() / 변수의 정보를 출력하는 함수

개요 var_dump는 변수의 정보를 출력하는 함수입니다. PHP 4 이상에서 사용할 수 있습니다. 문법 var_dump( $var1, $var2, ... ); 결과의 해석은 다음과 같습니다. int(1) : 정수이고, 값은 1입니다. float(1.1) : 실수이고, 값은 1.1입니다. string(5) "hello" : 5개의 문자로 이루어진 문자열이고, 값은 hello입니다. array(2) { => float(1.1) } : 2개의 값을 가진 배열이고, 첫번째 값은 정수 1, 두번째 값은 ...

PHP / 반복문 / while, do-while, for

PHP / 반복문 / while, do-while, for

while 문법 while ( condition ) {   statement; } condition을 만족할 때까지 중괄호 안에 있는 statement를 실행합니다. 중괄호 대신 콜론(:)과 endwhile을 사용할 수도 있습니다. while ( condition ) :   statement; endwhile; 예제 <?php   $i = 1; // 초기값 설정   while ( $i < 10 ) ...