[PHP]MAILER

김이홍·2024년 1월 16일

PHP

목록 보기
16/30
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
  1. PHPMailer 인클루드 시키기
    require는 지정된 파일을 찾을 수 없거나 로드할 수 없는 경우에 치명적인 오류(E_COMPILE_ERROR)를 발생시키고 스크립트 실행을 중단시킵니다.
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
  1. use PHPMailer\PHPMailer\PHPMailer;를 사용하면, 이후 코드에서 new PHPMailer()를 직접 호출할 수 있습니다. 만약 use 문을 사용하지 않으면, new \PHPMailer\PHPMailer\PHPMailer()와 같이 전체 경로를 명시해야 합니다. 정리하면, use는 해당 파일들에서 정의된 클래스를 편리하게 사용할 수 있도록 해줍니다.
$phpmailer = new PHPMailer(true);
  1. new PHPMailer(true)를 사용하여 PHPMailer 인스턴스를 생성합니다. true 파라미터는 예외(Exception) 처리를 활성화합니다.
// -> 연산자는 객체의 메서드나 속성에 접근하는 데 사용됩니다.
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.gmail.com'; // 메일을 보내는 smtp 서버 주소
$phpmailer->SMTPAuth = true; // smtp 서버에 연결할때 인증해라
$phpmailer->Username = 'your_email@gmail.com'; // smtp 서버 메일주소
$phpmailer->Password = 'your_password'; // smtp 서버 비밀번호
$phpmailer->SMTPSecure = 'tls'; // smtp 보안방식: tls
$phpmailer->Port = 587; // tls에 상응하는 포트번호
  1. 이메일을 보내기 위해서는 보통 SMTP 서버의 호스트 주소, 포트 번호, 보안 설정(SSL/TLS), 그리고 인증을 위한 사용자 이름과 비밀번호 등이 필요합니다. Gmail과 같이 2단계 인증을 사용하는 서비스의 경우, 일반 비밀번호 대신 앱 비밀번호를 생성하여 사용해야 합니다. ex) $phpmailer->Password = 'flhr vmds ryjn ixxp'; 또한, ssl은 465 포트를 씁니다.
$phpmailer->setFrom('your_email@gmail.com', 'Your Name');
  1. 발신자 추가: 발신자 이메일과 발신자 이름
$sql = "SELECT user_email FROM member WHERE AdminYN = 'Y' AND UseYN = 'Y'";
$result = $db->query($sql);

$emails = array();
if ($result->num_rows > 0) {
  while ($row = $result->fetch_assoc()) {
    $email = $row['user_email'];

    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emails[] = $email;  // 배열에 추가
      foreach ($emails as $email) {
        $phpmailer->addAddress($email);
      }
    } else {
      echo "유효하지 않은 이메일 주소: $email<br>";
    }
  }
} else {
  echo "주소록에 추가할 수신자가 없습니다.";
}
  1. 수신자 추가: 메일을 받을 사람들의 이메일 주소를 추가합니다. 여기서는 데이터베이스에서 이메일 주소를 가져와 addAddress 메서드를 사용하여 추가합니다.
    filter_var($email, FILTER_VALIDATE_EMAIL) => filter_var 함수는 다양한 유효성 검사 및 필터링을 수행할 수 있습니다.
    - FILTER_VALIDATE_EMAIL: 변수가 유효한 이메일 주소인지 검사합니다.
    - FILTER_SANITIZE_EMAIL: 이메일 주소에서 부적절한 문자를 제거합니다.
    - FILTER_SANITIZE_URL: URL에서 부적절한 문자를 제거합니다.
    - FILTER_SANITIZE_NUMBER_INT: 숫자가 아닌 모든 문자를 정수에서 제거합니다.
$phpmailer->isHTML(true); // 이메일 본문이 HTML 형식으로 작성. true로 설정하면 HTML 태그가 있는 본문을 사용할 수 있다.
$phpmailer->CharSet = 'UTF-8'; // 인코딩 방식
$phpmailer->Subject = 'Your Subject'; // 제목
$phpmailer->Body    = 'Your HTML content here'; // 본문
  1. 메일내용 설정
try {
	$response = ['status' => 'success', 'message' => 'Email Send Success'];
    $phpmailer->send(); // 메일 발송 코드
    echo "메일이 성공적으로 발송되었습니다.";
} catch (Exception $e) {
	$response = ['status' => 'error', 'message' => 'Email Send Fail : ' . $phpmailer->ErrorInfo];
    echo '예외 발생: ' . $e->getMessage();
}
echo json_encode($response);
  1. 메일 발송 및 에러발생시 처리

1) $mail->ErrorInfo는 PHPMailer가 실행되는 동안 발생한 최근 오류에 대한 상세한 정보를 포함합니다. 이 정보는 PHPMailer 내부에서 발생한 오류에 대한 구체적인 설명을 제공합니다. PHPMailer가 예외를 던지지 않은 상황에서도 사용할 수 있습니다.

2) $e->getMessage()는 catch 블록에서 잡힌 예외 객체에 대한 상세한 메시지를 반환합니다. 이 메시지는 예외가 발생한 원인에 대한 정보를 포함하며, PHPMailer에 한정되지 않고 PHP의 다른 부분에서 발생한 예외에도 사용됩니다.이는 try 블록 내에서 발생한 모든 종류의 예외에 대한 정보를 제공하고 $phpmailer = new PHPMailer(true);를 사용하면 PHPMailer의 오류가 예외로 처리되며, 이 예외는 catch 블록에서 $e->getMessage()를 통해 상세한 메시지로 접근할 수 있습니다. 이러한 접근 방식은 오류 관리와 디버깅에 매우 유용합니다.

3) echo json_encode($response);를 통해서 성공과 실패시의 상황을 html 에서 joson 형식으로 보고 디버깅 하면 유용합니다.

$db->close();
  1. 데이터베이스 연결 종료

1) 자원 해제: 데이터베이스 연결은 시스템 자원을 사용합니다. 연결을 닫음으로써 이러한 자원을 해제하고, 시스템의 효율성과 성능을 유지할 수 있습니다.

2) 보안: 열려 있는 데이터베이스 연결은 보안에 취약점이 될 수 있습니다. 연결을 닫으면 불필요한 접근으로부터 보호할 수 있습니다.

3) 안정성: 데이터베이스 연결을 적절히 관리하지 않으면, 시간이 지남에 따라 연결 오류나 메모리 누수와 같은 문제가 발생할 수 있습니다. 연결을 닫음으로써 이러한 문제를 예방할 수 있습니다.

4) 트랜잭션 관리: 특히 트랜잭션을 사용하는 경우, 연결을 닫는 것은 트랜잭션이 올바르게 종료되고, 변경 사항이 데이터베이스에 반영되도록 보장합니다.

5) 연결 한계: 대부분의 데이터베이스 시스템은 동시에 열 수 있는 연결의 수에 한계가 있습니다. 불필요한 연결을 닫음으로써 시스템의 한계치를 넘지 않도록 할 수 있습니다.

요약: $db->close();는 데이터베이스 작업이 끝난 후 필요한 자원을 정리하고, 시스템의 안정성과 성능을 유지하기 위해 필수적인 작업입니다.

0개의 댓글