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 / 함수 / strlen(), mb_strlen() / 문자열의 길이 구하는 함수

PHP / 함수 / strlen(), mb_strlen() / 문자열의 길이 구하는 함수

개요 strlen()와 mb_strlen()은 문자열의 길이를 구하는 함수입니다. strlen()은 바이트 기준, mb_strlen()은 문자셋 기준입니다. 한글 등에서는 값이 다릅니다. 문법 - strlen() strlen( string ) string : 길이를 구할 문자열입니다. echo strlen( '123 abc' ); 는 7을 출력합니다. echo strlen( '가나다' ); 는 9를 출력합니다. 문법 - mb_strlen() mb_strlen( string ) string : 길이를 구할 문자열입니다. encoding : 인코딩 방식을 정합니다. 정하지 않으면 ...

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 / $_GET, $_POST - 양식(form)으로 전송된 데이터 받기

PHP / $_GET, $_POST - 양식(form)으로 전송된 데이터 받기

GET과 POST HTML의 form을 이용하여 값을 전송하는 방식은 get과 post 두 가지가 있습니다. PHP로 그 값을 받아서 사용하는 방법을 알아봅니다. GET 방식으로 전송한 경우 다음은 GET 방식으로 값을 전송하는 간단한 예제입니다. form.php <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>HTML</title> <style> * { ...

PHP / 현재 페이지의 URL 정보 가져오는 방법

PHP / 현재 페이지의 URL 정보 가져오는 방법

$_SERVER를 이용하여 현재 페이지의 URL 정보를 가져올 수 있다. $_SERVER : 도메인 $_SERVER : 도메인 다음 부분 $_SERVER : GET 방식으로 넘어온 값 $_SERVER : 도메인 다음 부분에서 GET 방식으로 넘어온 값 제외 basename( $_SERVER ) : 파일 이름 예를 들어 URL이 https://example.codingfactory.net/php/php.php?a=123&b=456라고 할 때, 결과는 다음과 ...

PHP / 함수 / implode() / 배열을 하나의 문자열로 만드는 함수

PHP / 함수 / implode() / 배열을 하나의 문자열로 만드는 함수

개요 implode()는 배열에 속한 문자열을 하나의 문자열로 만드는 함수입니다. PHP 4 이상에서 사용할 수 있습니다. 문법 implode ( glue, pieces ) glue : 배열의 원소 사이에 들어갈 문자열입니다. pieces : 배열입니다. $jbary = array( 'one', 'two', 'three' ); $jbstr = implode( '/', $jbary ); 원소 사이에 /을 넣어 하나의 문자열로 만듭니다. 즉 $jbstr은 one/two/three입니다. 예제 <!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <title>PHP</title> <style> body { font-family: ...

PHP / include(), include_once(), require(), require_once() / 외부 파일 포함하는 함수

PHP / include(), include_once(), require(), require_once() / 외부 파일 포함하는 함수

여러 파일에 공통적으로 사용하는 코드는 별도의 파일로 만든 후 각 파일에서 불러오는 것이 좋습니다. 코드의 양이 줄어들고, 수정이 용이하기 때문입니다. 외부 파일을 포함하는 함수는 네 가지가 있습니다. include 같은 파일 여러 번 포함 가능 / 포함할 파일이 없어도 다음 코드 실행 include_once 같은 파일 한 번만 포함 / 포함할 파일이 없어도 다음 코드 실행 require 같은 파일 ...

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 / PHPMailer / SMTP를 이용하여 메일 발송하게 하는 라이브러리

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

PHP의 mail() 함수를 이용하여 메일을 보낼 수 있다. 그런데 이렇게 발송한 메일은 스팸으로 인식되는 경우가 많다. 정상적으로 메일을 수신토록 하려면 SMTP를 이용하는 게 좋다. PHPMailer는 SMTP를 이용하여 메일 발송하게 하는 라이브러리다. PHPMailer를 이용하여 메일을 발송하는 방법을 정리한다. 다운로드 및 업로드 GitHub에서 소스를 다운로드한다.(https://github.com/PHPMailer/PHPMailer) 압축을 풀고 서버에 업로드한다. Composer를 이용하여 설치할 수도 있지만, 서버를 제어할 권한이 없는 ...

PHP / 함수 / strip_tags() / 문자열에서 HTML 태그와 PHP 태그 제거하는 함수

PHP / 함수 / strip_tags() / 문자열에서 HTML 태그와 PHP 태그 제거하는 함수

개요 strip_tags는 문자열에서 HTML 태그와 PHP 태그 제거하는 함수입니다. PHP 4 이상에서 사용할 수 있습니다. 문법 strip_tags ( string $str ) allowable_tags로 제거하지 않을 태그를 정할 수 있습니다. 예를 들어 strip_tags( '<p>Lorem <strong>Ipsum</strong></p>' ) 는 모든 태그를 제거합니다. strip_tags( '<p>Lorem <strong>Ipsum</strong></p>', '<strong>' ) 은 strong 태그를 제외한 나머지 태그를 제거합니다. 예제 <!doctype html> <html lang="ko"> <head> ...

PHP / 회원 관리 / 회원 가입 페이지, 회원 가입 완료 페이지

PHP / 회원 관리 / 회원 가입 페이지, 회원 가입 완료 페이지

환경 로컬 서버에 설치된 MariaDB를 사용합니다.(특별한 케이스가 아니라면 MySQL에서도 잘 작동합니다.) 데이터베이스 이름은 codingfactory.net_example, 사용자이름은 codingfactory, 비밀번호는 1234qwer입니다. 테이블 만들기 id, username, password 세 개의 열을 가진 member 테이블을 만듭니다. id는 자동 증가하는 고유값을 가지는 키입니다. MariaDB > create table member ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> username ...