遇到PHPMailer问题

时间:2012-11-12 13:04:35

标签: gmail php

我正在尝试使用PHPMailer发送gmail电子邮件。我遵循了post

为此,我设置了如下所示的功能:

function sendEmail($email, $name) {
    $mail = new PHPMailer();
    $mail->IsSMTP(); // send via SMTP
    //IsSMTP(); // send via SMTP I commented it cos it gives an error
    $mail->SMTPAuth = true; // turn on SMTP authentication
    $mail->Username = 'email@gmail.com'; // Changed my email
    $mail->Password = "password";// Changed my password
    $mail->From = 'email@gmail.com';
    $mail->FromName = 'FROM NAME';


    $mail->AddAddress($email);

    $mail->IsHTML(true); // send as HTML
    $mail->Subject = "Subject";
    $mail->Body = "Body";

    if (!$mail->Send()) {
        return false;
    } else {
        return true;
    }
}

不幸的是,它一直在返回false。你能告诉我代码有什么问题吗?

编辑:我得到的错误如下所示:

SMTP -> ERROR: Failed to connect to server: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

SMTP Error: Could not connect to SMTP host.

更新代码:

 $Mail = new PHPMailer();
    $Mail->IsSMTP(); // Use SMTP
    $Mail->Host = "smtp.gmail.com"; // Sets SMTP server
    $Mail->SMTPDebug = 2; // 2 to enable SMTP debug information 
    $Mail->SMTPAuth = TRUE; // enable SMTP authentication
    $Mail->SMTPSecure = "tls"; //Secure conection
    $Mail->Port = 587; // set the SMTP port
    $Mail->Username = EMAIL; // SMTP account username
    $Mail->Password = PASS; // SMTP account password
    $Mail->Priority = 1; // Highest priority - Email priority (1 = High, 3 = Normal, 5 = low)
    $Mail->CharSet = 'UTF-8';
    $Mail->Encoding = '8bit';
    $Mail->Subject = 'SUB';
    $Mail->ContentType = 'text/html; charset=utf-8\r\n';
    $Mail->From = EMAIL;
    $Mail->FromName = 'FROM NAME';
    $Mail->WordWrap = 900; // RFC 2822 Compliant for Max 998 characters per line

    $Mail->AddAddress($email); // To:
    $Mail->isHTML(TRUE);
    $Mail->Body = "Hi";
    $Mail->AltBody = "Hi";
    $Mail->Send();
    $Mail->SmtpClose();

7 个答案:

答案 0 :(得分:20)

以下是一个工作示例:

<?php
function SendMail( $ToEmail, $MessageHTML, $MessageTEXT ) {
  require_once ( 'class.phpmailer.php' ); // Add the path as appropriate
  $Mail = new PHPMailer();
  $Mail->IsSMTP(); // Use SMTP
  $Mail->Host        = "smtp.gmail.com"; // Sets SMTP server
  $Mail->SMTPDebug   = 2; // 2 to enable SMTP debug information
  $Mail->SMTPAuth    = TRUE; // enable SMTP authentication
  $Mail->SMTPSecure  = "tls"; //Secure conection
  $Mail->Port        = 587; // set the SMTP port
  $Mail->Username    = 'MyGmail@gmail.com'; // SMTP account username
  $Mail->Password    = 'MyGmailPassword'; // SMTP account password
  $Mail->Priority    = 1; // Highest priority - Email priority (1 = High, 3 = Normal, 5 = low)
  $Mail->CharSet     = 'UTF-8';
  $Mail->Encoding    = '8bit';
  $Mail->Subject     = 'Test Email Using Gmail';
  $Mail->ContentType = 'text/html; charset=utf-8\r\n';
  $Mail->From        = 'MyGmail@gmail.com';
  $Mail->FromName    = 'GMail Test';
  $Mail->WordWrap    = 900; // RFC 2822 Compliant for Max 998 characters per line

  $Mail->AddAddress( $ToEmail ); // To:
  $Mail->isHTML( TRUE );
  $Mail->Body    = $MessageHTML;
  $Mail->AltBody = $MessageTEXT;
  $Mail->Send();
  $Mail->SmtpClose();

  if ( $Mail->IsError() ) { // ADDED - This error checking was missing
    return FALSE;
  }
  else {
    return TRUE;
  }
}

$ToEmail = 'Name@example.com';
$ToName  = 'Name';

$Send = SendMail( $ToEmail, $MessageHTML, $MessageTEXT );
if ( $Send ) {
  echo "<h2> Sent OK</h2>";
}
else {
  echo "<h2> ERROR</h2>";
}
die;
?>

我尝试了这个脚本,发送几条消息没问题。

<强>更新:

这是Gmail成功的典型回应:

SMTP -> FROM SERVER:220 mx.google.com ESMTP 20sm6345523qek.6
SMTP -> FROM SERVER: 250-mx.google.com at your service, [181.155.13.39]
                     250-SIZE 35882577
                     250-8BITMIME
                     250-STARTTLS
                     250 ENHANCEDSTATUSCODES
SMTP -> FROM SERVER:220 2.0.0 Ready to start TLS
SMTP -> FROM SERVER: 250-mx.google.com at your service, [181.155.13.39]
                     250-SIZE 35882577
                     250-8BITMIME
                     250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
                     250 ENHANCEDSTATUSCODES
SMTP -> FROM SERVER:250 2.1.0 OK 20sm6345523qek.6
SMTP -> FROM SERVER:250 2.1.5 OK 20sm6345523qek.6
SMTP -> FROM SERVER:354 Go ahead 20sm6345523qek.6
SMTP -> FROM SERVER:250 2.0.0 OK 1353474062 20sm6345523qek.6
SMTP -> FROM SERVER:221 2.0.0 closing connection 20sm6345523qek.6

答案 1 :(得分:2)

您的代码无效,因为您没有将SMTPSecure选项设置为ssl帐户所需的gmail

include_once "/lib/phpmailer/PHPMailer.class.php";
include_once "/lib/phpmailer/SMTP.class.php";
include_once "/lib/phpmailer/POP3.class.php";

$mail = new PHPMailer(true);
$mail->IsSMTP();

try {
    $mail->Host = "smtp.gmail.com"; 
    $mail->SMTPDebug = 2; 
    $mail->SMTPSecure = 'ssl'; //<----------------- You missed this 
    $mail->SMTPAuth = true; 
    $mail->Host = "smtp.gmail.com"; 
    $mail->Port = 465; // 
    $mail->Username = "xxxxxx@gmail.com";
    $mail->Password = "xxxxxx";
    $mail->AddAddress('to@example.com', 'John Doe');
    $mail->SetFrom('xxxxxx@gmail.com', 'First Last');
    $mail->Subject = 'This is a TEST message';
    $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
    $body = "To view the message, please use an HTML compatible email viewer!"; // automatically
    $mail->MsgHTML($body);
    $mail->Send();
    echo "Message Sent OK</p>\n";
} catch ( phpmailerException $e ) {
    echo $e->errorMessage(); 
} catch ( Exception $e ) {
    echo $e->getMessage(); 
}

输出

SMTP -> FROM SERVER:220 mx.google.com ESMTP q22sm2927759bkv.16 
SMTP -> FROM SERVER: 250-mx.google.com at your service, [62.173.54.190] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 250 ENHANCEDSTATUSCODES 
SMTP -> FROM SERVER:250 2.1.0 OK q22sm2927759bkv.16 
SMTP -> FROM SERVER:250 2.1.5 OK q22sm2927759bkv.16 
SMTP -> FROM SERVER:354 Go ahead q22sm2927759bkv.16 
SMTP -> FROM SERVER:250 2.0.0 OK 1353341553 q22sm2927759bkv.16 
Message Sent OK

答案 2 :(得分:1)

在此类问题中,在部署到生产之前检查它在开发环境中的运行方式非常重要,因为可能存在许多可能与问题相关的服务器问题。

因为在此之前将调试设置为true并检查您收到的消息。

$mail->SMTPDebug = 1;

尽管如此,在这种情况下常见的服务器问题如下:

  1. PHP中缺少SSL支持。您必须启用它。

  2. 某种防火墙可能阻止您连接到出站套接字。您可以使用PHP检查它。

  3. -

    $p = fsockopen( '127.0.0.1', <port number>, $errno, $errstr, 5 );
    if ( !$p )
        // port is closed or blocked
    else
        // port is open and available
        fclose( $p );`
    

答案 3 :(得分:0)

...试

<?php
require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "smtp.gmail.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "smtp.gmail.com"; // sets the SMTP server
  $mail->Port       = 465;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "yourname@yourdomain"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'This is a TEST Message';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML($obdy);
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>

只需用你的配置替换,设置require_once('class.phpmailer.php');指向正确的位置并将'contents.html'替换为您的HTML模板。

如果您选择不使用HTML模板,请使用此代码...

<?php

$body ='Your HTML message should go here';

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "smtp.gmail.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "smtp.gmail.com"; // sets the SMTP server
  $mail->Port       = 465;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "yourname@yourdomain"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'This is a TEST message';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML($body);
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>

答案 4 :(得分:0)

$mail = new PHPMailer();

                // Set up SMTP
                $mail->IsSMTP();                // Sets up a SMTP connection
                $mail->SMTPDebug  = 0;          // This will print debugging info
                $mail->SMTPAuth = true;         // Connection with the SMTP does require authorization
                $mail->SMTPSecure = "tls";      // Connect using a TLS connection
                $mail->Host = "smtp.gmail.com";
                $mail->Port = 587;
                $mail->Encoding = '7bit';       // SMS uses 7-bit encoding
                $mail->IsHTML(true);            // Set email format to HTML

                // Authentication
                $mail->Username   = "xxx@xxx.xxx.xx"; // Login
                $mail->Password   = "xxxxxx"; // Password

                //$to=
                $to = "zzz@zzz.zzz.zz";
                $mail->Subject = "Outstanding Balance Notification ";     // Subject (which isn't required)
                $mail->Body =  "Dear Sir / Madam";
                $mail->FromName = "stackoverflow";
                $mail->From = "noreply@xxx.xxx.xx";

                $mail->AddAddress($row["Email1"]);

试试这个..:)

答案 5 :(得分:0)

我已经从localhost

发送来自xampp服务器的邮件

这段代码非常适合我

1:从https://github.com/PHPMailer/PHPMailer下载phpmailer

2:转到xampp并搜索php.ini

3在php.ini搜索中

;extension=php_openssl.dll    
 remove(;)       
 extension=php_openssl.dll 

然后保存并重新启动p.c.它的工作

<%php <br/>
require_once("C:\\xampp\\phpMailer\\PHPMailer-master\\class.phpmailer.php"); <br/>

$mail = new PHPMailer(); <br/>
$mail->IsSMTP();  // telling the class to use SMTP    <br/>
$mail->SMTPAuth = true;         // Enable SMTP authentication  <br/>
$mail->SMTPSecure = 'ssl' ;   <br/>
$mail->Host    = "smtp.gmail.com" ;// SMTP server <br/>
$mail->Port = 465; // or 587   <br/>

$mail->Username = 'senderemailid@gmail.com';    // SMTP username <br/>
$mail->Password = 'senderpassword';     // SMTP password   <br/>

$mail -> IsHTML(true);  <br/>
$mail->From    = 'senderemailid@gmail.com'; <br/>
$mail->FromName = 'sendername';   <br/>
$mail->addAddress('receiveremailid@domain.com','receivername');  <br/>

$mail->WordWrap = 50;  <br/>

$mail->Subject  = "This mail send from  PhP code xampp"; <br/>
$mail->Body     = "Hi! \n\n This is my first e-mail sent through PHPMailer."; <br/>

if(!$mail->Send()) {   <br/>
echo 'Message was not sent.';   <br/>
echo 'Mailer error: ' . $mail->ErrorInfo;  <br/>

} else    <br/>
 {   <br/>
echo 'Message has been sent.';  <br/>
}  <br/>
?>  <br/>

答案 6 :(得分:0)

2019年使用Gmail更新phpMailer

我知道这是一个老问题,但Google仍然会提出,我需要更新此问题的答案。

如果您遇到了phpmailer的问题(很多地方都这样做),则只有当您尝试使用gmail的SMTP时将IsSMTP()注释掉时,它才起作用,这就是原因。

当您注释掉IsSMTP()时,您是在告诉phpmailer不要使用SMTP,默认情况下phpmailer会将请求发送到本地mail()。如果您查看此时发送的电子邮件,并查看电子邮件的标题,您将看到它来自本地服务器,而不是您尝试将其发送为的地址/域。因此,对IsSMTP()进行注释可以使其正常工作,但实际上并非如此。而且从未正确设置的本地服务器发送邮件很可能会导致您的电子邮件成为垃圾邮件。

那么我该如何解决

简单明了的您很可能正在使用旧版本的phpmailer,而您需要新版本。最简单的方法就是设置From地址。如果看起来像这样$mail->From = "name@example.com",则说明您使用的是旧版本。

最新版本的phpmailer将From定义为$mail->setFrom("name@example.com", "First Last")。如果看到该消息,则说明您正在使用新版本的phpmailer。

如何正确执行并使其真正起作用

  1. 请确保防火墙上具有587的TCP OUT端口

  2. SMTP Gmail仅可用于tls / 587,而不能用于ssl / 465(ssl是1990年代)

  3. 请确保您在gmail中正确设置了allow less secure apps。如果您使用的是G Suite帐户,那么如果尚未启用,则必须让管理员启用。

  4. This is a perfect example how to use the new phpmailer with gmail smtp(是的,它确实可以工作,如果没有,那么您的端头有问题)

如何安装phpmailer

首先download最新版本的phpmailer

有两种安装方法。作曲家或手册。您所需的手动方式是

use PHPMailer\PHPMailer\PHPMailer; <-- make sure these are not in a function
use PHPMailer\PHPMailer\Exception;

require 'path/src/Exception.php';
require 'path/src/PHPMailer.php';
require 'path/src/SMTP.php';

示例

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 * This uses traditional id & password authentication - look at the gmail_xoauth.phps
 * example to see how to use XOAUTH2.
 * The IMAP section shows how to save this message to the 'Sent Mail' folder using IMAP commands.
 */

//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/src/Exception.php';
require 'path/src/PHPMailer.php';
require 'path/src/SMTP.php';

//Create a new PHPMailer instance
$mail = new PHPMailer;

//Tell PHPMailer to use SMTP
$mail->isSMTP();

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

//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6

//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;

//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';

//Whether to use SMTP authentication
$mail->SMTPAuth = true;

//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";

//Password to use for SMTP authentication
$mail->Password = "yourpassword";

//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');

//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');

//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');

//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';

//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);

//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';

//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');

//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
    //Section 2: IMAP
    //Uncomment these to save your message in the 'Sent Mail' folder.
    #if (save_mail($mail)) {
    #    echo "Message saved!";
    #}
}

//Section 2: IMAP
//IMAP commands requires the PHP IMAP Extension, found at: https://php.net/manual/en/imap.setup.php
//Function to call which uses the PHP imap_*() functions to save messages: https://php.net/manual/en/book.imap.php
//You can use imap_getmailboxes($imapStream, '/imap/ssl') to get a list of available folders or labels, this can
//be useful if you are trying to get this working on a non-Gmail IMAP server.
function save_mail($mail)
{
    //You can change 'Sent Mail' to any other folder or tag
    $path = "{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail";

    //Tell your server to open an IMAP connection using the same username and password as you used for SMTP
    $imapStream = imap_open($path, $mail->Username, $mail->Password);

    $result = imap_append($imapStream, $path, $mail->getSentMIMEMessage());
    imap_close($imapStream);

    return $result;
}
?>