Trước đây trong hướng dẫn lập trình PHP chúng tôi có hướng Gửi email trong PHP bằng hàm mail(). Trong bài viết này, chúng ta sẽ nói về lý do và cách bạn nên gửi email bằng PHPMailer thay vì hàm mail() của PHP.
PHPMailer là một thư viện mã và được sử dụng để gửi email một cách an toàn và dễ dàng thông qua mã PHP từ máy chủ web. Gửi email trực tiếp qua mã PHP đòi hỏi phải có hiểu biết ở mức độ cao về giao thức chuẩn SMTP cũng như các vấn đề và lỗ hổng liên quan về việc chèn Email để gửi thư rác. PHPMailer đơn giản hóa quá trình gửi email và rất dễ sử dụng.
Ưu điểm của PHPMailer:
- Nó có thể in nhiều loại thông báo lỗi bằng hơn 40 ngôn ngữ khi không gửi được email.
- Nó đã tích hợp hỗ trợ và xác thực giao thức SMTP qua SSL và TLS.
- Nó có thể gửi một phiên bản email văn bản thuần túy thay thế cho các ứng dụng email không phải HTML.
- Nó có một cộng đồng nhà phát triển rất tích cực giúp nó luôn được bảo mật và cập nhật.
PHPMailer cũng được sử dụng bởi các hệ thống quản lý nội dung PHP phổ biến như WordPress, Drupal và Joomla.
Điều kiện cần để sử dụng PHPMailer
- Máy chủ web có cài đặt PHP
- địa chỉ email hiện có
- Chuyển tiếp SMTP
- PHPMailer phiên bản mới nhất mà bạn có thể tải xuống qua liên kết này
PHPMailer với Gmail
Trước khi bắt đầu với các bước về cách gửi thư bằng SMTP trong ví dụ PHP, trước tiên hãy xem một số giới hạn với máy chủ Gmail SMTP và cách khắc phục một số giới hạn sau:
Gmail giới hạn số lượng người nhận trong một email và số lượng email có thể gửi mỗi ngày. Giới hạn hiện tại là 500 Email trong một ngày hoặc 500 người nhận trong một email. Bạn thực sự không thể tăng giới hạn này. Nếu bạn muốn gửi vượt quá giới hạn này thì bạn cần tích hợp với nền tảng gửi email của bên thứ ba như Sendgrid, v.v.
Khi đạt đến giới hạn ngưỡng, bạn sẽ không thể gửi thư trong 24 giờ tới. Khi khoảng thời gian tạm dừng này kết thúc, bộ đếm sẽ tự động được đặt lại và người dùng có thể tiếp tục gửi email.
Theo mặc định, mọi ứng dụng/mã của bên thứ ba đều không được phép gửi email bằng tài khoản Gmail của bạn. Và do đó, có một số cài đặt cần được thực hiện ở phía bạn.
Làm cách nào để kích hoạt tính năng gửi email trong Gmail?
Trước khi gửi email bằng Máy chủ SMTP của Gmail, bạn phải thực hiện một số cài đặt cấp độ quyền và bảo mật trong Cài đặt bảo mật tài khoản Google của mình .
- Đảm bảo rằng Xác minh 2 bước (2-Step-Verification) đã tắt.
- BẬT quyền truy cập “ Ứng dụng kém an toàn hơn” hoặc nhấp vào đây.
- Nếu xác minh 2 bước được bật thì bạn sẽ phải tạo mật khẩu ứng dụng cho ứng dụng hoặc thiết bị của mình.
- Để biết các biện pháp bảo mật, Google có thể yêu cầu bạn hoàn tất bước bổ sung này khi đăng nhập. Cho phép truy cập vào tài khoản Google của bạn bằng thiết bị/ứng dụng mới.
Ghi chú: Có thể mất một giờ hoặc hơn để phản ánh bất kỳ thay đổi bảo mật nào
Bây giờ chúng ta có thể bắt đầu cài đặt PHPMailer:
Đăng nhập vào máy chủ của bạn
Tải xuống PHPMailer từ liên kết này về máy của bạn và tải nội dung của thư mục lên thư mục public trên máy chủ của bạn bằng FTP(S).
Tạo và chỉnh sửa tệp phpmailer.php
Sử dụng trình soạn thảo văn bản để tạo một tệp mới và đặt tên cho nó là phpmail.php. Sử dụng mã ví dụ từ ví dụ và thêm nó vào tệp PHP mà chúng ta vừa tạo. Chúng tôi muốn chỉ ra rằng chúng tôi phải thay đổi các giá trị theo tên miền và tên người dùng của mình.
Ghi chú: Gmail yêu cầu mã hóa TLS qua SMTP nên chúng tôi đặt mã hóa này cho phù hợp. Trước khi gửi qua SMTP, bạn cần tìm hiểu tên máy chủ, số cổng, loại mã hóa nếu được yêu cầu và nếu cần xác thực, bạn cũng cần có tên người dùng và mật khẩu. Lưu ý rằng việc bật xác thực hai yếu tố trên Gmail sẽ không cho phép bạn sử dụng SMTP của họ bằng tên người dùng/mật khẩu.
Ví dụ
<?php
// Import PHPMailer classes into the global namespace // These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './PHPMailer/src/Exception.php';
require './PHPMailer/src/PHPMailer.php';
require './PHPMailer/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@gmail.com";
$mail->Password = "your-gmail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('contact@visiontravelagent.com', 'Vision'); //This is the email your form sends From
$mail->addAddress('recipient@hagiangpro.com', 'Ha Giang'); // Add a recipient address
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Subject line goes here';
$mail->Body = 'Body text goes here';
$mail->send(); echo 'Message has been sent';
} catch (Exception $e) { echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
?>
SMTPDebug: Được sử dụng để hiển thị các thông báo liên quan đến các vấn đề về kết nối và gửi email. Nó có các giá trị sau:
-
- 0: Là giá trị mặc định. Tắt gỡ lỗi.
- 1: Hiển thị thông báo đầu ra được gửi bởi máy khách.
- 2: Là 1, cộng với hiển thị các phản hồi nhận được từ máy chủ.
- 3: Là 2, cùng với nhiều thông tin hơn về kết nối ban đầu – cấp độ này có thể giúp chẩn đoán lỗi STARTTLS.
- 4: Là 3, cộng thêm hiển thị thông tin ở cấp độ thấp hơn.
isSMTP(): Đặt trình gửi thư sử dụng SMTP.
isMail(): Đặt trình gửi thư sử dụng chức năng thư của PHP.
Host: Chỉ định máy chủ.
SMTPAuth: Bật/Tắt xác thực SMTP.
Username: Chỉ định tên người dùng.
Password: Chỉ định mật khẩu.
SMTPSecure: Chỉ định kỹ thuật mã hóa. Giá trị được chấp nhận 'tls' hoặc 'ssl'.
Port: Chỉ định cổng TCP sẽ được kết nối.
Lưu phpmailer.php và tải lên
Sau khi bạn đã tạo và thêm mã, bạn có thể tải tệp này lên bản đồ công khai của máy chủ của bạn (không phải vào thư mục PHPMailer đã có mà trong thư mục public.
Gửi email kiểm tra
Truy cập vào trình duyệt web của bạn https://”tên-miền-của-bạn”/phpmailer.php và nó sẽ thực thi mã và gửi email kiểm tra theo cấu hình trong tệp phpmail.php của bạn. Trong trường hợp có bất kỳ lỗi nào, bạn sẽ nhận được thông báo trên trang trong trình duyệt web. Bây giờ bạn có thể gửi email bằng PHPMailer
Gửi email HTML
Đi sâu vào tùy chỉnh email HTML trong PHP bằng cách xem bài viết chuyên dụng của chúng tôi .
Để gửi email HTML, chỉ cần đặt thuộc tính isHTML thành (true) , như trong ví dụ bên dưới:
Ví dụ
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './PHPMailer/src/SMTP.php';
require 'path/to/composer/vendor/autoload.php'; // Ensure the path is correct
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@gmail.com";
$mail->Password = "your-gmail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
// Sender and recipient settings
$mail->setFrom('info@hagiangpro.com', 'HGP');
$mail->addReplyTo('info@hagiangpro.com', 'HGP');
$mail->addAddress('recipient1@hagiangpro.com', 'Tim'); // Primary recipient
// CC and BCC
$mail->addCC('cc1@thuexehagiang.com', 'Elena');
$mail->addBCC('bcc1@thuexehagiang.com', 'Alex');
// Adding more BCC recipients
$mail->addBCC('bcc2@thuexehagiang.com', 'Anna');
$mail->addBCC('bcc3@thuexehagiang.com', 'Mark');
// Email content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = "PHPMailer SMTP test";
$mail->Body = '<h1>Send HTML Email using SMTP in PHP</h1><p>This is a test email I\'m sending using SMTP mail server with PHPMailer.</p>'; // Example HTML body
$mail->AltBody = 'This is the plain text version of the email content';
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>
Cách gửi email cho nhiều người nhận
Để gửi email đến nhiều người nhận, bạn có thể sử dụng đoạn mã sau:
Ví dụ
<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@gmail.com";
$mail->Password = "your-gmail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
$mail->SMTPKeepAlive = true; // add it to keep the SMTP connection open after each email sent
$mail->setFrom('list@example.com', 'List manager');
$mail->Subject = "New VZN mailing list";
$users = [
['email' => 'max@gmail.com', 'name' => 'Max'],
['email' => 'box@example.com', 'name' => 'Bob']
];
foreach ($users as $user) {
$mail->addAddress($user['email'], $user['name']);
$mail->Body = "<h2>Hello, {$user['name']}!</h2> <p>How are you?</p>";
$mail->AltBody = "Hello, {$user['name']}! \n How are you?";
try {
$mail->send();
echo "Message sent to: ({$user['email']}) {$mail->ErrorInfo}\n";
} catch (Exception $e) {
echo "Mailer Error ({$user['email']}) {$mail->ErrorInfo}\n";
}
$mail->clearAddresses();
}
$mail->smtpClose();
Gửi email có tệp đính kèm
Để gửi email có tệp đính kèm, bạn có thể:
Đính kèm tệp từ hệ thống tệp của bạn
Nếu bạn chọn tùy chọn này, hãy nhớ lưu các tệp của bạn trong cùng thư mục với tập lệnh.
Để đính kèm một tập tin, chỉ cần chỉ định đường dẫn tập tin của nó. Bạn cũng có thể thêm tên tệp, nhưng điều đó tùy thuộc vào bạn vì tập lệnh sẽ sử dụng tên thực của tệp:
Ví dụ
$mail->addAttachment('path/to/invoice1.pdf', 'invoice1.pdf');
Khi bạn gọi tập lệnh này, PHPMailer sẽ đính kèm tệp có tại path/to/invoice1.pdf vào email. Tham số thứ hai, voice1.pdf , là tùy chọn và chỉ định tên tệp. Trong ví dụ này, tôi đã sử dụng .pdf , nhưng hãy nhớ rằng bạn cũng có thể thêm các loại tệp khác, chẳng hạn như ảnh ( .jpg hoặc .png ).
Để thêm một tập tin khác, chỉ cần lặp lại lệnh:
Ví dụ
$mail->addAttachment('path/to/calculation1.xlsx', 'calculation1.xlsx');
Thêm tệp đính kèm chuỗi
Bằng cách thêm tệp đính kèm chuỗi, bạn đính kèm dữ liệu mà không cần phải lưu dữ liệu đó dưới dạng tệp vật lý trên hệ thống của mình. Trong bản dịch, dữ liệu bạn đính kèm được lưu trữ trong một biến. Ví dụ: điều này cho phép bạn trích xuất một tệp từ cơ sở dữ liệu, chẳng hạn như BLOB (Đối tượng lớn nhị phân) mà không cần lưu tệp đó dưới dạng tệp.
Đối với điều này, bạn có thể sử dụng lệnh sau:
Ví dụ
$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'db_data.db');
Ví dụ này thêm dữ liệu được lưu trữ dưới dạng BLOB từ cơ sở dữ liệu MySQL.
Bạn cũng có thể sử dụng URL từ xa, như sau:
Ví dụ
$mail->addStringAttachment(file_get_contents($url), 'myfile.pdf');
Gửi email có hình ảnh nhúng
Để gửi email có hình ảnh được nhúng, bạn có thể sử dụng tệp đính kèm CID :
Ví dụ
$mail->addEmbeddedImage('path/to/image_file.jpg', 'image_cid');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';
Và đây là ví dụ về điều đó trong một đoạn mã đầy đủ:
Ví dụ
<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer(true); // Enables exceptions
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@gmail.com";
$mail->Password = "your-gmail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
$mail->setFrom('from@example.com', 'First Last');
$mail->addReplyTo('towho@example.com', 'John Doe');
$mail->addAddress('recipient@example.com', 'Recipient Name'); // Specify the recipient
$mail->isHTML(true);
$mail->Subject = "PHPMailer SMTP test";
$mail->addEmbeddedImage('path/to/image_file.jpg', 'image_cid'); // Specify the path to your image and a CID
$mail->Body = '<img src="cid:image_cid"> Mail body in HTML'; // Use the CID as the src attribute in your img tag
$mail->AltBody = 'This is the plain text version of the email content';
if(!$mail->send()){
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
}else{
echo 'Message has been sent';
}
Gửi email không đồng bộ
Không giống như Node.js , hỗ trợ các hoạt động không đồng bộ, PHPMailer được thiết kế đồng bộ. Tuy nhiên, bạn có thể sử dụng hàm exec()
này để gọi tập lệnh PHP để gửi email ở chế độ nền.
Trước tiên, hãy cài đặt PHP CLI (Giao diện dòng lệnh - Command Line Interface) rồi sử dụng tập lệnh sendEmail.php sau :
Ví dụ
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'path/to/vendor/autoload.php'; // Adjust the path as needed
$mail = new PHPMailer(true);
// SMTP Configuration
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@gmail.com";
$mail->Password = "your-gmail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
// Email Settings
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('recipient@example.com', 'Recipient Name'); // Add a recipient
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
try {
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
Để chạy tập lệnh, sử dụng lệnh sau:
Ví dụ
exec("php /path/to/sendEmail.php > /dev/null &");
Ghi chú: Đảm bảo rằng đường dẫn đến tệp thực thi PHP CLI (php) được chỉ định chính xác.
Trong một số trường hợp và môi trường, bạn có thể phải sử dụng đường dẫn đầy đủ đến tệp nhị phân CLI (ví dụ: /usr/bin/php ).
Kiểm tra cấu hình PHP của máy chủ của bạn để đảm bảo các chức năng như exec()không bị tắt vì chúng thường có trong môi trường lưu trữ dùng chung vì lý do bảo mật.
Lệnh kiểm soát điều này là disable_functions lệnh trong php.ini.
Mẹo: Có thể tham khảo bài Quản lý Crontab (Cron Job) bằng PHP để lên kế hoạch gửi email
PHPMailer với Microsoft 365
Trong ví dụ này, chúng tôi sẽ hướng dẫn bạn cách sử dụng PHPMailer để gửi e-mail bằng Microsoft 365.
Để có thể gửi email qua địa chỉ email Microsoft 365, trước tiên bạn cần bật xác thực SMTP cho địa chỉ email đó trong trung tâm quản trị Microsoft 365 của mình. Nếu không, Microsoft 365 sẽ chặn các yêu cầu tới máy chủ SMTP.
Để bắt đầu, hãy mở tab Người dùng hiện hoạt trong trung tâm quản trị Microsoft 365 của bạn. Bạn có thể nhấp vào đây để mở trang bên phải hoặc mở rộng biểu tượng bánh hamburger ở góc trên bên trái của trung tâm quản trị và đi tới Người dùng > Người dùng đang hoạt động (Users > Active users) .
Sau đó, nhấp vào tài khoản email mà bạn muốn sử dụng để gửi email cho trang WordPress của mình. Điều này sẽ mở rộng một trang trình bày với nhiều tùy chọn hơn.
Trong trang trượt ra, hãy chuyển đến tab Thư . Sau đó, nhấp vào tùy chọn Quản lý ứng dụng email . Tiếp theo hãy chọn tùy chọn Authenticated SMTP và nhấp vào nút Lưu thay đổi .
Tải xuống thư mục PhpMailer và tải nội dung của nó lên máy chủ
Một lần nữa hãy đảm bảo bạn tải xuống gói PHPMailer và tải nó lên thư mục công cộng trên máy chủ của bạn.
Tạo tệp phpmailer.php và thêm mã
Tạo tệp phpmailer.php thêm các dòng mã sau, lưu và tải nó lên thư mục chung bằng ứng dụng khách FTP.
Ví dụ
<?php
// Import PHPMailer classes into the global namespace // These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './PHPMailer/src/Exception.php';
require './PHPMailer/src/PHPMailer.php';
require './PHPMailer/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.office365.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "your-email@office.com";
$mail->Password = "your-mail-password";
$mail->SMTPSecure = 'tls'; // Enable SSL encryption, TLS also accepted with port 465
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('contact@example.com', 'Mailer'); //This is the email your form sends From
$mail->addAddress('recipient@emailaddressreciver.com', 'Joe User'); // Add a recipient address
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Subject line goes here';
$mail->Body = 'Body text goes here';
$mail->send(); echo 'Message has been sent';
} catch (Exception $e) { echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
?>
Gửi email kiểm tra
Trong bước này, việc truy cập vào trình duyệt web của bạn https://”tên-miền-của-bạn”/phpmailer.php sẽ thực thi mã và gửi email kiểm tra theo cấu hình trong tệp phpmail.php của bạn. Giả sử rằng không có vấn đề gì ở đây, nó sẽ hiển thị trong trạng thái thông báo gỡ lỗi “Tin nhắn đã được gửi”. Bây giờ bạn có thể gửi email bằng PHPMailer.
Kết luận
Trong hướng dẫn này, chúng tôi đã xem xét các trường hợp sử dụng PHPMailer phổ biến nhất và cách định cấu hình chính xác mã để hoạt động với các SMTP khác nhau. Bây giờ bạn có thể gửi email bằng PHPMailer. Nếu bạn cần các ví dụ cụ thể hơn, hãy tham khảo thư mục “examples” bên trong kho lưu trữ PHPMailer .