공부/Gnuboard

[그누보드] Centos 쥐메일 발송 안될때.

밥성수 2025. 5. 16. 03:24

1. config.php 파일

define('G5_PHPMAILER_PATH', G5_LIB_PATH.'/PHPMailer');

define('G5_SMTP', 'smtp.gmail.com');
define('G5_SMTP_PORT', '587');
define('G5_SMTP_SECURE', 'TLS');
define('G5_SMTP_USER', '2단계 설정한 구글계정');
define('G5_SMTP_PW', '2단계 앱비밀번호 입력');

 

2. lib 폴더 하위에 PHPMailer 설치 

https://github.com/PHPMailer/PHPMailer/releases 접속하여 압축파일 다운

 

3. lib/mailer.lib.php 수정

<?php
if (!defined('_GNUBOARD_')) exit;

require(/home/admin/plugin/PHPMailer/src/Exception.php): failed to open stream: No such file or directory in /home/admin/lib/mailer.lib.php on line 5, referer: https://kmac360.com/adm/sendmail_test.php


// PHPMailer 클래스 파일 포함
require G5_PHPMAILER_PATH.'/src/Exception.php';
require G5_PHPMAILER_PATH.'/src/PHPMailer.php';
require G5_PHPMAILER_PATH.'/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

// 메일 보내기 (파일 여러개 첨부 가능)
// type : text=0, html=1, text+html=2
function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc="", $bcc="")
{
    global $config;
    global $g5;
    
    // 메일발송 사용을 하지 않는다면
    if (!$config['cf_email_use']) return;
    
    if ($type != 1)
        $content = nl2br($content);
    
    $result = run_replace('mailer', $fname, $fmail, $to, $subject, $content, $type, $file, $cc, $bcc);
    
    if (is_array($result) && isset($result['return'])) {
        return $result['return'];
    }
    
    $mail_send_result = false;
    $mail_error_msg = '';
    
    try {
        // PHPMailer 객체 생성
        $mail = new PHPMailer(true);
        
        // SMTP 설정이 있으면 SMTP로 메일 발송
        if (defined('G5_SMTP') && G5_SMTP) {
            // 디버깅 설정 (서버에서 문제 발생시 활성화)
            $mail->SMTPDebug = 2;  // 0=비활성화, 1=클라이언트, 2=클라이언트/서버
            $mail->Debugoutput = 'html';
            
            // SMTP 사용 설정
            $mail->isSMTP();
            $mail->Host = G5_SMTP;
            
            // SMTP 포트 설정
            if (defined('G5_SMTP_PORT') && G5_SMTP_PORT)
                $mail->Port = G5_SMTP_PORT;
            
            // SMTP 인증 설정
            $mail->SMTPAuth = true;
            
            // SMTP 보안 연결 설정 (ssl 또는 tls)
            if (defined('G5_SMTP_SECURE') && G5_SMTP_SECURE)
                $mail->SMTPSecure = G5_SMTP_SECURE;
            
            // SMTP 계정 정보 설정
            if (defined('G5_SMTP_USER') && defined('G5_SMTP_PW')) {
                $mail->Username = G5_SMTP_USER;
                $mail->Password = G5_SMTP_PW;
            }
            
            // Gmail 특별 설정 (필요한 경우)
            $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );
        }
        
        // 기본 메일 설정
        $mail->CharSet = 'UTF-8';
        $mail->setFrom($fmail, $fname);
        $mail->addAddress($to);
        $mail->Subject = $subject;
        
        // 메일 내용 설정
        if ($type == 1) {
            $mail->isHTML(true);
            $mail->Body = $content;
            $mail->AltBody = strip_tags($content);
        } else {
            $mail->isHTML(true);  // HTML 형식으로 발송
            $mail->Body = $content;
            $mail->AltBody = strip_tags($content);
        }
        
        // 참조, 숨은참조 추가
        if ($cc)
            $mail->addCC($cc);
        if ($bcc)
            $mail->addBCC($bcc);
        
        // 첨부 파일 추가
        if ($file != "") {
            foreach ($file as $f) {
                $mail->addAttachment($f['path'], $f['name']);
            }
        }
        
        // 추가 옵션 적용
        $mail = run_replace('mail_options', $mail, $fname, $fmail, $to, $subject, $content, $type, $file, $cc, $bcc);
        
        // 메일 발송
        $mail_send_result = $mail->send();
        
        // 오류 확인
        if (!$mail_send_result) {
            $mail_error_msg = $mail->ErrorInfo;
            error_log("Mailer Error: " . $mail_error_msg);
        }
        
    } catch (Exception $e) {
        $mail_error_msg = $e->getMessage();
        error_log("Mailer Exception: " . $mail_error_msg);
    }
    
    // 이벤트 실행
    run_event('mail_send_result', $mail_send_result, $mail, $to, $cc, $bcc);
    
    // 관리자인 경우 오류 메시지 표시
    if (!$mail_send_result && G5_IS_ADMIN) {
        echo '<div style="color:red;margin-bottom:15px;">메일 발송 실패: ' . $mail_error_msg . '</div>';
    }
    
    return $mail_send_result;
}

// 파일을 첨부함
function attach_file($filename, $tmp_name)
{
    // 서버에 업로드 되는 파일은 확장자를 주지 않는다. (보안 취약점)
    $dest_file = G5_DATA_PATH.'/tmp/'.str_replace('/', '_', $tmp_name);
    move_uploaded_file($tmp_name, $dest_file);
    $tmpfile = array("name" => $filename, "path" => $dest_file);
    return $tmpfile;
}
?>

 

끝.