PHP 이메일 발송 오류 해결하기

프리터코더·2025년 5월 28일

php 문제 해결

목록 보기
39/79

PHP에서 이메일 발송 시 발생하는 다양한 오류들과 해결 방법을 알아보겠습니다. 안정적인 이메일 전송을 위한 실용적인 해결책들을 제시합니다.

1. mail() 함수 대신 PHPMailer 사용

문제: 내장 mail() 함수의 제한적 기능과 낮은 신뢰성

해결책: PHPMailer 라이브러리 사용

composer require phpmailer/phpmailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);

try {
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'your-email@gmail.com';
    $mail->Password = 'your-app-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;

    $mail->setFrom('sender@example.com', '발송자명');
    $mail->addAddress('recipient@example.com');
    
    $mail->Subject = '제목';
    $mail->Body = '메일 내용';
    
    $mail->send();
    echo '메일 발송 성공';
} catch (Exception $e) {
    echo "메일 발송 실패: {$mail->ErrorInfo}";
}

2. SMTP 인증 오류 해결

문제: SMTP 서버 연결 및 인증 실패

해결책: 올바른 SMTP 설정과 앱 비밀번호 사용

$mail = new PHPMailer(true);

// Gmail 설정 예시
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-email@gmail.com';
$mail->Password = 'your-16-digit-app-password'; // 2단계 인증 필요
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

// 디버그 모드 활성화 (개발 시에만)
$mail->SMTPDebug = SMTP::DEBUG_SERVER;

3. 이메일 유효성 검사 강화

문제: 잘못된 이메일 주소로 인한 발송 실패

해결책: 다단계 이메일 검증

function validateEmail($email) {
    // 1. 기본 형식 검사
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }
    
    // 2. 도메인 존재 확인
    $domain = substr(strrchr($email, "@"), 1);
    if (!checkdnsrr($domain, "MX")) {
        return false;
    }
    
    return true;
}

// 사용 예시
$email = $_POST['email'];
if (validateEmail($email)) {
    // 이메일 발송 처리
    sendEmail($email);
} else {
    echo "유효하지 않은 이메일 주소입니다.";
}

4. 발송 실패 시 재시도 로직

문제: 일시적 네트워크 오류로 인한 발송 실패

해결책: 재시도 메커니즘 구현

function sendEmailWithRetry($to, $subject, $body, $maxRetries = 3) {
    $mail = new PHPMailer(true);
    
    // SMTP 설정...
    setupSMTP($mail);
    
    for ($i = 0; $i < $maxRetries; $i++) {
        try {
            $mail->clearAddresses();
            $mail->addAddress($to);
            $mail->Subject = $subject;
            $mail->Body = $body;
            
            $mail->send();
            return true; // 성공
            
        } catch (Exception $e) {
            if ($i == $maxRetries - 1) {
                // 최종 실패 로깅
                error_log("이메일 발송 최종 실패: " . $e->getMessage());
                return false;
            }
            
            // 재시도 전 대기
            sleep(2);
        }
    }
    
    return false;
}

5. 대량 발송 시 속도 제한 처리

문제: 대량 이메일 발송 시 SMTP 서버 제한 걸림

해결책: 배치 처리와 지연 시간 추가

function sendBulkEmails($recipients, $subject, $body) {
    $mail = new PHPMailer(true);
    setupSMTP($mail);
    
    $batchSize = 50; // 배치당 50개
    $delay = 1; // 1초 지연
    
    $batches = array_chunk($recipients, $batchSize);
    
    foreach ($batches as $batch) {
        foreach ($batch as $recipient) {
            try {
                $mail->clearAddresses();
                $mail->addAddress($recipient);
                $mail->Subject = $subject;
                $mail->Body = $body;
                
                $mail->send();
                echo "발송 완료: {$recipient}\n";
                
            } catch (Exception $e) {
                error_log("발송 실패 {$recipient}: " . $e->getMessage());
            }
        }
        
        // 배치 간 지연
        sleep($delay);
    }
}
profile
일용직 개발자. freetercoder@gmail.com

0개의 댓글