79

我想通过PHP Mailer使用Gmail SMTP服务器发送电子邮件。

这是我的代码

<?php
require_once('class.phpmailer.php');

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->CharSet="UTF-8";
$mail->SMTPSecure = 'tls';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->Username = 'MyUsername@gmail.com';
$mail->Password = 'valid password';
$mail->SMTPAuth = true;

$mail->From = 'MyUsername@gmail.com';
$mail->FromName = 'Mohammad Masoudian';
$mail->AddAddress('anotherValidGmail@gmail.com');
$mail->AddReplyTo('phoenixd110@gmail.com', 'Information');

$mail->IsHTML(true);
$mail->Subject    = "PHPMailer Test Subject via Sendmail, basic";
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
$mail->Body    = "Hello";

if(!$mail->Send())
{
  echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
  echo "Message sent!";
}
?>

但我收到以下错误

Mailer Error: SMTP Error: The following recipients failed: anotherValidGmail@gmail.com

SMTP server error: SMTP AUTH is required for message submission on port 587

我的域名是vatandesign.ir

4

14 回答 14

147
$mail = new PHPMailer(); // create a new object
$mail->IsSMTP(); // enable SMTP
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail
$mail->Host = "smtp.gmail.com";
$mail->Port = 465; // or 587
$mail->IsHTML(true);
$mail->Username = "email@gmail.com";
$mail->Password = "password";
$mail->SetFrom("example@gmail.com");
$mail->Subject = "Test";
$mail->Body = "hello";
$mail->AddAddress("email@gmail.com");

 if(!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
 } else {
    echo "Message has been sent";
 }

上面的代码已经过测试并为我工作。

可能是你需要的$mail->SMTPSecure = 'ssl';

还要确保您没有为该帐户打开两步验证,因为这也会导致问题。

更新

您可以尝试将 $mail->SMTP 更改为:

$mail->SMTPSecure = 'tls';

值得注意的是,一些 SMTP 服务器会阻止连接。某些 SMTP 服务器不支持SSL(或TLS)连接。

于 2013-04-16T22:45:11.410 回答
32

所以我刚刚解决了我自己的“SMTP 连接失败”错误,我想发布解决方案以防万一它对其他人有所帮助。

我使用了 PHPMailer 示例 gmail.phps 文件中给出的 EXACT 代码。它在我使用 MAMP 时很简单,然后在我将它移到我的个人服务器后出现 SMTP 连接错误。

我阅读的所有 Stack Overflow 答案以及 PHPMailer 的所有故障排除文档都表示这不是 PHPMailer 的问题。这是服务器端的设置问题。我尝试了不同的端口(587、465、25),我尝试了“SSL”和“TLS”加密。我检查了我的 php.ini 文件中是否启用了 openssl。我检查了没有防火墙问题。一切都检查过了,还是什么都没有。

解决方案是我必须删除这一行:

$mail->isSMTP();

现在一切正常。我不知道为什么,但它有效。我的其余代码是从 PHPMailer 示例文件中复制和粘贴的。

于 2015-07-02T21:12:43.563 回答
8

另外值得注意的是,如果您启用了两因素身份验证,则需要设置一个应用程序特定密码来代替您的电子邮件帐户密码。

您可以按照以下说明生成应用程序专用密码:https: //support.google.com/accounts/answer/185833

然后设置$mail->Password为您的应用程序特定密码。

于 2014-01-22T12:05:25.913 回答
5

您的服务器似乎无法与 Gmail SMTP 服务器建立连接。以下是解决此问题的一些提示: 1) 检查您的 PHP 上是否正确配置了 SSL(处理它的模块默认情况下未安装在 PHP 上。您必须检查 phph.ini 中的配置)。2)检查您的防火墙是否允许对所需端口(此处为 465 或 587)进行传出呼叫。使用 telnet 来执行此操作。如果端口未打开,您将需要 sysdmin 的一些支持来设置配置。我希望你能尽快解决这个问题!

于 2013-07-26T08:26:25.100 回答
5

打开此链接并选择按照说明进行操作,谷歌服务器会阻止来自未知服务器的任何尝试,因此一旦您点击验证码,一切都会好起来的

于 2013-10-07T09:56:05.463 回答
1

这段代码对我来说很好

    $mail = new PHPMailer;
    //Enable SMTP debugging. 
    $mail->SMTPDebug = 0;
    //Set PHPMailer to use SMTP.
    $mail->isSMTP();
    //Set SMTP host name                          
    $mail->Host = $hostname;
    //Set this to true if SMTP host requires authentication to send email
    $mail->SMTPAuth = true;
    //Provide username and password     
    $mail->Username = $sender;
    $mail->Password = $mail_password;
    //If SMTP requires TLS encryption then set it
    $mail->SMTPSecure = "ssl";
    //Set TCP port to connect to 
    $mail->Port = 465;
    $mail->From = $sender;  
    $mail->FromName = $sender_name;
    $mail->addAddress($to);
    $mail->isHTML(true);
    $mail->Subject = $Subject;
    $mail->Body = $Body;
    $mail->AltBody = "This is the plain text version of the email content";
    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    }
    else {
           echo 'Mail Sent Successfully';
    }
于 2016-10-27T05:41:26.253 回答
1

Google 会根据可用的用户信息对 Gmail 帐户进行不同的处理,这可能是为了遏制垃圾邮件发送者。

在进行电话验证之前,我无法使用 SMTP。做了另一个帐户仔细检查,我能够确认它。

于 2016-04-19T15:29:35.917 回答
0

Anderscc 已经正确了。谢谢。它对我有用,但不是 100%。

我不得不设置

$mail->SMTPDebug = 0;

将其设置为 1 可能会导致错误,尤其是当您将一些数据作为 json 传递到下一页时。示例 - 如果发送邮件则执行验证,使用 json 通过 ajax 传递数据。

我不得不降低我的 gmail 帐户安全设置以消除错误:“SMTP connect() failed”和“SMTP ERROR: Password command failed”

解决方案: 此问题可能是由尝试使用电子邮件帐户的“不太安全”的应用程序引起的(这是根据谷歌帮助,不确定他们如何判断什么是安全的,什么是不安全的)或者如果您尝试多次登录连续或如果您更改国家/地区(例如使用 VPN、将代码移动到不同的服务器或实际尝试从世界不同的地方登录)。

解决问题的链接(您必须登录谷歌帐户):

注意: 您可以到以下stackoverflow答案链接获取更详细的参考。

https://stackoverflow.com/a/25175234

于 2017-05-04T12:25:16.757 回答
0

如果那里的任何人没有得到任何有效的答案,可以试试这个。因为我花了一天时间来解决这个问题。
注意:我使用的是 PHPMailer 5.2.23。

<?php

    date_default_timezone_set('Asia/Kolkata');

    require './Libraries/PHPMailer5/PHPMailerAutoload.php';
    $mail = new PHPMailer;

    $mail->isSMTP();

    // Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;

    $mail->Debugoutput = 'html';

    $mail->Host = 'localhost';
    $mail->Port = 587;

    $mail->SMTPSecure = 'tls';

    $mail->SMTPAuth = true;
    $mail->Username = "yourWebmailUsermail";
    $mail->Password = "yourWebmailPassword";

    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );

    $mail->setFrom('formEmailAddress', 'First Last');

    $mail->addAddress('toEmailAddress', 'John Doe');

    $mail->Subject = 'PHPMailer GMail SMTP test';

    $mail->msgHTML("<h1>Hi Test Mail</h1>");
    $mail->AltBody = 'This is a plain-text message body';

    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }
?>
于 2021-06-11T19:50:19.990 回答
0

我只是想与 phpMailer 分享我的经验,它在本地(XAMPP)工作,但不在我的托管服务提供商上工作。

我打开了phpMailer报错

 $mail->SMTPDebug=2

我收到“连接被拒绝错误”

我向我的主机提供商发送了电子邮件以解决该问题,他们说他们将打开 SMTP 端口 25、465、587。

然后我收到以下错误响应“SMTP 错误:密码命令失败:”....“请通过您的网络浏览器登录,然后重试”....“SMTP 错误:无法验证。”

所以谷歌检查您是否登录到您的帐户(我是通过浏览器在本地运行脚本时),然后允许您通过 phpMailer 脚本发送邮件。

要解决这个问题:

1:转到您的 Google 帐户 -> 安全 2:滚动到钥匙图标并选择“双向验证”并按照程序进行 3:完成后从 Google 帐户返回钥匙图标 -> 安全并选择第二个选项“创建应用程序密码”并按照程序获取密码。

现在转到您的 phpMailer 对象并使用上述过程中提供的密码更改您的 Google 密码。

你完成了。

编码:

require_once('class.phpmailer.php');

$phpMailerObj= new PHPMailer();

                $phpMailerObj->isSMTP();                    
                $phpMailerObj->SMTPDebug = 0;
                $phpMailerObj->Debugoutput = 'html';                    
                $phpMailerObj->Host = 'smtp.gmail.com';                     
                $phpMailerObj->Port = 587;
                $phpMailerObj->SMTPSecure = 'tls';
                $phpMailerObj->SMTPAuth = true;                 
                $phpMailerObj->Username = "YOUR EMAIL";                 
                $phpMailerObj->Password = "THE NEW PASSWORD FROM GOOGLE ";
                $phpMailerObj->setFrom('YOUR EMAIL ADDRESS', 'THE NAME OF THE SENDER',0);
                $phpMailerObj->addAddress('RECEIVER EMAIL ADDRESS', 'RECEIVER NAME');
                
                $phpMailerObj->Subject = 'SUBJECT';
                $phpMailerObj->Body ='MESSAGE';
                
                if (!phpMailerObj->send()) {
                    echo "phpMailerObjer Error: " . $phpMailerObj->ErrorInfo;
                    return 0;
                } else {
                    echo "Message sent!";
                    return 1;
                } 
于 2020-03-20T01:06:45.190 回答
0

我找到了一个解决方案并且它正在工作。

基本设置:

$mail->IsHTML(true);
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
//SMTP::DEBUG_OFF = off (for production use)
//SMTP::DEBUG_CLIENT = client messages
//SMTP::DEBUG_SERVER = client and server messages
$mail->SMTPDebug = SMTP::DEBUG_CLIENT;
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
//Set the SMTP port number - likely to be 25, 465 or 587
$mail->Port = 587;
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication
$mail->Username = 'user@gmail.com';
//Password to use for SMTP authentication
$mail->Password = 'PASSWORD_HERE';
//Set who the message is to be sent from
$mail->setFrom('email@email.ext', 'From where it is sent');
//Set an alternative reply-to address
$mail->addReplyTo('email@email.ext', 'Reply To');
//Set who the message is to be sent to
$mail->addAddress('email@email.ext');
//Set the subject line
$mail->Subject = 'Email subject';
// Body message
$mail->Body = '
  <h1>Message details</h1>
';
// Send message
if( $mail->send()  ) {
    echo "Sent"
} else {
    echo "Not Sent";
}

如果您已经尝试了所有方法,请尝试这样做:

  1. 禁用阻止可疑应用程序/技术的功能https://www.google.com/settings/u/1/security/lesssecureapps
  2. 清除验证码https://accounts.google.com/b/0/DisplayUnlockCaptcha

做测试。

以下是一些帮助我解决此问题的感兴趣的文章:

https://support.google.com/a/thread/108782439/smtp-error-password-command-failed-535-5-7-8-username-and-password-not-accepted?hl=en&msgid=108963583

https://bobcares.com/blog/phpmailer-smtp-error-password-command-failed/

于 2021-09-19T01:39:02.230 回答
0
 $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );
于 2018-03-29T04:17:48.980 回答
0

如果您使用的是 cPanel,您只需单击允许您通过 SMTP 发送到外部服务器的 wee 框。

登录到 CPanel > Tweak Settings > All > “将传出 SMTP 限制为 root、exim 和 mailman (FKA SMTP Tweak)”

如此处回答:

使用 GMail 和 phpMailer 发送时“服务器不接受密码:535 验证数据不正确”

于 2017-10-26T15:32:24.780 回答
-2

我认为这是连接问题,您可以在此处获取代码http://skillrow.com/sending-mail-using-smtp-and-php/

include(“smtpfile.php“);
include(“saslfile.php“); // for SASL authentication $from=”my@website.com“; //from mail id

$smtp=new smtp_class;

$smtp->host_name=”www.abc.com“; // name of host
$smtp->host_port=25;//port of host

$smtp->timeout=10;
$smtp->data_timeout=0;
$smtp->debug=1;
$smtp->html_debug=1;
$smtp->pop3_auth_host=””;
$smtp->ssl=0;
$smtp->start_tls=0;
$smtp->localhost=”localhost“;
$smtp->direct_delivery=0;

$smtp->user=”smtp username”;
$smtp->realm=””;
$smtp->password=”smtp password“;

$smtp->workstation=””;
$smtp->authentication_mechanism=””;

$mail=$smtp->SendMessage($from,array($to),array(“From:$from”,”To: $to”,”Subject: $subject”,”Date: ”.strftime(“%a, %d %b %Y %H:%M:%S %Z”)),”$message”);

if($mail){
   echo “Mail sent“;
}else{
   echo $smtp->error;
}
于 2014-03-21T06:06:00.327 回答