PHP - Sending Emails

Việc cung cấp tính năng gửi email là một trong những tính năng thường được yêu cầu của một ứng dụng web chạy trên PHP. Bạn muốn gửi email chứa thông báo, cập nhật và các thông tin liên lạc khác đến người dùng đã đăng ký của bạn, thông qua chính ứng dụng PHP của bạn, thay vì sử dụng một dịch vụ email khác. Bạn có thể thêm khả năng này vào ứng dụng PHP của mình bằng cách áp dụng các kỹ thuật được mô tả trong chương này.

PHP có một hàm mail() tích hợp sẵn để gửi email. Tuy nhiên, bạn cần cấu hình đúng các cài đặt "php.ini" để có thể thực hiện điều đó. Đầu tiên, bạn phải biết miền SMTP của nền tảng lưu trữ web mà bạn đang sử dụng. Ví dụ, nếu trang web của bạn đang được lưu trữ trên dịch vụ lưu trữ GoDaddy, miền SMTP là "smtp.secureserver.net", mà bạn nên sử dụng trong cấu hình.

Nếu bạn sử dụng dịch vụ lưu trữ dựa trên Windows của GoDaddy, bạn nên đảm bảo rằng hai chỉ thị được bật trong tệp php.ini. Chỉ thị đầu tiên được gọi là SMTP, định nghĩa địa chỉ máy chủ email của bạn. Chỉ thị thứ hai được gọi là sendmail_from, định nghĩa địa chỉ email của chính bạn.

Cấu hình cho Windows nên trông giống như sau −

[mail function]
; For Win32 only.
SMTP = smtp.secureserver.net

; For win32 only
sendmail_from = webmaster@tutorialspoint.com

Người dùng Linux chỉ cần cho PHP biết vị trí của ứng dụng sendmail của họ. Đường dẫn và bất kỳ tùy chọn nào mong muốn nên được chỉ định cho chỉ thị sendmail_path.

Cấu hình cho Linux nên trông giống như thế này −

[mail function]
; For Win32 only.
SMTP =

; For win32 only
sendmail_from = 

; For Unix only
sendmail_path = /usr/sbin/sendmail -t -i

Hàm mail() trong PHP yêu cầu ba tham số bắt buộc, bao gồm địa chỉ email của người nhận, chủ đề của tin nhắn và nội dung thực tế của tin nhắn. Ngoài ra, còn có hai tham số tùy chọn khác.

mail( to, subject, message, headers, parameters );

Parameters

  • to − Bắt buộc. Chỉ định người nhận / những người nhận email.

  • subject − Bắt buộc. Chỉ định chủ đề của email. Tham số này không thể chứa bất kỳ ký tự xuống dòng nào.

  • message − Bắt buộc. Định nghĩa thông điệp cần gửi. Mỗi dòng nên được tách biệt bằng một LF (\n). Các dòng không nên vượt quá 70 ký tự.

  • headers − Tùy chọn. Xác định các tiêu đề bổ sung, như From, Cc và Bcc. Các tiêu đề bổ sung nên được phân tách bằng CRLF (\r\n).

  • parameters − Tùy chọn. Chỉ định một tham số bổ sung cho chương trình gửi mail.

Nhiều người nhận có thể được chỉ định là đối số đầu tiên của hàm mail() trong một danh sách phân tách bằng dấu phẩy.

Sending HTML Email

Khi bạn gửi tin nhắn văn bản bằng PHP, tất cả nội dung sẽ được coi là văn bản đơn giản. Ngay cả khi bạn bao gồm các thẻ HTML trong tin nhắn văn bản, chúng sẽ được hiển thị dưới dạng văn bản đơn giản và các thẻ HTML sẽ không được định dạng theo cú pháp HTML. Tuy nhiên, PHP cung cấp tùy chọn để gửi một tin nhắn HTML dưới dạng tin nhắn HTML thực sự.

Khi gửi một tin nhắn email, bạn có thể chỉ định phiên bản Mime, loại nội dung và bộ ký tự để gửi một email HTML.

Example

Ví dụ dưới đây cho thấy cách gửi một tin nhắn email HTML đến "xyz@somedomain.com" và sao chép cho "afgh@somedomain.com". Bạn có thể lập trình chương trình này sao cho nó nhận tất cả nội dung từ người dùng và sau đó gửi email.

Nó nên nhận tất cả nội dung từ người dùng và sau đó gửi một email.

<?php
   $to = "xyz@somedomain.com";
   $subject = "This is subject";

   $message = "<b>This is HTML message.</b>";
   $message .= "<h1>This is headline.</h1>";

   $header = "From:abc@somedomain.com \r\n";
   $header .= "Cc:afgh@somedomain.com \r\n";
   $header .= "MIME-Version: 1.0\r\n";
   $header .= "Content-type: text/html\r\n";

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

   if( $retval == true ) {
      echo "Message sent successfully...";
   }else {
      echo "Message could not be sent...";
   }
?>

Nó sẽ tạo ra output

Message could not be sent...
sh: 1: /usr/sbin/sendmail: not found

Sending Email from Localhost

Phương pháp gọi hàm mail() trong PHP ở trên có thể không hoạt động trên localhost của bạn. Trong trường hợp đó, có một giải pháp thay thế để gửi email. Bạn có thể sử dụng PHPMailer để gửi email thông qua SMTP từ localhost.

PHPMailer là một thư viện mã nguồn mở để kết nối SMTP gửi email. Bạn có thể tải nó từ các kho PEAR hoặc Composer, hoặc tải nó từ https://github.com/PHPMailer/PHPMailer . Tải tệp ZIP từ đây, và sao chép nội dung của thư mục PHPMailer vào một trong các thư mục include_path được chỉ định trong cấu hình PHP của bạn và tải từng tệp lớp một cách thủ công.

Example

Sử dụng đoạn mã PHP sau để gửi email với thư viện PHPMailer −

Phpmailer.php

<?php
   use PHPMailer\PHPMailer\PHPMailer;
   use PHPMailer\PHPMailer\SMTP;
   use PHPMailer\PHPMailer\Exception;

   require_once __DIR__ . '/vendor/phpmailer/src/Exception.php';
   require_once __DIR__ . '/vendor/phpmailer/src/PHPMailer.php';
   require_once __DIR__ . '/vendor/phpmailer/src/SMTP.php';  
   require 'vendor/autoload.php';

   $mail = new PHPMailer;
   if(isset($_POST['send'])){
   
      // getting post values
      $fname=$_POST['fname'];		
      $toemail=$_POST['toemail'];	
      $subject=$_POST['subject'];	
      $message=$_POST['message'];
      $mail->isSMTP();					      // Set mailer to use SMTP
      $mail->Host = 'smtp.gmail.com';             
      $mail->SMTPAuth = true;                     
      $mail->Username = 'myID@gmail.com';	// SMTP username
      $mail->Password = 'mypassword'; 		// SMTP password

      // Enable TLS encryption, 'ssl' also accepted
      $mail->SMTPSecure = 'tls';
      $mail->Port = 587;                          
      $mail->setFrom(myID@gmail.com', 'My_Name');
      $mail->addReplyTo(myID@gmail.com', 'My_Name');
      $mail->addAddress($toemail);   	  // Add a recipient
      $mail->isHTML(true);                // Set email format to HTML
      $bodyContent=$message;
      $mail->Subject =$subject;
      $body = 'Dear'.$fname;
      $body .='<p>'.$message.'</p>';
      $mail->Body = $body;

      if(!$mail->send()) {
         echo 'Message could not be sent.';
         echo 'Mailer Error: ' . $mail->ErrorInfo;
      } else {
         echo 'Message has been sent';
      }
   }
?>

Sử dụng biểu mẫu HTML dưới đây để soạn thảo tin nhắn email. Biểu mẫu được gửi đến kịch bản phpmail.php ở trên.

Email.html

<h1>PHP - Sending Email</h1>
<form action="PHPmailer.php" method="post">
   <label for="inputName">Name</label>
   <input type="text" id="inputName" name="fname" required>

   <label for="inputEmail">Email</label>
   <input type="email" id="inputEmail" name="toemail" required>

   <label for="inputSubject">Subject</label>
   <input type="text" id="inputSubject" name="subject" required>

   <label for="inputMessage">Message</label>
   <textarea id="inputMessage" name="message" rows="5" required></textarea>

   <button type="submit" name="send">Send</button>
</form>

Sending Attachments with Email

Để gửi email với nội dung hỗn hợp, bạn nên đặt tiêu đề Content-type thành multipart/mixed. Sau đó, các phần văn bản và tệp đính kèm có thể được chỉ định trong các ranh giới.

Một ranh giới bắt đầu bằng hai dấu gạch nối theo sau là một số duy nhất không được xuất hiện trong phần tin nhắn của email. Một hàm PHP md5() được sử dụng để tạo ra một số 32 chữ số thập lục phân nhằm tạo ra số duy nhất. Một ranh giới cuối cùng đánh dấu phần cuối của email cũng phải kết thúc bằng hai dấu gạch nối.

Example

Hãy xem ví dụ sau −

<?php

   // request variables 	
   $from = $_REQUEST["from"];
   $emaila = $_REQUEST["emaila"];
   $filea = $_REQUEST["filea"];

   if ($filea) {
      function mail_attachment ($from , $to, $subject, $message, $attachment){
         $fileatt = $attachment; 		// Path to the file
         $fileatt_type = "application/octet-stream"; // File Type 

         $start = strrpos($attachment, '/') == -1 ? 
         strrpos($attachment, '//') : strrpos($attachment, '/')+1;

         // Filename that will be used for the file as the attachment
         $fileatt_name = substr($attachment, $start, 
         strlen($attachment));

         $email_from = $from; 		// Who the email is from
         $subject = "New Attachment Message";

         $email_subject =  $subject; // The Subject of the email 
         $email_txt = $message;     // Message that the email has in it 
         $email_to = $to; 	 	   // Who the email is to

         $headers = "From: ".$email_from;
         $file = fopen($fileatt,'rb'); 
         $data = fread($file,filesize($fileatt)); 
         fclose($file); 

         $msg_txt="\n\n You have recieved a new attachment message from $from";
         $semi_rand = md5(time()); 
         $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
         $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . "
         boundary=\"{$mime_boundary}\"";

         $email_txt .= $msg_txt;

         $email_message .= "This is a multi-part message in MIME format.\n\n" . 
         "--{$mime_boundary}\n" . "Content-Type:text/html; 
         charset = \"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . 
         $email_txt . "\n\n";

         $data = chunk_split(base64_encode($data));

         $email_message .= "--{$mime_boundary}\n" . "Content-Type: {$fileatt_type};\n" .
         " name = \"{$fileatt_name}\"\n" . //"Content-Disposition: attachment;\n" . 
         //" filename = \"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: 
         "base64\n\n" . $data . "\n\n" . "--{$mime_boundary}--\n";

         $ok = mail($email_to, $email_subject, $email_message, $headers);

         if($ok) {
            echo "File Sent Successfully.";
            // delete a file after attachment sent.
            unlink($attachment);
         } else {
            die("Sorry but the email could not be sent. Please go back and try again!");
         }
      }
      move_uploaded_file($_FILES["filea"]["tmp_name"],
      'temp/'.basename($_FILES['filea']['name']));

      mail_attachment("$from", "youremailaddress@gmail.com", 
      "subject", "message", ("temp/".$_FILES["filea"]["name"]));
   }
?>
<html>
<head>
   <script language = "javascript" type = "text/javascript">
      function CheckData45() {
         with(document.filepost) {
            if(filea.value ! = "") {
               document.getElementById('one').innerText = "Attaching File ... Please Wait";
            }
         }
      }
   </script>
</head>
<body>
   <table width = "100%" height = "100%" border = "0" 
      cellpadding = "0" cellspacing = "0">
      <tr>
         <td align = "center">
            <form name = "filepost" method = "post" 
               action = "file.php" enctype = "multipart/form-data" id = "file">
               <table width = "300" border = "0" cellspacing = "0" 
                  cellpadding = "0">
                  <tr valign = "bottom">
                     <td height = "20">Your Name:</td>
                  </tr>
                  <tr>
                     <td><input name = "from" type = "text" id = "from" size = "30"></td>
                  </tr>
                  <tr valign = "bottom">
                     <td height = "20">Your Email Address:</td>
                  </tr>
                  <tr>
                     <td class = "frmtxt2"><input name = "emaila" type = "text" id = "emaila" size = "30"></td>
                  </tr>
                  <tr>
                     <td height = "20" valign = "bottom">Attach File:</td>
                  </tr>
                  <tr valign = "bottom">
                     <td valign = "bottom"><input name = "filea" type = "file" id = "filea" size = "16"></td>
                  </tr>
                  <tr>
                     <td height = "40" valign = "middle">
                        <input name = "Reset2" type = "reset" id = "Reset2" value = "Reset">
                        <input name = "Submit2" type = "submit" value = "Submit" onClick = "return CheckData45()">
                     </td>
                  </tr>
               </table>
            </form>
            <center>
               <table width = "400">
                  <tr>
                     <td id = "one"></td>
                  </tr>
               </table>
            </center>
         </td>
      </tr>
   </table>
</body>
</html>

Nó sẽ tạo ra output

PHP Sending Emails