>  기사  >  백엔드 개발  >  Linux 서버에서 PHPMailer가 이메일을 보내지 못하는 문제 해결에 대한 자세한 소개

Linux 서버에서 PHPMailer가 이메일을 보내지 못하는 문제 해결에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-08 09:37:013187검색

이 글은 주로 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 &#39;PHPMailer/class.phpmailer.php&#39;; try { $mail = new PHPMailer(true); $mail->IsSMTP();
 $mail->CharSet=&#39;UTF-8&#39;;
 $mail->SMTPAuth = true;
 $mail->Port = 25;
 $mail->Host = &#39;127.0.0.1&#39;;//邮箱smtp地址
 $mail->Username = &#39;gzp@gzpblog.com&#39;;//你的邮箱账号
 $mail->Password = &#39;扒拉扒拉。。。&#39;;//你的邮箱密码
 $mail->From = &#39;gzp@gzpblog.com&#39;;//你的邮箱账号
 $mail->FromName = &#39;锅子&#39;;
 $to = "扒拉扒拉@qq.com";
 $mail->AddAddress($to);
 $mail->Subject = "test";
 $mail->Body = &#39;hello!&#39;;
 $mail->WordWrap = 80;
 $mail->IsHTML(true);
 $mail->Send();
 echo "success!";
 } catch (phpmailerException $e) {
 echo "邮件发送失败:".$e->errorMessage(); 
}

포트 25의 로컬 서버를 통해 이메일을 보내고 이 페이지를 실행하여 작동하지 않는 것을 확인하세요. 확인 결과 아직 수행해야 할 일부 구성이 있으며 당분간 작동하지 않음을 나타냅니다. 로컬 서버를 더 자세히 살펴보는 대신 다시 변경해 보겠습니다.

$mail->Host = ‘smtp.mxhichina.com&#39;; //阿里云的邮箱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 &#39;PHPMailer/class.phpmailer.php&#39;; 
try { $mail = new PHPMailer(true); $mail->IsSMTP();
$mail->CharSet=&#39;UTF-8&#39;;
$mail->SMTPAuth = true;
$mail->SMTPSecure = &#39;ssl&#39;;
$mail->Port = 465;
$mail->Host = &#39;smtp.mxhichina.com&#39;;//邮箱smtp地址
$mail->Username = &#39;gzp@gzpblog.com&#39;;//你的邮箱账号
$mail->Password = &#39;扒拉扒拉。。。&#39;;//你的邮箱密码
$mail->From = &#39;gzp@gzpblog.com&#39;;//你的邮箱账号
$mail->FromName = &#39;锅子&#39;;
$to = "扒拉扒拉@qq.com";
$mail->AddAddress($to);
$mail->Subject = "test";
$mail->Body = &#39;hello!&#39;;
$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)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.