Hướng dẫn dùng e mail trong PHP

Hầu hết các website bạn thường thấy có trang contact cho phép người dùng điền thông tin và gửi mail đi. Bài viết này mình sẽ hướng dẫn các bạn gửi mail trong PHP với hàm mail() .

Tạo form gửi mail trong PHP

Tạo file contact.php và thiết kế form điền thông tìn đơn giản như sau :

Email:
Message:

Form trên bao gồm một field email để người dùng nhập địa chỉ email của họ và field message để họ nhập tin nhắn cần gửi.

Thực thi hàm gửi mail trong PHP

Tiếp đến, trong trang contact.php chúng ta sẽ thêm đoạn code sau để thực hiện việc gửi mail khi người dùng ấn nút submit:

Giải thích về đoạn code trên :

  1. $to : Địa chỉ email mà tin nhắn của người dùng sẽ được chuyển đến.
  2. $subject : Tiêu đề email mà bạn sẽ nhận được
  3. $email : Email của người dùng nhập trên form
  4. $message : Tin nhắn của người dùng
  5. $headers : Thông tin header của email
  6. $sent : Dùng hàm mail() của PHP, gắn các tham số đã tạo và thực thi việc gửi mail đi

Tổng kết: Mục đích của bài viết chia sẽ cho các bạn cách tạo form và gửi mail trong PHP bằng hàm mail() . Đây là cách gửi mail đơn giản, dành cho các bạn đang tìm hiểu về PHP hoặc làm các hệ thống nhỏ, đối với các hệ thống lớn thì sẽ có những cách gửi mail khác phù hợp. Chúc các bạn học tốt !

PHP cung cấp sẵn một hàm tên email được dùng để gửi email đi. Hàm này truy cập chương trình sendmail trong hệ điều hành linux. (Hãy xem sendmail - exim). Do vậy, để dùng được hàm mail cần đảm bảo Server của bạn có dịch vụ sendmail cài đặt chính xác.

Nội dung chính Show

  • Gửi mail trong PHP với hàm mail()
  • Gửi HTML trong mail
  • Gửi đính kèm trong mail

Gửi mail trong PHP với hàm mail()

Hàm mail() dùng để gửi email, cú pháp gửi mail như sau:

mail($to ,$subject ,$message, [$headers], [$parameters]);

Trong đó:

  • $to : địa chỉ nhận mail, một hoặc nhiều địa chỉ cách nhau bởi , (,)
  • $subject : Tiêu đề của mail
  • $message : Nội dung mail
  • $headers : Tùy chọn này có hoặc không, mở rộng cho phần header của mail ví dụ From, Cc, Bcc, tham số này cách nhau bởi cặp ký tự \r\n
  • $parameters : tùy chọn, nếu có nó thiết lập tham số bổ sung cho trình gửi mail (sendmail của Server)

Nếu mail gửi đi thành công, hàm trả về true. Thành công ở đây có nghĩa là sendmail đã chấp nhận đưa mail vào hàng đợi để chuyển đi, không có nghĩa mail thực tế đã chuyển cho địa chỉ nhận.

Ví dụ sau gửi đi một email từ địa chỉ đến địa chỉ đồng thời CC đến

$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}

Gửi HTML trong mail

Nếu trong $message gửi đi bạn có trình bày HTML thì để trình đọc email hiểu đó là HTML bạn cần một số thiết lập. Đó là mô tả trong $head các thông số như phiên bản của Mime, kiểu nội dung, mã hóa ký tự (UTF-8 ...)

Trở lại ví dụ trên, thiết lập thêm thông số để gửi đi nội dung HTML

$to      = "";
$subject = "Tiêu đề email";
$message = "

Đây là Email có chứa HTML

Đoạn văn trong Email

"; //MỚI $header = "From: \r\n"; $header .= "Cc: \r\n"; $header .= "MIME-Version: 1.0\r\n"; //MỚI $header .= "Content-type: text/html\r\n"; //MỚI $success = mail ($to,$subject,$message,$header); if( $success == true ) { echo "Đã gửi mail thành công..."; } else { echo "Không gửi đi được..."; }

Gửi đính kèm trong mail

Để gửi đính kèm thì phần $header cần thiết lập Content-type là multipart/mixed.

Lúc này phần header của email cần mô tả có các vùng, mỗi vùng tương ứng với một nội dung (như vùng cho nội dung email, vùng cho đính kèm).

Định nghĩa vùng trong phần header: Đầu tiên cần có một chuỗi ký tự dài 32 (ví dụ

$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
0 có thể tạo ra bằng hàm
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
1), mỗi vùng bắt đầu bằng thêm ký hiệu
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
2 vào trước
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
0 và khi kết thúc tất cả các phân đoạn dùng
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
4 để kết thúc. Cũng lưu ý thường mã hóa dữ liệu theo
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
5 và nội dung dài được chia nhỏ thành nhiều dòng bằng hàm
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
6.

Thực hành diễn giải chi tiết theo ví dụ sau, gửi mail có đính kèm file

$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
7

$to = "";
$subject = "Gửi email có đính kèm file";
$message = "Đây là nội dung email.";

//Mở file để đọc nội dung
$file = fopen( "/home/text.txt", "r" );
if( $file == false )
{
    echo "Error in opening file";
    exit();
}
$size = filesize("/home/text.txt");
$content = fread( $file, $size); //Nội dung file
//Mã hóa nội dung đính kèm - chia nhỏ nội dung thành nhiều dong
$encoded_content = chunk_split( base64_encode($content)); 

//Tạo ra một chuỗi 32 dùng đề phân vùng mô tả
$num = md5( time() );

//Phần header chính
$header = "From:\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; ";
$header .= "boundary=$num\r\n";
$header .= "--$num\r\n";

//Phần nội dùng Email
$header .= "Content-Type: text/plain\r\n";
$header .= "Content-Transfer-Encoding:8bit\r\n\n";
$header .= "$message\r\n";
$header .= "--$num\r\n";

//Phần nội dung đính kèm
$header .= "Content-Type:  multipart/mixed; ";
$header .= "name=\"test.txt\"\r\n";
$header .= "Content-Transfer-Encoding:base64\r\n";
$header .= "Content-Disposition:attachment; ";
$header .= "filename=\"text.txt\"\r\n\n";
$header .= "$encoded_content\r\n";
$header .= "--$num--";   //Kết thúc các phân đoạn

//Gửi mail
$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
    echo "Không gửi đi được...";
}
?>

Trên đây là bạn sử dụng trực tiếp hàm

$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
8 của PHP để gửi email, bạn cần thiết lập PHP từ
$to      = "";
$subject = "Tiêu đề email";
$message = "Nội dung email";
$header  =  "From: \r\n";
$header .=  "Cc: \r\n";

$success = mail ($to,$subject,$message,$header);

if( $success == true )
{
    echo "Đã gửi mail thành công...";
}
else
{
      echo "Không gửi đi được...";
}
9 để đảm bảo hàm mail() có hoạt động. Ngoài ra nhiều thư viện, framework đã trừu tượng hóa cách gửi mail(), giúp cho việc gửi email được dễ dàng hơn bạn có thể dùng như: PHPMailer - Zend Mail. Những chương trình này cũng hỗ trợ SMTP, để bạn có thể sử dụng dịch vụ email từ bên ngoài (như gmail) thay vì dùng sendmail mặc định của server.