Gửi email - thư viện phpmailer


tự học php nâng cao 10/08/2015 Cùng chuyên mục

Với hàm mail() - việc gửi thư điện tử (email) thật dễ dàng - tuy nhiên, dễ bị tình trạng liệt kê là email spam nên một số hosting khóa hàm này. Khắc phục bằng cách gửi email bằng phương thức smtp sử dụng thư viện phpmailer, máy chủ gmail.

Giới thiệu:

Khi làm việc với internet, thư điện tử (email) nắm một vai trò quan trọng, nó giúp cho việc giao tiếp giữa các cá nhân tổ chức một cách thuận tiện-dễ dàng:
- Chỉ cần biết được địa chỉ email người nhận
- Chi phí thấp (gần như là miễn phí)
- không cách trở địa lý
- các dịch vụ email miễn phí nhưng có nhiều tính năng mạnh mẽ như gmail - yahoo ... có đông đảo người dùng.

Lập trình web bằng php - bạn sẽ sử dụng tính năng gửi email cho một số công việc thường gặp như:

  • Gửi email xác nhận đăng ký thành viên
  • Gửi email marketing các chương trình khuyến mãi, quảng cáo, thông báo
  • Gửi hóa đơn xác nhận - thông báo đặt hàng
  •  ...

GỬI EMAIL BẰNG HÀM mail():

Cú pháp:
bool mail(string $to, $string $subject, string $message, [, string $additional_headers [, string $additional_parameters ]])

Trong đó:

  • $to:địa chỉ email của người nhận
  • $subject: tiêu đề thư
  • $message: nội dung thư gửi đi (có thể là chỉ là văn bản hoặc mã html)
  • (tùy chọn) $additional_headers: các thông tin khác như From, Cc,  Bcc
  • (tùy chọn): $additional_parameters: lệnh gửi mail 

Lưu ý: các thông tin như From, Cc, Bcc không bắt buộc phải chính xác - tham khảo hàm imap_mail(): các thông tin From, Cc, Bcc: bắt buộc phải chính xác

Ví dụ 1: Gửi email bằng hàm mail() trong php

<?php
$to = 'myemail@example.com';
$subject = 'Tiêu đề thư';
$message = 'Xin chào! tôi là thanh';
$headers = 'From: thanh@example.com' . "\r\n" .
'Reply-To: ha@example.com' . "\r\n" .'X-Mailer: PHP/' .phpversion();
mail($to, $subject, $message, $headers);
?>

Ví dụ 2: Gửi email với nội dung là mã html

<?php
// nhiều người nhận
$to  = 'ha@example.com' . ', ';
$to .= 'luu@example.com';
// subject
$subject = 'Chúc mừng sinh nhật!';
// message
$message = 'Sinh nhật vui vẻ - nhiều thành công và may mắn ^_^';
// Để gửi HTML mail, thiết lập Content-type header 
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
// Thông tin thêm vào phần tiêu đề thư
$headers .= 'To: Hai <hai@example.com>, Sinh <kelly@example.com>' . "\r\n";
$headers .= 'From: Lời chúc mừng sinh nhật từ <thanh@example.com>' . "\r\n";
$headers .= 'Cc: linh@example.com' . "\r\n";
$headers .= 'Bcc: hong@example.com' . "\r\n";
// gửi thư
mail($to, $subject, $message, $headers);
?>

Gửi email bằng thư viện phpmailer ( class phpmailer)

Thư viện phpmailer(), rất nổi tiếng trong việc gửi email. Hỗ trợ đa dạng các giao thức gửi thư smtp, imap, pop3. Khi thư được gửi bằng giao thức smtp, sử dụng thư viện phpmailer - khả năng thư ấy được gửi vào inbox(hộp thư đến), rất cao - như đã nói ở trên, tuy thuận tiện nhưng thư gửi bằng hàm mail() dễ bị liệt kê là thư spam - tỉ lệ thành công không cao.

Để gửi được thư bằng giao thức smpt, bạn có 1 tài khoản trên một máy chủ email hỗ trợ giao thức smtp, theo đó sẽ bao gồm các thông tin:

  • smtp server: tên máy chủ email
  • username: tên đăng nhập, cũng là địa chỉ email
  • password: mật khẩu đăng nhập
  • port: cổng kết nối, thường là 587 (phương thức mã hóa tls) hoặc 465 (phương thức mã hóa ssl)

Gmail - là dịch vụ máy chủ email của google, rất phổ biến, cho phép gửi thư bằng các ứng dụng bên ngoài bằng cả 3 giao thức: smtp, pop3, imap. Để sử dụng phpmailer gửi thư, bạn làm 2 việc sau:

- Thứ 1: Cho phép gửi thư bằng phương thức pop3, imap: vào Tùy chỉnh => Cài đặt => imap/pop3 => bật tính năng imap, pop3.
- Thứ 2: Cho phép kết nối từ thiết bị thiếu an toàn:  https://www.google.com/settings/security/lesssecureapps 
- Thứ 3: Cần bật extention openssl


Thông thường web hosting có hỗ trợ email nhưng khi sử dụng dễ bị liệt kê vào danh sách spam [các website nằm chung một máy chủ - chỉ cần một website sử dụng email bị liệt vào danh sách spam thì cả server đều bị ảnh hưởng] - do đặc điểm này Gmail dùng ở dạng miễn phí là một giải pháp dễ dàng và rẻ để giải quyết tình trạng này. Hoặc bạn cũng có thể thuê 1 email server, sử dụng Gmail dạng doanh nghiệp, ...

Các bước cấu hình như ở trên có thể tại máy bạn làm việc - với XAMPP, ... có thể gửi được mail nhưng khi sử dụng cài đặt trên máy chủ có thể bị thông báo lỗi - sai mật khẩu. Google sẽ báo rằng email đã được đăng nhập bằng 1 thiết bị không xác định. Để có thể gửi được email trên hosting bạn cần bật cấu hình trong cpanel:

Cài đặt xác thực email server trên hosting bằng cpanel
Bước 1: Chọn Email Authentication trong Cpanel
Cài đặt xác thực email server trên hosting bằng cpanel - bật DKIM, SPF
Bước 2: Bạn cần bật tùy chỉnh DKIM và SPF

sau khi thực hiện 2 bước trên bạn có thể gửi email trên hosting mà không bị báo lỗi "sai mật khẩu" (mặc dù đã cài đặt gmail và điền chính xác thông tin).

PHPMAILER

phpmailer không phải là thư viện được hỗ trợ mặc định của PHP cho nên bạn cần tải về và cài đặt như một "thư viện lớp thứ 3". Nhưng nó không phải là một extension - cho nên việc sử dụng để cài đặt trên hosting không khó khăn như extension - chỉ cần copy vào thư mục chạy website và cấu hình là được. Link chính thức của thư viện này: https://github.com/PHPMailer/PHPMailer . Sau khi tai file nén về, bạn cần giải nén và có thể đặt thư mục cho dễ nhớ như là php-mailer. Công việc tiếp theo là tải class này vào code, thêm các thông tin như username, password,...phpmailer sẽ tạo 1 socket (kết nối) tới máy chủ smtp, gửi đi các thông tin đó. Dưới đây là một đoạn code căn bản - gửi email với máy chủ gmail sử dụng thư viện phpmailer bằng phương thức smtp:

Ví dụ 3: Gửi email - sử dụng gmail bằng thư viện phpmailer

<?php
//nên để ở 1 thư mục riêng tách biệt với code cho sáng sủa, dể quản lý
require 'php-mailer/PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Bật tính năng gỡ lỗi 
$mail->isSMTP(); // đặt phương thức gửi thư là smtp
$mail->Host = 'smtp.gmail.com'; //địa chỉ tên miền server smtp
$mail->SMTPAuth = true; // Bật tính năng xác thức SMTP
$mail->Username = 'user@example.com'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // cổng kết nối tới máy chủ smtp, 587 hoặc 465
//để email vào được inbox-trong mục đích test bạn đặt email trùng với email của mình
$mail->From = 'user@example.com'; //địa chỉ email người gửi
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User'); //địa chỉ người nhận
$mail->addAddress('ellen@example.com'); // địa chỉ người nhận khác - tùy chọn
$mail->addReplyTo('info@example.com', 'Information'); 
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');
$mail->addAttachment('/var/tmp/file.tar.gz'); // Thêm file đính kém
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // thêm file đính kèm khác, tùy chọn
$mail->isHTML(true); // đặt là true - định dạng email gửi đi làm html
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body in bold!';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->send()) {
echo 'Không thể gửi thư'; 
echo 'Mailer Error (lỗi): ' . $mail->ErrorInfo;} 
else {
echo 'Thư đã được gửi đi';
}
;>

TỔNG KẾT

Bài này giới thiệu cách thức gửi email trong php bằng hàm mail() sẵn có và cả thư viện biên ngoài là phpmailer(). Bạn cần lưu ý đến số lượng email gửi trên ngày ( với gmail nên dưới 300, địa chỉ email người nhận trong 1 thư gửi đi không nên quá 20, mỗi lần gửi cách nhau 30s ). Với hosting thì khoảng dưới 300 email trên một giờ và một ngày không quá 2000 - 3000 email, nếu gửi càng nhiều email trong 1 ngày thì càng dễ bị liệt vào danh sách đen (spam list). Trong trường hợp bạn cần gửi nhiều, bạn sẽ cần phải thuê dịch vụ máy chủ email ( email server ).



Bài liên quan:



Bình luận:


php