https://www.youtube.com/watch?v=MCtt5ZTc41E
Bạn có một website bán hàng online bạn muốn nhận được thông báo khi có đơn hàng mới? Bạn là chủ một blog đang được nhiều người quan tâm và người ta muốn nhận thông báo từ bạn mỗi khi có bài viết mới thông qua email? Hay đơn giản là bạn muốn nhận được mail thông báo từ form liên hệ. Bạn có thể sử dụng hàm mail mặc định của PHP để làm điều này nhưng thường hay bị lỗi, và trong bài ngày hôm này mình muốn giới thiệu tới các bạn cách gửi mail trong php bằng cách sử dụng PHPMailer. Có thể nói đây là một trong những thư viện cơ bản nhưng không hẳn là ai cũng biết đến nó và bài này mình muốn giới thiệu đến các bạn đang gặp khó khăn trong vấn đề gửi mail trong php nên các bạn chém tay ạ.
Nội dung chính
1.Tại sao phải dùng PHPMailer?
Mặc dù trong php đã có sẵn hàm gửi mail rồi nhưng thường thì khi mail sẽ rất khó khăn phát nổ phát xịt, mail của bạn có thể nằm trong mục spam hoặc sever của bạn đã bị chặn hàm gửi mail. Lúc này bạn sẽ cần phải nghĩ đến một giải pháp thay thế đó là sử dụng một thư viện hỗ trợ việc gửi mail. Và ở đây tôi chọn PHPMailer để làm việc này. Ngoài ra còn có pear mail nhưng ít phổ biến hơn và mình cũng chưa dùng nó bao giờ các bạn có thể tìm hiểu thêm và cho ý kiến.
Các tính năng của PHPMailer
- Gửi mail thông qua giao thức SMTP.
- Có thể dễ dàng dùng địa chỉ email cá nhân hoặc email công ty của bạn để gửi đi làm tăng độ uy tín cho mail.
- Gửi mail nhanh ít lỗi mail được chuyển vào thằng vào inbox.
- Có thể thêm cc,bcc, đính kèm file.
- Có thể tương tác hai chiều tức là khi khách hàng rep mail bạn sẽ nhận được mail trong hộp thư đến của bạn.
Và còn nhiều hơn thế nữa nếu bạn chưa biết đến nó hãy dùng đi và cảm nhận.
2. Hướng dẫn sử dụng PHPMailer version 6x
Trước tiên bạn cần download thư viện PHPMailer 6.05 tại đây.
Import thư viện
Bạn thực hiện import thư viện vào như sau, nhớ thay đổi đường dẫn tới mã nguồn mà bạn đã lưu nhé, và phải đặt đoạn code này ở trên cùng của file.
include APPPATH . "../storage/PHPMailer-master/src/PHPMailer.php"; include APPPATH . "../storage/PHPMailer-master/src/Exception.php"; include APPPATH . "../storage/PHPMailer-master/src/OAuth.php"; include APPPATH . "../storage/PHPMailer-master/src/POP3.php"; include APPPATH . "../storage/PHPMailer-master/src/SMTP.php"; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception;
Thự hiện gửi mail
$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 = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = '[email protected]'; // SMTP username $mail->Password = 'secret'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 587; // TCP port to connect to //Recipients $mail->setFrom('[email protected]', 'Mailer'); $mail->addAddress('[email protected]', 'Joe User'); // Add a recipient $mail->addAddress('[email protected]'); // Name is optional $mail->addReplyTo('[email protected]', 'Information'); $mail->addCC('[email protected]'); $mail->addBCC('[email protected]'); //Attachments $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name //Content $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'; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo; }
Chi tiết bạn nên xem video để hiểu rõ hơn.
3. Hướng dẫn sử dụng PHPMailer Version 5x
Trước tiên muốn sử dụng được bạn cần phải tải code của nó về đã. Bạn có thể tải nó về tại đây.
Sau khi tải về bạn giải nén nó ra bạn sẽ nhận được một số file nhưng bạn chỉ cần sử dụng hai file đó là class.smtp.php
và class.phpmailer.php
còn những file khác bạn có thể tìm hiểu thêm trong đó có một số mẫu ví dụng cũng hay lắm đó. Bây giờ bạn hãy coppy file đó qua dự án của mình.
Sau khi đã có 2 file trên chúng ta cùng tạo 1 file có tên sendmail.php
tất nhiên bạn đặt tền gì cũng được.
Và nội dung của file như sau.
<?php
//goi thu vien
include('class.smtp.php');
include "class.phpmailer.php";
$nFrom = "Freetuts.net"; //mail duoc gui tu dau, thuong de ten cong ty ban
$mFrom = '[email protected]'; //dia chi email cua ban
$mPass = 'passlamatkhau'; //mat khau email cua ban
$nTo = 'Huudepzai'; //Ten nguoi nhan
$mTo = '[email protected]'; //dia chi nhan mail
$mail = new PHPMailer();
$body = 'Bạn đang tìm hiểu về cách gửi email bằng php mailler trên freetuts.net chúc các bạn có những phút giây vui vẻ.'; // Noi dung email
$title = 'Hướng dẫn gửi mail bằng PHPMailer'; //Tieu de gui mail
$mail->IsSMTP();
$mail->CharSet = "utf-8";
$mail->SMTPDebug = 0; // enables SMTP debug information (for testing)
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->SMTPSecure = "ssl"; // sets the prefix to the servier
$mail->Host = "smtp.gmail.com"; // sever gui mail.
$mail->Port = 465; // cong gui mail de nguyen
// xong phan cau hinh bat dau phan gui mail
$mail->Username = $mFrom; // khai bao dia chi email
$mail->Password = $mPass; // khai bao mat khau
$mail->SetFrom($mFrom, $nFrom);
$mail->AddReplyTo('[email protected]', 'Freetuts.net'); //khi nguoi dung phan hoi se duoc gui den email nay
$mail->Subject = $title;// tieu de email
$mail->MsgHTML($body);// noi dung chinh cua mail se nam o day.
$mail->AddAddress($mTo, $nTo);
// thuc thi lenh gui mail
if(!$mail->Send()) {
echo 'Co loi!';
} else {
echo 'mail của bạn đã được gửi đi hãy kiếm tra hộp thư đến để xem kết quả. ';
}
?>
Chỉ đơn giản thế thôi, rất nhàn phải không nào, bạn thử chạy file sendmail.php
và mở hộp thư đến ra kiêm tra xem có nhận được mail không nhé.
Hướng dẫn tạo hàm để gửi mail với PHPMailer
Như ở phần trên bạn đã gửi email thành công nhưng giả sử trên trang web của bạn bạn muốn gửi mail ở nhiều chỗ, ví dụ khi khách hàng liên hệ bạn cần gửi mail đến quản trị viên để thông báo. Khi có đơn hàng mới bạn cần gửi mail xác nhận đơn hàng và thông báo tới quản trị viên. Không lẽ bạn cứ phải ôm theo một mớ code như thế ném ở mọi file rõ ràng là không gọn gàn chút nào phải không nào. Và ở phần này mình sẽ hướng dẫn các bạn để cho chúng vào một hàm và trong hàm này hơi khác phần trên một chút là mình có bổ sung thêm tính năng thêm địa chỉ cc. Thực tế thì dựa vào phần trên bạn hoàn toàn có thể tự tạo hàm cho riêng mình nhưng ở đây mình tạo mẫu cho các bạn chưa rành lắm về hàm có thể áp dụng.Bạn hãy tạo một file functions.php để viết các hàm vào đấy. Và ở đoạn code sau tôi có tạo sẵn hai hàm một là hàm sendMail để gửi mail bình thường không có file đính kèm và hai là hàm sendMailAttachment
để gửi mail có kèm theo file đính kèm. Tất nhiên bạn có thể gộp chúng thành một hàm cũng được nhưng mình muốn tách làm hai hàm riêng biệt để cho rõ ràng. Nội dung file functions.php như sau.
<?php function sendMail($title, $content, $nTo, $mTo,$diachicc=''){ $nFrom = 'Freetuts.net'; $mFrom = '[email protected]'; //dia chi email cua ban $mPass = 'passlamatkhau'; //mat khau email cua ban $mail = new PHPMailer(); $body = $content; $mail->IsSMTP(); $mail->CharSet = "utf-8"; $mail->SMTPDebug = 0; // enables SMTP debug information (for testing) $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier $mail->Host = "smtp.gmail.com"; $mail->Port = 465; $mail->Username = $mFrom; // GMAIL username $mail->Password = $mPass; // GMAIL password $mail->SetFrom($mFrom, $nFrom); //chuyen chuoi thanh mang $ccmail = explode(',', $diachicc); $ccmail = array_filter($ccmail); if(!empty($ccmail)){ foreach ($ccmail as $k => $v) { $mail->AddCC($v); } } $mail->Subject = $title; $mail->MsgHTML($body); $address = $mTo; $mail->AddAddress($address, $nTo); $mail->AddReplyTo('[email protected]', 'Freetuts.net'); if(!$mail->Send()) { return 0; } else { return 1; } } function sendMailAttachment($title, $content, $nTo, $mTo,$diachicc='',$file,$filename){ $nFrom = 'Freetuts.net'; $mFrom = '[email protected]'; //dia chi email cua ban $mPass = 'passlamatkhua'; //mat khau email cua ban $mail = new PHPMailer(); $body = $content; $mail->IsSMTP(); $mail->CharSet = "utf-8"; $mail->SMTPDebug = 0; // enables SMTP debug information (for testing) $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier $mail->Host = "smtp.gmail.com"; $mail->Port = 465; $mail->Username = $mFrom; // GMAIL username $mail->Password = $mPass; // GMAIL password $mail->SetFrom($mFrom, $nFrom); //chuyen chuoi thanh mang $ccmail = explode(',', $diachicc); $ccmail = array_filter($ccmail); if(!empty($ccmail)){ foreach ($ccmail as $k => $v) { $mail->AddCC($v); } } $mail->Subject = $title; $mail->MsgHTML($body); $address = $mTo; $mail->AddAddress($address, $nTo); $mail->AddReplyTo('[email protected]', 'Freetuts.net'); $mail->AddAttachment($file,$filename); if(!$mail->Send()) { return 0; } else { return 1; } } ?>
Trong hàm trên mình có để cố định phần AddReplyTo vì theo ý kiến cá nhân của mình chắc phần này thường cố định tuy nhiên nếu hệ thống của bạn gồm nhiều bộ phận thì có thể nó sẽ khác nhau bạn từ điều chỉnh cho nó phù hợp.
Bây giờ bạn quay lại file sendmail.php
viết code như sau để test nhé.
<?php //goi thu vien include('class.smtp.php'); include "class.phpmailer.php"; include "functions.php"; $title = 'Hướng dẫn gửi mail bằng phpmailer'; $content = 'Bạn đang tìm hiểu về cách gửi email bằng php mailler trên freetuts.net chúc các bạn có những phút giây vui vẻ.'; $nTo = 'Huudepzai'; $mTo = '[email protected]'; $diachicc = '[email protected]'; //test gui mail $mail = sendMail($title, $content, $nTo, $mTo,$diachicc=''); if($mail==1) echo 'mail của bạn đã được gửi đi hãy kiếm tra hộp thư đến để xem kết quả. '; else echo 'Co loi!'; ?>
Đối với hàm sendMailAttachment
bạn sửa lại dòng sau.
$mail = sendMailAttachment($title, $content, $nTo, $mTo,$diachicc='','filedinhkem.docx','Day la file dinh kem');
Bạn hãy cầu hình các thông số phù hợp sau đó chạy file sendmail.php
để kiểm tra xem.
4. Cấu hình tài khoản gmail để gửi được mail
Hiện nay google đã bổ sung một số chức năng security dành cho dịch vụ ngoài, tức là các dịch vụ gửi mail thông qua smtp của google, vì vậy bạn phải thực hiện một số bươc sau để có thể gửi mail được.
Không sử dụng đăng nhập 2 bước
Đăng nhập 2 bước là chức năng mỗi khi bạn đăng nhập thì google sẽ gửi mã code đến sdt của bạn, sau đó bạn nhập mã code vào thì mới đăng nhập được. Vì bạn đang gửi tự động nên phải tắt chức năng này nhé.
Để tắt thì bạn vào link này nhé, nếu bạn chưa bật thì có thẻ bỏ qua.
Bật Allow less secure apps sang ON
Bạn vào link này để chuyển sang chế độ ON nhé. Thường xong bước này là bạn có thể gửi mail tại localhost, nhưng khi upload lên hosting thì không sử dụng được, lúc này bạn phải thực hiện bước thứ 3 dưới đây.
Bật Display Unlock Captcha
Bạn vào link này và click vào tiếp tục để cho phép gửi mail tại bên thứ 3 nhé.
Sau khi hoàn thành 3 bước trên là bạn đã gửi được mail rồi đấy. Trường hợp vẫn chưa gửi được thì bạn cần phải xem lại hosting của bạn có hỗ trợ gửi mail hay không, và có một số hosting bắt buộc mail phải theo domain nên không sử dụng được Gmail.
5. Kết luận
trên mình và các bạn vừa tìm hiểu về cách gửi mail trong php thông qua thư viện PHPMailer như đã nói ở trên, đây là một thư viện khá cơ bản và rất nhiều người biết đến rồi nhưng mình vẫn muốn giới thiệu lại để cho bạn nào chưa biết đến nó và đang gặp khó khăn trong vấn đề gửi mail có thể áp dụng được vào dự án của mình. Bài viết chỉ ở mức sơ khai các bạn có thể vận dụng sao cho linh hoạt để nó trở nên hữu dụng. Và kỹ năng lập trình của mình còn hạn chế, cũng như kiến thức có hạn nên có thể trong bài viết có nhiều chỗ không đúng thì mong được nhận sự góp ý từ phía các bạn để mình củng cố thêm. Và cũng mong các bạn thông cảm.
Các bạn có gì không hiểu hay thắc mắc có thể đặt câu hỏi tại đây hoặc hỏi trong group đẻ được hỗ trợ tốt nhất. Không nên hỏi nhưng câu hỏi khó để tránh tình trạng tác giá bối rối không biết trả lời. Mình rất khuyến khích các mem nữ hỏi những câu kiểu như có người yêu chưa? Mình làm được quen được không? Tối đi chơi đi?….
Cuối cùng hy vọng bài viết này hữu dụng với các bạn. Chúc các bạn học tốt!