PHP에서 이메일 발송 시 발생하는 다양한 오류들과 해결 방법을 알아보겠습니다. 안정적인 이메일 전송을 위한 실용적인 해결책들을 제시합니다.
문제: 내장 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}";
}
문제: 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;
문제: 잘못된 이메일 주소로 인한 발송 실패
해결책: 다단계 이메일 검증
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 "유효하지 않은 이메일 주소입니다.";
}
문제: 일시적 네트워크 오류로 인한 발송 실패
해결책: 재시도 메커니즘 구현
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;
}
문제: 대량 이메일 발송 시 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);
}
}