Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Lösung des Problems, dass PHPMailer unter einem Linux-Server keine E-Mails senden kann

Detaillierte Einführung in die Lösung des Problems, dass PHPMailer unter einem Linux-Server keine E-Mails senden kann

黄舟
黄舟Original
2017-03-08 09:37:013185Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich vor, wie Sie das Problem lösen können, dass PHPMailer keine E-Mails unter einem Linux-Server senden kann. Ich glaube, dass der Artikel einen gewissen Referenzwert hat, den jeder lesen kann Schauen Sie es sich mal an.

Anforderungen

Nach dem Wechsel des Servers stellte ich fest, dass meine E-Mail-Versandfunktion fehlgeschlagen ist! Der ursprüngliche Server war in Ordnung, aber da muss etwas nicht stimmten, also habe ich beschlossen, ihn mir anzusehen. Ich verwende PHPMailer und SMTP zum Versenden von E-Mails.

Fehlerbehebungsprozess

Bei dieser Methode muss PHP zunächst die Socket-Erweiterung aktivieren, und sie ist aktiviert :

Nach der Überprüfung ist auch OpenSSL aktiviert (da ich das QQ-Postfach zum Testen genommen habe), sodass kein Problem vorliegt:

Dann noch einmal prüfen. Allow_url_fopen prüfen, einschalten, kein Problem:

Ist die Funktion deaktiviert? Nicht deaktiviert, kein Problem:


Dann gibt es kein Problem mit der Konfiguration. Ich habe mich gefragt, ist der Port belegt?

Führen Sie es aus: netstat -tnlp

Das erste ist dieses:

Port 25 ist von einer Person namens Master besetzt. Etwas ist Besetzt, Leute, mal sehen, was es ist. 1818 ist die Prozessnummer PID des aktuellen Programms Postfix wird ausgeführt. Möglicherweise wurde es beim Einrichten der Umgebung versehentlich installiert. ps -f -p 1818

Was ist Postfix?

Postfix ist ein kostenloser Mailserver, der in einer Linux-Umgebung oder MTA (Mail Transfer Agent) läuft. Andere umfassen Sendmail, Qmail, exim und Zmailer. Postfix ist also ein Mailserver. Dann muss dieses Problem über Port 25 einen externen Mailserver anfordern, und auf Port 25 läuft ein lokaler Mailserver. Dies ist wahrscheinlich nicht möglich.

Versuchen Sie, das Problem zu lösen Problem

Versuchen wir, unseren Mailserver zum Senden von E-Mails zu verwenden, anstatt einen externen Server zu verwenden (wir haben beispielsweise zuvor Alibaba Cloud Enterprise Mail verwendet. Wir haben einen kurzen Testcode in die gleiche Ebene eingefügt). des PHPMailer-Verzeichnisses:

E-Mail über den lokalen Server an Port 25 senden, diese Seite ausführen und feststellen, dass sie nicht funktioniert. Der Fehler kann nicht überprüft werden, was darauf hinweist, dass noch einige Konfigurationen vorgenommen werden müssen. Lassen Sie uns nicht in den lokalen Server eintauchen und ihn zurückschicken:

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

Versuchen Sie es, aber es funktioniert immer noch nicht:

$mail->Host = ‘smtp.mxhichina.com&#39;; //阿里云的邮箱smtp地址

Verbindung zu SMTP konnte nicht hergestellt werden. Dann beenden wir den Postfix-Server auf Port 25, führen kill 1818 (die PID des aktuellen Postfixes) aus und führen ihn erneut aus. Es wird immer noch der gleiche Fehler angezeigt und es kann keine Verbindung hergestellt werden. Das ist seltsam. Da auf Port 25 kein Programm läuft, funktioniert es immer noch nicht.

Mögliche Gründe

Es wurde festgestellt, dass es an IPv6 liegen könnte. Als phpMailer die DNS-Auflösung des SMTP-Servers durchführte, erhielt es die IP v6-Adresse und dann verglichen mit der IP v6 Die aufgelöste Adresse wird zum Herstellen einer Verbindung verwendet, was dazu führt, dass die Verbindung fehlschlägt.

Lass es mich versuchen:

Nichts, das ist nicht das Problem. ip -6 addr show

Was ist der Grund?

Das Problem lösen

Da Port 25 nicht verfügbar ist, dachte ich, ich könnte es mit anderen Ports und Port 465 versuchen. Port 465 (SMTPS): Port 465 ist für den SMTPS-Protokolldienst (SMTP-over-SSL) geöffnet. Dies ist eine Variante des SMTP-Protokolls, das auf dem SSL-Sicherheitsprotokoll basiert Die Sicherheit und Zuverlässigkeit der asymmetrischen Verschlüsselung des Protokolls kann E-Mail-Lecks verhindern. SMTPS wird wie das SMTP-Protokoll auch zum Senden von E-Mails verwendet, ist jedoch sicherer, um zu verhindern, dass E-Mails von Hackern abgefangen und durchgesickert werden, und kann auch die Anti-Repudiation-Funktion des E-Mail-Absenders implementieren. Verhindert, dass der Absender die gesendete E-Mail nach dem Senden löscht und den Versand einer solchen E-Mail nicht anerkennt.

Port 465 scheint besser zu sein, also habe ich direkt angefangen, es auszuprobieren. Der folgende Befehl lautet:

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


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn