使用PHPMailer和Gmail账户发送邮件

5
我正在尝试使用PHPMailer库从我的网站发送电子邮件。到目前为止我所做的仅仅是:
  1. I downloaded PHPMailer 5.2-stable from this link.

  2. I uploaded the following files on my hosting: class.phpmailer.php, class.smtp.php and PHPMailerAutoload.php

  3. Then I created a file name contact.php and wrote the following code in it:

    require 'phpmailer/PHPMailerAutoload.php';
    $mail = new PHPMailer();
    $mail->SMTPDebug = 1;  
    
    $mail->SMTPAuth = true; 
    $mail->IsSMTP();
    $mail->Host = "smtp.gmail.com";
    $mail->Username = "*****************"; //My Email Address
    $mail->Password = "*****************"; //My Email's Address
    $mail->SMTPSecure = "tls";   
    $mail->Port = 578; 
    
    $mail->AddAddress('*****************');
    $mail->From = "*****************";
    $mail->FromName = "Website Contact Form - " . "Website Name";
    $mail->Subject = "New Message from Contact Form";
    
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';    
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    $mail ->isHTML(true);
    $message = NULL;
    if(!$mail->Send()) {
       $message = "Mailer Error: " . $mail->ErrorInfo;
    }else{
       $message = "Message sent!";
    }
    

但是在运行这个文件后,我得到了以下错误:

2021-06-25 11:44:54 SMTP ERROR:无法连接服务器:网络不可达(101)SMTP connect() 失败。

我尝试了多个电子邮件地址,包括由我的托管服务直接创建的电子邮件地址、Gmail 帐户和 Google Workspace 邮件(以前称为 G Suit)。所有的都失败了,产生了上述错误。

最后,值得一提的是,我的托管服务不支持 PHP 的 mail() 函数,这就是我需要使用 SMTP 的原因。

更新:与主机联系并尝试了很多次后,虽然我确定输入了正确的用户名和密码,但我得到了以下错误:

2021-06-27 12:45:19 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP u21sm391388lfu.60 - gsmtp
2021-06-27 12:45:19 CLIENT -> SERVER: EHLO empiya.com.tr
2021-06-27 12:45:19 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [77.245.159.9]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2021-06-27 12:45:19 CLIENT -> SERVER: STARTTLS
2021-06-27 12:45:19 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2021-06-27 12:45:19 CLIENT -> SERVER: EHLO empiya.com.tr
2021-06-27 12:45:19 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [77.245.159.9]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2021-06-27 12:45:19 CLIENT -> SERVER: AUTH LOGIN
2021-06-27 12:45:19 SERVER -> CLIENT: 334 VXNlcm5hbWU6
2021-06-27 12:45:19 CLIENT -> SERVER: [credentials hidden]
2021-06-27 12:45:19 SERVER -> CLIENT: 334 UGFzc3dvcmQ6
2021-06-27 12:45:19 CLIENT -> SERVER: [credentials hidden]
2021-06-27 12:45:20 SERVER -> CLIENT: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbu534-5.7.14 vrVLkxbm7_GwFssilR38zKpR_BuczuSM3RIslh77zk6d-DzAo1btUW7FKO8f69tyzO7Fn534-5.7.14 6jydZV9BH6qfEQfpcOfh1z-_V5nn7beFbI0Ekuto0gyBede5j-6dniX9mG6jLWRp>534-5.7.14 Please log in via your web browser and then try again.534-5.7.14 Learn more at534 5.7.14 https://support.google.com/mail/answer/78754 u21sm391388lfu.60 - gsmtp
2021-06-27 12:45:20 SMTP ERROR: Password command failed: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbu534-5.7.14 vrVLkxbm7_GwFssilR38zKpR_BuczuSM3RIslh77zk6d-DzAo1btUW7FKO8f69tyzO7Fn534-5.7.14 6jydZV9BH6qfEQfpcOfh1z-_V5nn7beFbI0Ekuto0gyBede5j-6dniX9mG6jLWRp>534-5.7.14 Please log in via your web browser and then try again.534-5.7.14 Learn more at534 5.7.14 https://support.google.com/mail/answer/78754 u21sm391388lfu.60 - gsmtp
SMTP Error: Could not authenticate.
2021-06-27 12:45:20 CLIENT -> SERVER: QUIT
2021-06-27 12:45:20 SERVER -> CLIENT: 221 2.0.0 closing connection u21sm391388lfu.60 - gsmtp
SMTP Error: Could not authenticate.
Message could not be sent. Mailer Error: SMTP Error: Could not authenticate.

@ARVINDIT 我也试过了,结果出现了同样的错误。 - Naser.Sadeghi
尝试删除 $mail->IsSMTP(); 并添加 $mail->SMTPSecure = 'ssl'; - Simone Rossaini
1
不需要,你可以在本地运行它,然后将其 vendor 文件夹与所有其他 PHP 文件一起上传。 - Synchro
@Synchro 我已经完成并上传了供应商文件夹到我的主机。这次我遇到了以下错误:"2021-06-25 14:03:57 SMTP ERROR: Failed to connect to server: Network is unreachable (101) SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting" - Naser.Sadeghi
我认为问题不在于邮件发送程序,请检查您正在使用的帐户。我不确定,但也许您已经为该帐户启用了双重身份验证,这可能会阻止您进行此类登录。 - Haris
显示剩余10条评论
2个回答

4

较不安全的应用程序功能已经开启,我已经向我的托管提供商核实了你提到的事情。 - Naser.Sadeghi
2
您不需要启用较不安全的应用程序;您可以使用特定于应用程序的密码或XOAUTH2。您是否拥有网站证书与您是否使用TLS发送电子邮件完全无关。 - Synchro
1
@Synchro 谢谢,我不知道那个,因为某些原因,我只是认为你只有在有证书的情况下才会使用 SSL :) - Omer Farooq
两种加密模式只有微小的区别(隐式 vs 显式),但请记住 SSL 只是 TLS 的旧名称,因此它们实际上都是 TLS 的变体,SSL 名称仅出于历史原因而使用。在电子邮件中使用的真实名称是“SMTPS”和“SMTP+STARTTLS”。 - Synchro

0

当SMTP邮件服务器凭据正确,但未提供应用程序特定密码时,通常会显示此错误。 当我查看您的代码时,发现您以错误的方式编写了端口:

$mail->Port = 578;

应该是针对 TLS:

$mail->Port = 587;

希望这个答案对你有所帮助,别忘了填写。

$mail->AddAddress('*****************');
$mail->From = "*****************";

因为您可能存在错误,所以需要对部分进行修改。


谢谢您的回答,但那是在写问题时发生的笔误。在真实的代码中,它是587,但仍然无法工作。 - Naser.Sadeghi
也许你使用的 PHP Mailer 有问题,我会发送给你我使用的可正常工作的版本,你可以检查一下。除了之前提到的 SMTP 邮件服务器凭据正确但应用特定密码未提供外,我在你的代码中找不到任何问题。不过,我会留下我使用的 PHPMailer 链接。 https://github.com/PHPMailer/PHPMailer/tree/5.2-stable - Abdurrahman Alsallakh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接