10/10/2018, 11:20

[TUT] PHP - Gửi email định dạng HTML có attachment

Hi all,
Vấn đề chung của khá nhiều lập trình viên PHP là làm sao send email HTML và có attachment (đính kèm) cộng với BCC, header và vân vân.
Richard Heyes viết ra công cụ rất hữu ích sau:
http://www.phpguru.org/static/mime.mail.html
Bài này viết dựa trên HTMLMimeMail5, tuy nhiên vẫn có bản tương thích PHP4 trên site đó.
Cách sử dụng của nó khá đơn giản:
Code:
<?php
/**
) o------------------------------------------------------------------------------o
* | This is HTMLMimeMail5. It is dual licensed as GPL and a commercial license.  |
* | If you use the code commercially (or if you don't want to be restricted by   |
* | the GPL license), you will need the commercial license. It's only £49 (GBP - |
* | roughly $98 depending on the exchange rate) and helps me out a lot. Thanks.  |
* o------------------------------------------------------------------------------o
*
* © Copyright 2005 Richard Heyes
* Introduce to ddth by tiendx2002@gmail.com
*/
    //Include mail lib
    require_once('htmlMimeMail5.php');
    //Init - Khởi tạo
    $mail = new htmlMimeMail5();
    //Set the from address - đặt địa chỉ gửi tới
    $mail->setFrom('Richard <richard@example.com>');
    //Set the subject - đặt tiêu đề
    $mail->setSubject('Test email');
    //Set high priority - xác định độ ưu tiên (optional)
    $mail->setPriority('high');
    //Set the text of the Email - text thường cho những mail client không đọc được HTML
    $mail->setText('Sample text');
    //Set the HTML of the email - phần HTML của email
    $mail->setHTML('<b>Sample HTML</b> <img src="background.gif">');
    //Add an embedded image - gửi kèm ảnh (làm ảnh nền) (optional)
    $mail->addEmbeddedImage(new fileEmbeddedImage('background.gif'));
    //Add an attachment - file đính kèm, lưu tâm phải có file này tồn tại rồi* (optional)
    $mail->addAttachment(new fileAttachment('example.zip'));
    //Set BCC - người nhận ẩn (optional)
    $mail->setBcc('test@gmail.com, info@example.com');
    //Send the email
    $mail->send(array('richard@example.com'));
?>
Chúc send mail vui vẻ. Đừng dùng nó để spam nhé.
Thân mến.
DTTung viết 13:34 ngày 10/10/2018
em đang dùng wampserver5 làm sao để chạy được hàm mail() trong php,
có cần chỉnh trong file php.ini ko?
Xin mọi người chỉ giúp...
tiendx2002 viết 13:33 ngày 10/10/2018
Được gửi bởi DTTung
em đang dùng wampserver5 làm sao để chạy được hàm mail() trong php,
có cần chỉnh trong file php.ini ko?
Xin mọi người chỉ giúp...
Chào bạn,
Bạn tham khảo:
PHP - Gửi email từ localhost bằng Mecury Mail
Thân mến.
gietbo viết 13:33 ngày 10/10/2018
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\contact1\senddongian\htmlMimeMail5 .php on line 738

Ai có thể config mẫu 1 cái = gmail d kô a !
tiendx2002 viết 13:27 ngày 10/10/2018
Được gửi bởi bossnabito
Code:
Warning: require_once(htmlMimeMail5.php) [function.require-once]: failed to open stream: No such file or directory in E:\xampp\htdocs\testsendmail.php on line 14

Fatal error: require_once() [function.require]: Failed opening required 'htmlMimeMail5.php' (include_path='.;\xampp\php\PEAR') in E:\xampp\htdocs\testsendmail.php on line 14
Lỗi này là lỗi gì vậy bác
Lỗi em chưa có thư viện htmlMimeMail5, tìm và tải nó đặt chung vào thư mục nhé.
Thân.
zip.vn viết 13:27 ngày 10/10/2018
Do sợ bị lợi dụng gởi spam, nhiều server bây giờ chặn hàm mail()

Để khắc phục, bạn có thể dùng SMTP (trong file class htmlMimeMail5.php có sẵn phần khai báo dùng SMTP)
xx3004 viết 13:28 ngày 10/10/2018
Được gửi bởi DTTung
em đang dùng wampserver5 làm sao để chạy được hàm mail() trong php,
có cần chỉnh trong file php.ini ko?
Xin mọi người chỉ giúp...
Nếu bạn không muốn phụ thuộc vào hàm mail, thì đây là cách làm pure php, ko phụ thuộc vào class khác:

PHP Code:
$message "Written by <b>xx3004</b>";
$subject "Mail với nhiều file đính kèm";
$to "xx3004@gmail.com";
$from "xx3004@gmail.com";
$replyTo "xx3004@gmail.com";
$contentType "text/html";
$charset "UTF-8";
$files = array("attachment1.zip""attachment2.txt""attachment3.jpg");

//Kiểm tra chắc rằng e-mail hợp lệ
$field filter_var($toFILTER_SANITIZE_EMAIL);
if (!
filter_var($fieldFILTER_VALIDATE_EMAIL)) die("Invalid recipient");
        
$mailHeader "From: $from\r\n";
$mailHeader .= "Cc: $cc\r\n";
$mailHeader .= "Bcc: $bcc\r\n";
$mailHeader .= "Reply-To: $replyTo\r\n";
$mailHeader .= "MIME-Version: 1.0\r\n";

//Cái này cần để gửi attachment
$semi_rand md5(time()); 
$mime_boundary "==Multipart_Boundary_x{$semi_rand}x";

$mailHeader .= "Content-Type: multipart/mixed;\r\n" ." boundary=\"{$mime_boundary}\"";
$message "--{$mime_boundary}\r\n" ."Content-Type: $contentType; charset = $charset\r\n" ."Content-Transfer-Encoding: 7bit\r\n" .$message ."\r\n";
$message .= "--{$mime_boundary}\r\n";

//Bắt đầu quét file để đính kèm
for ($i=0$i sizeof($files); $i++) {
    
$fHandle fopen($files***91;$i***93;, "rb");
    
$data fread($fHandlefilesize($files***91;$i***93;));
    
fclose($fHandle);
    
$data chunk_split(base64_encode($data));
    
$message .= "Content-Type: {\"application/octet-stream\"};\n";
    
$message .= " name=\"$files***91;$i***93;\"\r\n";
    
$message .= "Content-Disposition: attachment;\r\n";
    
$message .= " filename=\"$files***91;$i***93;\"\r\n";
    
$message .= "Content-Transfer-Encoding: base64\r\n" $data "\r\n";
    
$message .= "--{$mime_boundary}\r\n";
}

$ok mail($to$subject$message$mailHeader);
if (
$ok) die(true); else die(false); 
Cách này nhìn hơi cực 1 chút (chính mình ngồi research mà cũng tốn 2, 3 ngày mà >.<, nhưng được cái ko phụ thuộc vào lớp mail(), bạn còn có thể đổi tên cho attachment và làm nhiều trò khác nữa :-).

Thân.
[x]
Bài liên quan
0