GIT – Bài viết hướng dẫn các bạn sủ dụng PHPMailer để thay cho hàm mail() chuyên dùng để gửi email trên ngôn ngữ . Nguyên nhân không sử dùng hàm mail() đó 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). “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.

<!--?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

// Trình bày lá thư
$mail->AddAddress("email@example.com");
$mail->Subject = "Thử nghiệm";
$mail->Body = "Một lá thư được gửi bằng PHPMailer.";

// gửi nó đi
if(!$mail->Send())
{
// lỗi
echo "Lỗi: " . $mail->ErrorInfo;;
}
else
{
// Gửi thành công
echo "Đã gửi";
}
?>

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.

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:

$mail->AddReplyTo("replies@example.com", "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:

// thêm địa chỉ người nhận
$mail->AddAddress("mail1@domain.com", "Tên của người nhận");

// thêm CC
$mail->AddCC("mail1@domain.com", "Tên của người nhận");

// thêm BCC
$mail->AddBCC("mail1@domain.com", "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ư:

// Mã ASCII cho các ngôn ngữ latin nhưng English
$mail->CharSet="windows-1251";

// Để hiển thị tốt tiếng việt, ta nên dùng Unicode
$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:

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

Tham số 

  1. Tham số đầu tiên là địa chỉ đến file đó trên host dùng để upload lên.
  2. 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:

$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ư:

<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:

<?php

// Thiết lập SMTP Server
require("class.phpmailer.php"); // nạp thư viện
$mailer = new PHPMailer(); // khởi tạo đối tượng
$mailer->IsSMTP(); // gọi class smtp để đăng nhập
$mailer->CharSet="utf-8"; // bảng mã unicode
$mailer->Host ='localhost'; // địa chỉ server smtp

// Đăng nhập SMTP
$mailer->SMTPAuth = true; // gửi thông tin đăng nhập
$mailer->Username = 'info@minhnhut.info'; // tên đăng nhập
$mailer->Password = 'talacuopday'; // mật khẩu

// Chuẩn bị gửi thư nào
$mailer->FromName = 'Minh Nhựt'; // tên người gửi
$mailer->From = 'info@minhnhut.info'; // mail người gửi
$mailer->AddAddress('abc@gmail.com','Recipient Name'); //thêm mail người nhận
$mailer->Subject = 'Xin chào!';
$mailer->IsHTML(true); //Bật HTML không thích thì false

// Đính kèm thêm file, không đính thì bỏ qua
$mailer->AddAttachment('blog/file.zip', 'file.zip'); // attach ảnh vào, file này nằm trên host

// Nhúng ảnh để hiển thị trong email bằng CSS hay HTML
$mailer->AddEmbeddedImage('images/hinh.jpg', 'logoimg', 'hinh.jpg'); //đính kèm và nhúng ảnh vào email

// Nội dung lá thư
$mailer->Body = "<h1>Một lá thư gửi bằng PHPMailer</h1>
<p>Đây là hình ta mới nhúng lúc nảy: <img src=\"cid:logoimg\" /></p>";

// Gửi email

if(!$mailer->Send())
{
// Gửi không được, đưa ra thông báo lỗi

echo "Không gửi được";
echo "Lỗi: " . $mailer->ErrorInfo;
}
else
{

// Gửi thành công
echo "Gửi thư thành công";

}

?>

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.

$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ố:

$mailer->SMTPSecure = "ssl"; // Giao thức SSL
$mailer->Host = "smtp.gmail.com"; // SMTP của GMAIL
$mailer->Port = 465; // cổng SMTP
$mailer->Username = "me@gmail.com"; // GMAIL username
$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à ), để 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.

Nguồn : minhnhat.info

Print Friendly

Comments

comments

Bài viết liên quan