Maison >développement back-end >tutoriel php >Introduction détaillée à la solution au problème de PHPMailer qui ne parvient pas à envoyer des e-mails sous le serveur Linux

Introduction détaillée à la solution au problème de PHPMailer qui ne parvient pas à envoyer des e-mails sous le serveur Linux

黄舟
黄舟original
2017-03-08 09:37:013324parcourir

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 &#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(); 
}

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&#39;; //阿里云的邮箱smtp地址

Essayez-le, mais cela ne fonctionne toujours pas :

Impossible de se connecter à SMTP. Ensuite, nous tuons le serveur postfix sur le port 25, exécutons kill 1818 (le PID du postfix actuel) et l'exécutons à nouveau, mais toujours la même erreur et nous ne pouvons pas nous connecter. C'est étrange. Aucun programme n'est exécuté sur le port 25, donc cela ne fonctionne toujours pas.

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

Rien, ce n'est pas le problème.

Quelle est la raison ?

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é.


Le port 465 semble être meilleur, alors j'ai commencé à l'essayer directement Voici la commande :


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)!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn