Cet article vous présente principalement comment résoudre le problème de l'échec de PHPMailer à envoyer des e-mails sous le serveur Linux. L'article le présente en détail à travers un exemple de code. Je pense qu'il a une certaine valeur de référence pour tous les amis qui en ont besoin. ensemble. Jetez un oeil.
Exigences
Après avoir changé de serveur, j'ai constaté que ma fonction d'envoi d'e-mail échouait ! Le serveur d'origine fonctionnait bien, mais il devait y avoir un problème, j'ai donc décidé de le vérifier. J'utilise PHPMailer et SMTP pour envoyer des emails.
Processus de dépannage
Dans cette méthode, tout d'abord, PHP doit activer l'extension de socket. J'ai vérifié la page phpinfo et elle est activée. :
Après vérification, openssl est également activé (car j'ai pris la boite mail qq pour tester), donc il n'y a pas de problème :
Puis vérifiez à nouveau Vérifiez allow_url_fopen, allumez-le, pas de problème :
La fonction est-elle désactivée ? Non désactivé, pas de problème :
Alors il n'y a pas de problème de configuration. Je me demandais, le port est-il occupé ?
Exécutez-le : netstat -tnlp
Le premier est celui-ci :
Le port 25 est occupé par une personne appelée master Quelque chose se passe occupé, bons les gars, voyons ce que c'est. Exécutez ps -f -p 1818
pour voir les résultats. 1818 est le numéro de processus PID du programme actuel. Vous pouvez voir :
. Postfix est en cours d'exécution. Il a peut-être été installé accidentellement lors de la configuration de l'environnement.
Qu'est-ce que postfix ?
Postfix est un serveur de messagerie gratuit fonctionnant dans un environnement Linux, ou MTA (Mail Transfer Agent). D'autres incluent Sendmail, Qmail, exim et Zmailer. Postfix est donc un serveur de messagerie. Ensuite, cette chose doit être en conflit. Nous devons demander un serveur de messagerie externe via le port 25, et un serveur de messagerie local fonctionne sur le port 25. Ce n'est probablement pas possible
Essayez de résoudre le problème. problème
Essayons d'utiliser notre serveur de messagerie pour envoyer des e-mails au lieu d'utiliser un serveur externe (par exemple, nous avons déjà utilisé Alibaba Cloud Enterprise Mail. Nous avons mis un court morceau de code de test au même niveau). du répertoire 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(); }
Envoyez un e-mail via le serveur local sur le port 25, exécutez cette page et constatez que cela ne fonctionne pas. ne peut pas être vérifié, indiquant qu'il y a encore quelques configurations à faire, pour le moment. Cela ne fonctionne pas. Ne creusons pas dans le serveur local et essayons de le modifier :
<. 🎜>
$mail->Host = ‘smtp.mxhichina.com'; //阿里云的邮箱smtp地址
Raisons possibles
Il a été constaté que cela pouvait être dû à ipv6. Lorsque phpMailer a effectué la résolution DNS du serveur smtp, il a obtenu l'adresse IP v6, puis. comparé à l'IP v6. L'adresse résolue est utilisée pour se connecter, provoquant l'échec de la connexion. Laissez-moi essayer :ip -6 addr show
Résoudre le problème
Étant donné que le port 25 n'est pas disponible, j'ai pensé que si je pouvais essayer d'autres ports et essayer le port 465. Port 465 (SMTPS) : Le port 465 est ouvert pour le service du protocole SMTPS (SMTP-over-SSL). Il s'agit d'une variante du protocole SMTP basé sur le protocole de sécurité SSL. la sécurité et la fiabilité du cryptage asymétrique du protocole peuvent empêcher les fuites de courrier électronique. SMTPS, comme le protocole SMTP, est également utilisé pour envoyer des e-mails, mais il est plus sécurisé pour empêcher les e-mails d'être interceptés et divulgués par des pirates, et il peut également mettre en œuvre la fonction anti-répudiation de l'expéditeur de l'e-mail. Empêche l'expéditeur de supprimer l'e-mail envoyé après l'avoir envoyé et de refuser d'admettre qu'un tel e-mail a été envoyé.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)!