it-swarm-vi.com

Gặp sự cố với PHPMailer

Tôi đang cố gắng sử dụng PHPMailer để gửi email gmail. Tôi đã theo dõi bài này

Để thực hiện việc này, tôi thiết lập một chức năng hiển thị bên dưới: 

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 protected]'; // Changed my email
    $mail->Password = "password";// Changed my password
    $mail->From = '[email protected]';
    $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;
    }
}

Thật không may, nó tiếp tục trả về sai. Bạn có thể vui lòng cho tôi biết những gì sai với mã?

Chỉnh sửa: Lỗi mà tôi đang nhận được hiển thị dưới đây:

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.

MÃ CẬP NHẬT:

 $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();
17
Goaler444

Đây là một ví dụ hoạt động:

<?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    = '[email protected]'; // 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        = '[email protected]';
  $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 = '[email protected]';
$ToName  = 'Name';

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

Tôi đã thử kịch bản này và không có vấn đề gì khi gửi một số tin nhắn.

CẬP NHẬT:

Đây là phản hồi điển hình từ Gmail về thành công:

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
20
Felipe Alameda A

Mã của bạn không hoạt động vì bạn không đặt tùy chọn SMTPSecure thành ssl được yêu cầu cho tài khoản 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 = "[email protected]";
    $mail->Password = "xxxxxx";
    $mail->AddAddress('[email protected]', 'John Doe');
    $mail->SetFrom('[email protected]', '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(); 
}

Đầu ra 

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
Baba

Trong các loại vấn đề như vậy, điều quan trọng là kiểm tra cách nó chạy trên môi trường phát triển trước khi bạn triển khai vào sản xuất, vì có nhiều vấn đề máy chủ có thể liên quan đến sự cố.

Bởi vì điều đó trước khi bất cứ điều gì thiết lập gỡ lỗi thành đúng và kiểm tra các tin nhắn bạn nhận được.

$mail->SMTPDebug = 1;

Điều đó nói rằng, các vấn đề máy chủ phổ biến trong các tình huống như vậy là sau đây.

  1. Thiếu hỗ trợ SSL trong PHP. Bạn phải kích hoạt nó.

  2. Một số loại tường lửa có thể ngăn bạn kết nối với các ổ cắm ngoài. Bạn có thể kiểm tra bằng PHP.

-

$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 );`
1
inigomedina

2019 Cập nhật phpMailer bằng Gmail

Tôi biết đây là một câu hỏi cũ nhưng nó vẫn xuất hiện trong Google và tôi cần cập nhật câu trả lời cho câu hỏi này.

Nếu bạn gặp phải sự cố (nơi nhiều người làm) với phpmailer thì nó chỉ hoạt động khi bạn nhận xét IsSMTP() khi cố gắng sử dụng SMTP của gmail thì đây là lý do.

Khi bạn nhận xét IsSMTP(), bạn đang nói với phpmailer KHÔNG SỬ DỤNG SMTP mà theo mặc định, phpmailer sẽ gửi yêu cầu đến địa phương mail() của bạn. Nếu bạn nhìn vào các email được gửi tại thời điểm này và nhìn vào tiêu đề của email, bạn sẽ thấy rằng nó đến từ máy chủ cục bộ của bạn chứ không phải địa chỉ/tên miền bạn đang cố gắng gửi nó dưới dạng. Vì vậy, có bình luận ra IsSMTP() sẽ làm cho nó hoạt động, nhưng nó thực sự không. Và gửi từ máy chủ cục bộ của bạn không được thiết lập chính xác rất có thể sẽ dẫn đến email của bạn sẽ bị spam.

Vậy làm cách nào để sửa lỗi này

Rõ ràng và đơn giản, rất có thể bạn đang sử dụng một phiên bản cũ của phpmailer, bạn cần một phiên bản mới hơn. Cách dễ dàng để nói điều này là cách bạn đặt địa chỉ From của bạn. Nếu nó trông như thế này $mail->From = "[email protected]" thì bạn đang sử dụng một phiên bản cũ.

Các phiên bản mới nhất của phpmailer định nghĩa Từ là $mail->setFrom("[email protected]", "First Last"). Nếu bạn thấy điều đó thì bạn đang sử dụng một phiên bản mới hơn của phpmailer.

Làm thế nào để làm điều đó đúng và thực sự làm cho nó hoạt động

  1. Vui lòng đảm bảo rằng bạn có TCP cổng OUT cho 587 trên tường lửa của bạn

  2. SMTP Gmail sẽ chỉ hoạt động với tls/587 VÀ KHÔNG ssl/465 (ssl là năm 1990)

  3. Đảm bảo rằng bạn có cho phép các ứng dụng kém an toàn hơn được đặt chính xác trong gmail. Nếu bạn đang sử dụng tài khoản G Suite thì bạn sẽ phải cho phép quản trị viên của mình kích hoạt nó nếu chưa có.

  4. Đây là một ví dụ hoàn hảo về cách sử dụng phpmailer mới với gmail smtp (và vâng, nó hoạt động, nếu không thì có gì đó không ổn ở phía bạn)

Cách cài đặt phpmailer

Đầu tiên tải xuống phiên bản mới nhất của phpmailer

Có 2 cách để cài đặt nó. Nhà soạn nhạc hoặc hướng dẫn sử dụng. Cách thủ công tất cả những gì bạn cần là

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

TH&IACUTE; DỤ

<?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 = "[email protected]";

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

//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'First Last');

//Set an alternative reply-to address
$mail->addReplyTo('[email protected]', 'First Last');

//Set who the message is to be sent to
$mail->addAddress('[email protected]', '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;
}
?>
0
Cesar Bielich

Tôi đã gửi thư từ máy chủ xampp từ localhost 

Mã này hoàn toàn phù hợp với tôi 

1: tải xuống phpmailer từ https://github.com/PHPMailer/PHPMailer

2: truy cập xampp và tìm kiếm php.ini 

3 Trong tìm kiếm php.ini 

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

sau đó lưu và khởi động lại p.c. đó là công việ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 = '[email protected]';    // SMTP username <br/>
$mail->Password = 'senderpassword';     // SMTP password   <br/>

$mail -> IsHTML(true);  <br/>
$mail->From    = '[email protected]'; <br/>
$mail->FromName = 'sendername';   <br/>
$mail->addAddress('[email protected]','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/>
0
saurabh agrawal

Thử...

<?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   = "[email protected]"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->AddAddress('[email protected]', 'John Doe');
  $mail->SetFrom('[email protected]', 'First Last');
  $mail->AddReplyTo('[email protected]', '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!
}
?>

Chỉ cần thay thế bằng cấu hình của bạn, đặt allow_once ('class.phpmailer.php'); để chỉ đến đúng nơi và thay thế 'nội dung.html' mẫu HTML của bạn.

hoặc là

Sử dụng mã này nếu bạn chọn không sử dụng mẫu 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   = "[email protected]"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->AddAddress('[email protected]', 'John Doe');
  $mail->SetFrom('[email protected]', 'First Last');
  $mail->AddReplyTo('[email protected]', '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!
}
?>
0
Matzo
$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   = "[email protected]"; // Login
                $mail->Password   = "xxxxxx"; // Password

                //$to=
                $to = "[email protected]";
                $mail->Subject = "Outstanding Balance Notification ";     // Subject (which isn't required)
                $mail->Body =  "Dear Sir / Madam";
                $mail->FromName = "stackoverflow";
                $mail->From = "[email protected]";

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

thử đi.. :)

0
user2514863