无法通过PHPMailer使用Gmail SMTP服务器发送电子邮件,出现错误:在端口587上提交邮件需要SMTP AUTH。如何解决?


77

我想通过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


你可能想看看Jorj对这个主题的答案: stackoverflow.com/questions/5759419/...
人类崇拜者

Answers:


141
$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)连接。


我在使用您的代码时收到此错误Mailer错误:以下发件人地址失败:phoenixd110@gmail.com:未连接就调用Mail()
Mohammad Masoudian 2013年

3
更新了答案并提供了进一步的建议。无论如何,代码绝对是可以的。您可以检查这两个来源phpmailer.worxware.com/index.php?pg=exampleagmailgithub.com/Synchro/PHPMailer/blob/master/examples/...
安德鲁-考菲尔德

我收到以下错误信息:客户-> SMTP:EHLO localhost SMTP->错误:服务器不接受EHLO:客户-> SMTP:HELO本地注意:fwrite():16字节发送失败,errno = 10054现有连接被远程主机强行关闭。在C:\ xampp \ htdocs \ program \ mailsending1 \ mailsending_v1 \ PHPMailer-master \ class.smtp.php中的第1023行SMTP->错误:服务器未接受HELO:SMTP->注意:检查是否已连接SMTP Connect( )失败。邮件错误:SMTP Connect()失败。
阿努拉格·辛格

2
请注意,如果指定“ ssl”(强烈建议使用),则您的PHP安装需要使用您最喜欢的PHP扩展机制(我碰巧使用OS X Macports)加载(或编译)“ openssl”扩展这是sudo端口安装php5-openssl)
xgretsch 2014年

最好同时检查返回值和错误if(!$ mail-> Send()|| $ mail-> ErrorInfo){
ymakux

32

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

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

我阅读了所有有关Stack Overflow的答案,并且PHPMailer的所有故障排除文档都说,这与PHPMailer无关。那是服务器端的设置问题。我尝试了不同的端口(587、465、25),尝试了“ SSL”和“ TLS”加密。我检查了是否在我的php.ini文件中启用了openssl。我检查了是否没有防火墙问题。一切都结帐了,还是一无所有。

解决的办法是我必须删除此行:

$mail->isSMTP();

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


7
此解决方案有效,因为它完全关闭了SMTP。我不推荐这种方法。我从来没有解决过这个问题,现在我改用Mandrill API。
伊万·巴特勒

只需使用Mandrill,它会更好,并且实际上具有一些分析功能。
伊万·巴特勒

解决了我的问题。非常感谢。
克里斯蒂安·奥阿纳

它也对我有用。很奇怪,这个库已经相当成熟了
-ymakux

1
糟糕的解决方案,您不是在使用像这样的smtp,而是裸露的php mail()函数,可能会将您的电子邮件作为垃圾发送给某些收件人
Nassim


5

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


4

打开此链接,然后按照说明进行操作,即Google服务器阻止来自未知服务器的任何尝试,因此,一旦您单击验证码,就可以检查所有内容


1
我使用与接受的答案相同的代码,但仍然会出现SMTP_connect()故障。我尝试了该链接中的所有内容,但最终仍正常工作,因此+1。
伊万

1
我也遇到了SMTP_connect()故障的问题。我按照上述步骤进行操作,但仍然出现错误。我在2个不同的gmail地址上执行了两次步骤,两次都似乎需要等待大约1个小时才能开始进行更改。此后,一切都按预期进行。
cwal

访问google.com/accounts/DisplayUnlockCaptcha,然后运行我的代码,这对我来说很有效。+1
Bill Brower

解决了我的问题。
Nikhil Pawar

1

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

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


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';
    }

$ mail-> SMTPSecure ='ssl'; $ mail->端口= 465; 我只是将TSL更改为ssl,将587更改为465,然后为我工作,谢谢。.GMAIL允许安全性较低的应用程序:myaccount.google.com/lesssecureapps

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

1
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
Athul

这只是危险。不要这样
同步


0

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

我必须设定

$mail->SMTPDebug = 0;

将其设置为1会导致错误,尤其是当您将某些数据作为json传递到下一页时。示例-使用json通过ajax传递数据来验证是否发送了邮件。

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

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

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

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

https://stackoverflow.com/a/25175234


0

大家好,您只想与phpMailer分享我的经验,该软件在本地(XAMPP)工作,但不适用于我的托管服务提供商。

我打开了phpMailer错误报告

 $mail->SMTPDebug=2

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

我通过电子邮件向托管服务提供商发送此问题,他说他将打开SMTP PORTS,并打开端口25,465,587。

然后我得到以下错误响应“ SMTP错误:密码命令失败:” ..“请通过您的Web浏览器登录,然后重试”。

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

要解决该问题,请执行以下步骤:1:转到您的Google帐户->安全2:滚动到“钥匙图标”,然后选择“ 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;
                } 

-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;
}

通常不鼓励仅链接的答案。您能否将其扩展为独立的产品?
Werner 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.