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

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.

html mail, mail, php code, gui nhan mail, php tips

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.

 

 HỖ TRỢ TRỰC TUYẾN