이 글은 주로 Linux 서버에서 PHPMailer가 이메일을 보내지 못하는 문제를 해결하는 방법을 소개합니다. 이 글은 필요한 모든 사람들이 읽을 수 있는 확실한 참고 가치가 있다고 생각합니다. 함께 보세요.
요구사항
서버를 변경한 후 이메일 발송 기능이 작동하지 않는 것을 발견했습니다! 원래 서버는 괜찮았는데 뭔가 문제가 있는 것 같아 확인해 보기로 했습니다. 저는 PHPMailer와 SMTP를 사용하여 이메일을 보냅니다.
문제 해결 과정
이 방법에서는 우선 PHP에서 소켓 확장을 활성화해야 합니다. phpinfo 페이지를 확인해보니 활성화되어 있습니다. :
확인 후 openssl도 켜졌으니(qq 메일박스를 테스트용으로 가져갔기 때문에) 문제 없습니다:
그런 다음 다시 확인하십시오. 비활성화되지 않음, 문제 없음:
실행해 보세요:
첫 번째는 다음과 같습니다.
netstat -tnlp
포트 25는 master라는 사람이 차지하고 있습니다. 뭔가가 점유되어 있는지 살펴보겠습니다.
을 실행하여 결과를 확인하세요. 1818은 현재 프로그램의 프로세스 번호 PID입니다.ps -f -p 1818
환경 설정 시 실수로 Postfix가 실행 중일 수 있습니다.
포픽스가 무엇인가요?
이 문제를 해결해 보세요. 문제
외부 서버를 사용하는 대신 메일 서버를 사용하여 이메일을 보내 보겠습니다. (예를 들어 이전에는 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번 포트에는 프로그램이 실행되지 않아서 여전히 작동하지 않습니다.
가능한 이유
해보자:
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中文网(www.php.cn)!