Gửi eMail từ PHP thông qua SMTP với PHPMailer

Trở lại với chủ đề gửi Mail với PHP. Trong một bài viết gần đây mình từng giới thiệu đến hàm mail() chuyên dùng để gửi email trên ngôn ngữ PHP. Nhưng một vấn để tồn tại song song đó là không phải host nào cũng bật hàm này. Vì các lí do chính:

  • Tốn bộ nhớ, nếu webmaster gửi mail theo một danh sách dài. Vì hàm mail() cho phép gửi tới nhiều địa chỉ cùng lúc, và không phải hệ thống nào cũng có khả năng cung ứng đủ.
  • Webmaster gửi nhiều tin rác, thế là ip gửi email này (tức ip của host) bị cho black list (ví dụ như của Gmail). Èo, “một con sâu làm sầu cả Server”. Toàn bộ mail gửi từ server này đều bị dán mác là SPAM.
  • Và vô vàn điều bất lợi khác.

Khi đó, giải pháp chữa lửa khi không có hàm mail() bên ta đó là gửi email thông qua một máy chủ khác (máy chủ SMTP). Đấy chính là lí do vì sao trong bài viết này ta sẽ nghiên cứu về class PHPMailer. Một class chuyên dụng để gửi email qua SMTP và hoàn toàn không cần host phải mở hàm Mail().

Tải PHPMailer

Toàn bộ thư viện này có thể tải tại:

Sử dụng PHPMailer cơ bản

Sử dụng PHPMailer cơ bản.

1 <!--?php require("class.phpmailer.php"); // nạp thư viện $mail = new PHPMailer(); // khởi tạo đối tượng $mail-?-->IsMail(); // gửi bằng hàm mail() mặc định
2
3 // Trình bày lá thư
4 $mail->AddAddress("[email protected]");
5 $mail->Subject = "Thử nghiệm";
6 $mail->Body = "Một lá thư được gửi bằng PHPMailer.";
7
8 // gửi nó đi
9 if(!$mail->Send())
10 {
11 // lỗi
12 echo "Lỗi: " $mail->ErrorInfo;;
13 }
14 else
15 {
16 // Gửi thành công
17 echo "Đã gửi";
18 }
19 ?>

Hàm $mail->IsMail(); cho PHPMailer biết rằng ta muốn gửi bằng hàm Mail() mặc định của PHP. Hãy xem qua bài viết về hàm Mail() nếu bạn chưa biết:

Mail Function – Gửi mail tiện lợi với PHP

Ngoài gửi IsMail còn một số cách thức khác để bạn lựa chọn.

  • IsSendmail – qua lệnh sendmail của Linux. Bạn phải có quyền hạn nhất định mới gửi được email theo cách này
  • IsQmail – gửi trực tiếp qua qMail MTA của Linux. Bạn phải có quyền hạn nhất định mới gửi được email theo cách này
  • IsSMTP – qua SMTP server. Bạn cần khai báo địa chỉ, cổng, tên đăng nhập và mật khẩu cho SMTP server. (ta sẽ nghiên cứu trong bài này đây)

Thêm địa người nhận trả lời

Thiết lập Reply-to hay địa chỉ người nhận trả lời thư cho email. Thêm một dòng duy nhất:

1 $mail->AddReplyTo("[email protected]""Trả lời");

Gửi email cho nhiều người

Muốn gửi cho bấy nhiêu người, bạn cứ add email người nhận bấy nhiêu lần bằng các lệnh:

1 // thêm địa chỉ người nhận
2 $mail->AddAddress("[email protected]""Tên của người nhận");
3
4 // thêm CC
5 $mail->AddCC("[email protected]""Tên của người nhận");
6
7 // thêm BCC
8 $mail->AddBCC("[email protected]""Tên của người nhận");

Tùy chỉnh ngôn ngữ

Dùng lệnh sau để chỉnh bảng mã cho phù hợp với ngôn ngữ được dùng trong lá thư:

1 // Mã ASCII cho các ngôn ngữ latin nhưng English
2 $mail->CharSet="windows-1251";
3
4 // Để hiển thị tốt tiếng việt, ta nên dùng Unicode
5 $mail->CharSet="utf-8";

Đính kèm tệp tin

Nói một chút về đính kèm tệp tin. Để đính kèm một tệp tin ta dùng lệnh:

1 $mailer->AddAttachment('/home/mywebsite/public_html/file.zip''file.zip');

Tham số

  • Tham số đầu tiên là địa chỉ đến file đó trên host dùng để upload lên.
  • Tham số thứ 2 là tên của nó trong lá thư, người nhận thư sẽ thấy tên này.


Nhúng ảnh

Mục đích của nhúng ảnh là để hiển thị ảnh này trong lá thư (HTML). Trước khi nhúng ảnh thì phải đính kèm ảnh này vào trước, xem ở trên nhé. Câu lệnh để nhúng ảnh:

1 $mailer->AddEmbeddedImage('images/logo.jpg''logoimg''logo.jpg');

Tham số

  1. Tham số đầu tiên, là đường dẫn đến file ảnh trên host của ta.
  2. Tên cho file ảnh này, tên này dùng để gọi hoặc thao tác với ảnh trong phần nội dung lá thư ví dụ như lấy link của ảnh chẳng hạn.
  3. Tên cho file ảnh này trong mục đính kèm. Khi đính kèm tất cả file đều được đặt tên, và đây là nơi để bạn đặt tên cho tấm ảnh mới nhúng.

Lấy link của ảnh

Để lấy link của ảnh bạn chỉ cần chèn đoạn shortcode theo dạng:

cid:tenanh

Với tenanh là tên bạn đã đặt cho file ảnh (tham số thứ 2 trong lệnh nhúng ảnh ở trên). Ví dụ như ở trên mình có file logo.jpg và mình đã đặt tên cho nó là logoimg. Vậy link đến file ảnh sẽ được thay thế cho:

cid:logoimg

Lợi dụng điều này ta dễ dàng chèn ảnh bằng thẻ img của HTML vào nội dung lá thư:

1 <img src="cid:logoimg" />

Gửi một Email bằng SMTP

Nhận vật chính đây. Dựa vào những kiến thức cơ bản về PHPMailer ở trên, ta có thể viết một vài dòng để gửi mail qua SMTP với PHPMailer như sau:

1 <?php
2
3 // Thiết lập SMTP Server
4 require("class.phpmailer.php"); // nạp thư viện
5 $mailer new PHPMailer(); // khởi tạo đối tượng
6 $mailer->IsSMTP(); // gọi class smtp để đăng nhập
7 $mailer->CharSet="utf-8"// bảng mã unicode
8 $mailer->Host ='localhost'// địa chỉ server smtp
9
10 // Đăng nhập SMTP
11 $mailer->SMTPAuth = true; // gửi thông tin đăng nhập
12 $mailer->Username = '[email protected]'// tên đăng nhập
13 $mailer->Password = 'talacuopday'// mật khẩu
14
15 // Chuẩn bị gửi thư nào
16 $mailer->FromName = 'Minh Nhựt'// tên người gửi
17 $mailer->From = '[email protected]'// mail người gửi
18 $mailer->AddAddress('[email protected]','Recipient Name'); //thêm mail người nhận
19 $mailer->Subject = 'Xin chào!';
20 $mailer->IsHTML(true); //Bật HTML không thích thì false
21
22 // Đính kèm thêm file, không đính thì bỏ qua
23 $mailer->AddAttachment('blog/file.zip''file.zip'); // attach ảnh vào, file này nằm trên host
24
25 // Nhúng ảnh để hiển thị trong email bằng CSS hay HTML
26 $mailer->AddEmbeddedImage('images/hinh.jpg''logoimg''hinh.jpg'); //đính kèm và nhúng ảnh vào email
27
28 // Nội dung lá thư
29 $mailer->Body = "<h1>Một lá thư gửi bằng PHPMailer</h1>
30 <p>Đây là hình ta mới nhúng lúc nảy: <img src=\"cid:logoimg\" /></p>";
31
32 // Gửi email
33
34 if(!$mailer->Send())
35 {
36 // Gửi không được, đưa ra thông báo lỗi
37
38 echo "Không gửi được";
39 echo "Lỗi: " $mailer->ErrorInfo;
40 }
41 else
42 {
43
44 // Gửi thành công
45 echo "Gửi thư thành công";
46
47 }
48
49 ?>

Tất cả đều được chú thích rõ ràng, chắc sẽ không quá khó hiểu đâu nhỉ. Chú ý, nếu bạn không thích gửi mail định dạng HTML thì có thể tắt HTML đi.

1 $mailer->IsHTML(false);

Vì không phải hộp thư nào cũng nhận dạng được tốt HTML. Nên tắt nó đi có thể sẽ làm người nhận cảm thấy dễ chịu hơn.

Sử dụng SMTP server của Google

Trong ví dụ ở trên, ta lấy máy chủ SMTP là localhost. Tức dùng trực tiép máy chủ SMTP của host đang dùng. Nếu host không có SMTP server thì bạn có thể dùng ké của anh GMail, và chỉ cần chỉnh sửa lại một vài thông số:

1 $mailer->SMTPSecure = "ssl"// Giao thức SSL
2 $mailer->Host = "smtp.gmail.com"// SMTP của GMAIL
3 $mailer->Port = 465; // cổng SMTP
4 $mailer->Username = "[email protected]"// GMAIL username
5 $mailer->Password = "password"// GMAIL password

Phải có tài khoản GMail để thực hiện thủ đoạn này nhé. Phần From bạn có thể để email gì tùy mục đích. Không nhất thiết phải là địa chỉ gmail đang dùng. Tham khảo demo cuối bài.

Khi gửi bằng SMTP của Gmail, email của bạn sẽ có chữ ký điện tử do GMail ký, với chữ ký này sẽ hạn chế được tình trạng bay vào hộp SPAM của người nhận. Song song với điều, người nhận có thể biết bạn đã gửi email bằng gmail thông qua chữ ký này.

Mẹo nhỏ
Bạn có thể viết tất cả chúng nó thành một hàm giốg như mail() vậy nhưng xịn hơn (dùng PHPMailer mà :giggle: ), để mỗi lần gửi email khổi mắc công phải viết bấy nhiêu dòng lệnh.

Trong thư viện hữu ích này ngoài SMTP còn bao gồm một giao thức khác để gửi email đó là POP. Tuy nhiên trong phạm vi bài này mình xin không đề cập đến. Có thể chúng ta sẽ tìm hiểu nó trong một bài khác trong tương lại, thân chào các bạn.

Demo

Demo gửi EMail với PHPMailer bằng SMTP của Gmail

Mọi thắc mắc, khiếu nại, tố cáo, … xin để lại comment :skull:

 Nguồn : MinhNhut.Info

 

Tags: , , , , , , , , , ,
Subscribe to Comments RSS Feed in this post

2 Responses

  1. Pingback: Minh Nhựt

Leave a Reply

Your email address will not be published. Required fields are marked *

*
*