Hướng dẫn toàn tập về gửi nhận mail bằng PHP

10/01/2014

Gửi nhận Email là một trong những tính năng quan trọng nhất mà một trang web cần phải có. Nó giúp chúng ta gửi thông tin đến khách hàng, đồng thời chúng ta cũng có thể nhận được những yêu cầu, phản hồi từ phía khách hàng của mình. Hiện nay đa số chúng ta đề dùng CMS để xây dựng website như WordPrees, Jooml hay Drupal. Những CMS này mặc định đã tích hợp sẵn chức năng gửi và nhận mail, nên chúng ta thường không phải dùng bất kì câu lệnh hay đoạn code nào. Nhưng nếu các bạn là những người mới tiếp cận PHP và muốn tự tay xây dựng cho mình một chức năng gửi mail bằng PHP.Thì qua bài viết này, mình sẽ chia sẻ cho các bạn từng đoạn code giúp các bạn gửi mail bằng PHP.

Hướng dẫn toàn tập về gửi nhận mail bằng PHP

Gửi mail đơn giản bằng hàm mail() trong PHP

Đầu tiên, chúng ta sẽ tiếp cận cách gửi mail đơn giản nhất mà PHP hỗ trợ cho chúng ta với hàm mail(). Để dễ hiểu , các bạn xem đoạn code gửi mail đơn giản như sau :

 $to = 'youraddress@example.com';  //khai báo địa chỉ mail người nhận
$subject = 'Test email'; // chủ đề của mail
// Đây là nội dung mail cần gửi. Để xuống dòng , chèn \n vào cuối dòng
$message = "Hello World!\n\nThis is my first mail.";
// Khai báo thông tin mail người gửi. Cách dòng bằng \r\n
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
 //Gửi mail
$mail_sent = @mail( $to, $subject, $message, $headers );
// Nếu thành công thì xuất dòng thông báo "Mail sent", ngược lại thì xuất  "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";

Như các bạn đã thấy ở đoạn code bên trên, việc gửi mail thật đơn giản phải không nào. Nếu các bạn muốn gửi mail đến nhiều người hơn, thì có thể thêm địa chỉ email ở biến $to, hoặc chèn thêm cc: hoặc bcc: vào biến $headers, và mỗi email sẽ được ngăn cách bởi dấu phẩy .

Gửi mail có chèn html vào nội dung trong PHP

Thông thường, khi gửi mail, nội dung trong mail thường là các văn bản thuần ( tức là chỉ có chữ và chữ ). Đôi khi chúng ta cần nhấn mạnh nội dung nào đó cho khách hàng như tô đậm hay đổi màu chữ, hoặc sắp xếp nội dung theo danh sách hoặc table thì lúc đó chúng ta sẽ cần chèn thêm các thẻ html để định dạng nội dung trong mail. Tuy nhiên không phải mail khách hàng nào cũng hiểu nội dung HTML. Vì thế khi gửi mail , chúng ta sẽ chia nội dung cần gửi ra làm 2 phần. Một chứa nội dung văn bản trần cho những email khách hàng tắt bỏ chức năng HTML Email, và một cho mail khách hàng đọc được định dạng này. Để dễ hiểu, các bạn cùng xem đoạn code gửi HTML Mail đơn giản như sau:

<?php
 //Khai báo địa chỉ mail người nhận
$to = 'youraddress@example.com';
//Chủ đề mail
$subject = 'Test HTML email';
// Tạo chuỗi ngẫu nhiên và duy nhất
$random_hash = md5(date('r', time()));
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
// Chèn chuỗi ngăn cách
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";
// Nội dung mail cần gửi nằm tại đây
ob_start(); //Bật output buffering ?>
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Hello World!!!
This is simple text email message.

--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
<h2>Hello World!</h2>
This is something with <b>HTML</b> formatting.

--PHP-alt-<?php echo $random_hash; ?>--
<?
$message = ob_get_clean();
//Gửi email
$mail_sent = @mail( $to, $subject, $message, $headers );
// Nếu thành công thì xuất dòng thông báo "Mail sent", ngược lại thì xuất  "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed"; ?>

Như các bạn đã thấy ở đoạn code bên trên,chúng ta đã chia cắt nội dung thành 2 phần. Mỗi phần được ngăn cách bởi một chuỗi được tạo ngẫu nhiên. Một phần cho văn bản thuần và phần còn lại cho  văn bản đính kèm html bên trong nội dung, và khi tới mail khách hàng, tùy thuộc vào từng mail mà nội dung hiển thị sẽ được chọn tương ứng. Như các bạn đã thấy ở đoạn code bên trên,chúng ta đã chia cắt nội dung thành 2 phần. Mỗi phần được ngăn cách bởi một chuỗi được tạo ngẫu nhiên. Một phần cho văn bản thuần và phần còn lại cho  văn bản đính kèm html bên trong nội dung, và khi tới mail khách hàng, tùy thuộc vào từng mail mà nội dung hiển thị sẽ được chọn tương ứng.

Gửi mail với file đính kèm trong PHP

Trước đây mình đã giới thiệu bài viết Hướng dẫn gửi mail với file đính kèm (Attachment) bằng PHP , nhưng đó là việc gửi nhận bằng PHP Mailer , còn với  hàm mail() thì chúng ta sẽ làm như sau .

<?php
// khai báo địa chỉ mail người nhận
$to = 'youraddress@example.com';
// Chủ đề mail
$subject = 'Test email with attachment';
//Tạo chuỗi ngăn cách các phần ngẫu nhiên và duy nhất
$random_hash = md5(date('r', time()));
//Thông tin mail người gửi
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
//Chèn chuổi ngăn cách tại đây
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
//Mã hóa file đính kèm với MIME base64, //và chia nhỏ nó
 $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); //define the body of the message. ob_start(); //Bật output buffering ?>
--PHP-mixed-<?php echo $random_hash; ?>
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"

--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Hello World!!!
This is simple text email message.

--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit</pre>
<h2>Hello World!</h2>
This is something with <b>HTML</b> formatting.
--PHP-alt-<?php echo $random_hash; ?>--

--PHP-mixed-<?php echo $random_hash; ?>
Content-Type: application/zip; name="attachment.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment

<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--

<?php
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
// Nếu thành công thì xuất dòng thông báo "Mail sent", ngược lại thì xuất  "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed"; ?>

Đấy là toàn bộ kiến thức về mail mà mình muốn chia sẻ cho các bạn, ngoài ra các bạn cũng có thể tham khảo thêm bài viết Gửi mail bằng cách sử dụng SMTP với PHPMailer . Để hiểu thêm về mail trong PHP các bạn có thể tham khảo trực tiếp PHP Mail Reference tại php.net

Chuyên Mục:

Bài viết được đăng bởi webmaster

Nếu các bạn thấy bài viết hữu ích thì giúp mình Like cái nhé !
  • Nguyễn Lê Quang

    Mình muốn gửi email sử dụng phpmailer, với nội dung là kèm username và password được lấy trong database thì làm thế nào nhỉ??? sử dụng php mysql

  • nguyễn phi Thông

    Cho mình hỏi, ở phần gởi mail đơn giản đầu tiên. Email của mình trong biến headers chỉ mang tính thông tin hay phải là một email để php lấy đó làm địa chỉ gởi đi. vi minh cung lam dung cau truc do nhung phan header chi de mail ao, khi do ko goi dc. xin admin chi giup cam on nhieu.
    Mail cua minh phithong2014@gmail.com