Gửi Email trong PHP
- 12-03-2023
- Toanngo92
- 0 Comments
Mục lục
Thiết lập Máy chủ Cục bộ cho Email
Giao thức truyền thư đơn giản (Simple Mail Transfer Protocol – SMTP) là một bộ hướng dẫn giao tiếp (giao thức) cho phép các ứng dụng phần mềm truyền email qua Internet. Máy chủ SMTP cho phép gửi tin nhắn đến người dùng máy tính khác dựa trên địa chỉ email. Mục tiêu chính của SMTP được sử dụng để thiết lập các quy tắc giao tiếp giữa các máy chủ.
Người dùng có thể tạo các tập lệnh PHP để gửi và nhận email bằng SMTP. Để xác minh và kiểm tra chức năng của các tập lệnh này, người dùng sẽ yêu cầu máy chủ SMTP. Một trong những cách dễ nhất và giá cả phải chăng để sử dụng máy chủ SMTP cục bộ là Papercut SMTP. Papercut SMTP phục vụ như một máy chủ SMTP cục bộ được thiết kế để nhận email cục bộ. Người dùng có thể kiểm tra email đã xác minh trực tiếp trong hộp thư đến Papercut. Người mới bắt đầu có thể sử dụng máy chủ SMTP nhẹ như một phương tiện để kiểm tra cách nhận thư. Ngoài ra, có thể sử dụng SMTP của google để cấu hình gửi mail
Cấu hình SMTP chuẩn bị gửi Email
Để gửi email, cần đảm bảo rằng tệp php.ini bao gồm các cấu hình tương ứng cho PHP. Tệp cũng phải có chi tiết chính xác về cách hệ thống quản lý email. Vì người dùng đang sử dụng XAMPP nên có thể mở tệp bằng cách nhấp chuột phải vào tùy chọn Cấu hình trong Bảng điều khiển XAMPP, sau đó chọn php.ini. Thao tác này sẽ tự động mở tệp trong Notepad. Ngoài ra, nếu người dùng muốn mở tệp thông qua File Explorer, hãy điều hướng đến thư mục cài đặt php (ví dụ: C:\xampp\php) tìm tệp php.ini, sau đó mở tệp đó bằng bất kỳ trình soạn thảo văn bản tương ứng.
Khi tệp được mở, hãy tìm [mail function] trong nội dung, Phần chức năng thư sẽ có các chỉ thị sau:
- SMTP, mô tả địa chỉ máy chủ email của người dùng
- sendmail_from, mô tả địa chỉ email của người dùng
Ngoài ra, sửa nội dung file sendmail.ini với nội dung như sau:
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP=smtp.gmail.com
; http://php.net/smtp-port
smtp_port=587
; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =
auth_username=your_email@gmail.com
auth_password=your_gmail_password
; Force the From header (recommended).
; http://php.net/mail.force- extra-parameters
mail.force_extra_parameters = '-fyour_email@gmail.com'
Trong trường hợp gặp lỗi SMTP server response: 530 5.7.0 Must issue a STARTTLS command first, xử lý như sau:
Tìm file php.ini và tìm dòng sendmail_path, sửa nội dung thành:
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
Ngoài ra, chúng ta có thể cấu hình STMP khi viết code bên trong dự án bằng mã PHP, nội dung này các bạn có thể tham khảo bài viết: sử dụng SMTP của google để cấu hình gửi mail
Gửi Email Plain text
Để gửi email, PHP sử dụng hàm mail(). 3 tham số bắt buộc phải truyền vào hàm mail():
- Địa chỉ email người nhận
- Tiêu đề của tin nhắn
- Mô tả tin nhắn
Cú pháp:
mail(to, subject, message, headers, parameters);
Mô tả tham số:
Tham số | Đại diện | Mô tả | Bắt buộc/tùy chọn |
to | Email người nhận | Đối số này bao gồm địa chỉ chi tiết của người nhận email. Đảm bảo sử dụng danh sách được phân tách bằng dấu phẩy “,” nếu có nhiều hơn một người nhận | bắt buộc |
subject | Tiêu đề tin nhắn | Tham số này bao gồm chủ đề của email, đảm bảo tham số này không có bất kì ký tự new line “\n” nào | bắt buộc |
message | Mô tả tin nhắn | Tham số này bao gồm mô tả của tin nhắn sẽ được gửi cho người nhận. Đảm bảo mỗi dòng phân tách bởi new line “\n” nếu có, tối đa 70 ký tự | bắt buộc |
headers | headers | header Đây là một đối số tùy chọn bao gồm các header bổ sung. Đảm bảo tách riêng từng header bằngCarriage Return Line Feed (CRLF) (\r\n) | Tùy chọn |
parameters | tham số | Đây cũng là một đối số tùy chọn bao gồm các tham số, nếu có, sẽ được chuyển đến chương trình gửi mail. | Tùy chọn |
Khi hàm mail() được gọi, PHP sẽ cố gắng gửi email. Nếu nó được gửi thành công, PHP trả về true, ngược lại, nó trả về false.
Gửi Email HTML
Trong PHP, khi người dùng gửi một tin nhắn văn bản, theo mặc định, nó được hiểu là văn bản đơn giản. Ngay cả khi tin nhắn chứa các thẻ HTML, nó vẫn được coi là văn bản. Điều quan trọng cần lưu ý là các thẻ HTML không được định dạng theo cú pháp HTML. Tuy nhiên, nếu người dùng muốn gửi email ở định dạng HTML, thì cũng có một tùy chọn cho nó. Để gửi một email như vậy, người dùng phải đảm bảo nhập MIME version, content type và character set.
ví dụ:
<?php
// phpinfo();
$html_success = '';
if(isset($_POST['sendmail'])){
$to = $_POST['email'];
$subject = $_POST['subject'];
$content = $_POST['content'];
// It is mandatory to set the content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
// More headers. From is required, rest other headers are optional
$headers .= 'From: <toan.nv@aptechlearning.edu.vn>' . "\r\n";
//$headers .= 'Cc: sales@example.com' . "\r\n";
$result = mail($to, $subject, $content,$headers);
if($result){
$html_success = '<div class="alert alert-success">
<strong>Success!</strong> Email has been sent.
</div>';
}else{
var_dump($result);
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="post">
<p>Email nhận</p>
<input type="text" name="email" placeholder="email">
<p>Tiêu đề mail</p>
<input name="subject" type="text" />
<p>nôi dung mail</p>
<textarea name="content"></textarea>
<input type="submit" name="sendmail" value="submit">
<?php echo $html_success; ?>
</form>
</body>
</html>
Gửi tệp đính kèm bằng email
Khi người dùng muốn gửi email có tệp đính kèm, điều cần thiết là đặt header content type thành multipart/mixed. Sau đó, người dùng có thể chỉ định phần văn bản và phần đính kèm trong boundary – dịch nôm na là ranh giới.
Ví dụ:
<?php
$to = 'receiver@example.com';
$subject = 'Email with attachment';
$message = 'Please find the attached file.';
// attachment file path and name
$file_name = 'attachment-file.pdf';
$file_path = '/path/to/attachment/'.$file_name;
// Read the file content into a string variable
$file_content = file_get_contents($file_path);
// Encode the content using base64 encoding
$file_encoded = base64_encode($file_content);
// Generate a random boundary string to separate the message body and attachment section
$boundary = md5(time());
// Set email headers
$headers = "From: sender@example.com\r\n";
$headers .= "Reply-To: sender@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$boundary}\"";
// Message body
$body = "This is a multi-part message in MIME format.\r\n\r\n";
$body .= "--{$boundary}\r\n";
$body .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\r\n";
$body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$body .= "{$message}\r\n\r\n";
// Attachment section
$body .= "--{$boundary}\r\n";
$body .= "Content-Type: application/octet-stream;\r\n";
$body .= " name=\"{$file_name}\"\r\n";
$body .= "Content-Disposition: attachment;\r\n";
$body .= " filename=\"{$file_name}\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$body .= "{$file_encoded}\r\n\r\n";
// Send the email
$mail_sent = mail($to, $subject, $body, $headers);
// Check if email sent successfully or not
if ($mail_sent) {
echo "Email with attachment has been sent.";
} else {
echo "There was an error sending the email with attachment.";
}
?>