이 글은 주로 Linux 서버에서 PHPMailer가 이메일을 보내지 못하는 문제를 해결하는 방법을 소개합니다. 이 글은 필요한 모든 사람들이 읽을 수 있는 확실한 참고 가치가 있다고 생각합니다. 함께 보세요.
요구사항
서버를 변경한 후 이메일 발송 기능이 작동하지 않는 것을 발견했습니다! 원래 서버는 괜찮았는데 뭔가 문제가 있는 것 같아 확인해 보기로 했습니다. 저는 PHPMailer와 SMTP를 사용하여 이메일을 보냅니다.
문제 해결 과정
이 방법에서는 우선 PHP에서 소켓 확장을 활성화해야 합니다. phpinfo 페이지를 확인해보니 활성화되어 있습니다. :
확인 후 openssl도 켜졌으니(qq 메일박스를 테스트용으로 가져갔기 때문에) 문제 없습니다:
그런 다음 다시 확인하십시오. 비활성화되지 않음, 문제 없음:
그러면 구성에 문제가 없습니다. 포트가 사용되고 있습니까?실행해 보세요:
첫 번째는 다음과 같습니다.
netstat -tnlp
포트 25는 master라는 사람이 차지하고 있습니다. 뭔가가 점유 상태입니다.
를 실행하여 결과를 확인하세요. 1818은 현재 프로그램의 프로세스 번호 PID입니다.ps -f -p 1818
환경 설정 시 실수로 Postfix가 실행 중일 수 있습니다.
포픽스가 무엇인가요?
Postfix는 Linux 환경에서 실행되는 무료 메일 서버 또는 MTA(Mail Transfer Agent)로 Sendmail, Qmail, exim 및 Zmailer가 있습니다. 그래서 Postfix는 메일 서버입니다. 그렇다면 포트 25를 통해 외부 메일 서버를 요청해야 하며 로컬 메일 서버는 포트 25에서 실행 중입니다. 이는 아마도 불가능할 것입니다.이 문제를 해결해 보세요. 문제
외부 서버를 사용하는 대신 메일 서버를 사용하여 이메일을 보내 보겠습니다. (예를 들어 이전에는 Alibaba Cloud Enterprise Mail을 사용했습니다.) 동일한 레벨에 짧은 테스트 코드를 넣었습니다. PHPMailer 디렉터리:
<?php header("content-type:text/html;charset=utf-8"); require 'PHPMailer/class.phpmailer.php'; try { $mail = new PHPMailer(true); $mail->IsSMTP(); $mail->CharSet='UTF-8'; $mail->SMTPAuth = true; $mail->Port = 25; $mail->Host = '127.0.0.1';//邮箱smtp地址 $mail->Username = 'gzp@gzpblog.com';//你的邮箱账号 $mail->Password = '扒拉扒拉。。。';//你的邮箱密码 $mail->From = 'gzp@gzpblog.com';//你的邮箱账号 $mail->FromName = '锅子'; $to = "扒拉扒拉@qq.com"; $mail->AddAddress($to); $mail->Subject = "test"; $mail->Body = 'hello!'; $mail->WordWrap = 80; $mail->IsHTML(true); $mail->Send(); echo "success!"; } catch (phpmailerException $e) { echo "邮件发送失败:".$e->errorMessage(); }
$mail->Host = ‘smtp.mxhichina.com'; //阿里云的邮箱smtp地址
SMTP에 연결할 수 없습니다. 그런 다음 포트 25에서 postfix 서버를 종료하고 kill 1818(현재 postfix의 PID)을 실행한 다음 다시 실행하지만 여전히 동일한 오류가 발생하고 연결할 수 없습니다. 이상하네요. 25번 포트에는 프로그램이 실행되지 않아서 여전히 작동하지 않습니다.
가능한 이유
phpMailer가 smtp 서버의 DNS 확인을 수행했을 때 IP v6 주소를 얻은 후 ipv6 때문일 수 있는 것으로 나타났습니다. IP v6과 비교합니다. 확인된 주소를 사용하여 연결하므로 연결이 실패합니다.해보자:
ip -6 addr show
아무것도 아닙니다. 문제는 아닙니다.
이유는 무엇인가요?
문제 해결25번 포트가 안 되니까 다른 포트를 써보고 465번 포트를 써보면 어떨까 하는 생각이 들었습니다. 포트 465(SMTPS): 포트 465는 SMTPS(SMTP-over-SSL) 프로토콜 서비스를 위해 열려 있습니다. 이는 SSL 보안 프로토콜을 기반으로 하는 SMTP 프로토콜의 변형입니다. 프로토콜의 비대칭 암호화의 보안과 신뢰성은 이메일 유출을 방지할 수 있습니다. SMTPS는 SMTP 프로토콜과 마찬가지로 이메일을 보내는 데에도 사용되지만 해커에 의해 이메일이 가로채어 유출되는 것을 방지하는 데 더 안전하고 이메일 보낸 사람의 부인 방지 기능도 구현할 수 있습니다. 보낸 사람이 보낸 이메일을 보낸 후 삭제하고 해당 이메일이 전송되었다는 사실을 거부하는 것을 방지합니다.
포트 465가 더 좋은 것 같아서 직접 시도해 보기 시작했습니다.
sbin/iptables -I OUTPUT -p tcp –dport 465 -j ACCEPT
打通465端口
/etc/rc.d/init.d/iptables save
保存
service iptables restart
重启
/etc/init.d/iptables status
查看需要打开的端口是否生效?
似乎可行,现在尝试一下,用SMTP的465SSL连接方式来发送邮件,稍微改了一下测试代码:
<?php header("content-type:text/html;charset=utf-8"); require 'PHPMailer/class.phpmailer.php'; try { $mail = new PHPMailer(true); $mail->IsSMTP(); $mail->CharSet='UTF-8'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'ssl'; $mail->Port = 465; $mail->Host = 'smtp.mxhichina.com';//邮箱smtp地址 $mail->Username = 'gzp@gzpblog.com';//你的邮箱账号 $mail->Password = '扒拉扒拉。。。';//你的邮箱密码 $mail->From = 'gzp@gzpblog.com';//你的邮箱账号 $mail->FromName = '锅子'; $to = "扒拉扒拉@qq.com"; $mail->AddAddress($to); $mail->Subject = "test"; $mail->Body = 'hello!'; $mail->WordWrap = 80; //$mail->AddAttachment("f:/test.png"); //可以添加附件 $mail->IsHTML(true); $mail->Send(); echo "success!"; } catch (phpmailerException $e) { echo "邮件发送失败:".$e->errorMessage(); //测试的时候可以去掉此行的注释 }
执行,成功!右下角弹出了QQ邮件的提醒。
总结
PHPMailer通过465端口进行更安全的SMTPS协议发送邮件
可以修改:
$mail->Port = 465;
为:
$mail->SMTPSecure = 'ssl'; $mail->Port = 465;
即可。
以上就是Linux服务器下PHPMailer发送邮件失败的问题解决的技巧的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!