Sending email with multiple attachments with PHP

Vấn đề send 1 attachment là khá dễ , nhưng khi send cùng 1 lúc nhiều attachment thì thật sự là vấn đề , khi có quá nhiều code lạ , ta không biết bắt đầu vòng for từ đâu , chính vì thế , tôi đã build sẵn code để ta có thể tự động send mà không cần quan tâm những dòng code define attachment .

HTML: (Chỉ đơn giản là form với nhiều attachment)

<form name=”f1″ action=”mail.php” style=”position:relative;” method=”post” enctype=”multipart/form-data”>

<div>

<table id=”input_file” width=”90%”>

<tr><td width=”24″><input type=”file” name=”fileatt[]” /><img src=”images/attach.png” width=”24″ /></td><td style=”overflow:hidden;”>&nbsp;</td></tr>

<tr><td><input type=”file” name=”fileatt[]” /><img src=”images/attach.png” width=”24″ /></td><td style=”overflow:hidden;”>&nbsp;</td></tr>

<tr><td><input type=”file” name=”fileatt[]” /><img src=”images/attach.png” width=”24″ /></td><td style=”overflow:hidden;”>&nbsp;</td></tr>

<tr><td><input type=”file” name=”fileatt[]” /><img src=”images/attach.png” width=”24″ /></td><td style=”overflow:hidden;”>&nbsp;</td></tr>

<tr><td><input type=”file” name=”fileatt[]” /><img src=”images/attach.png” width=”24″ /></td><td style=”overflow:hidden;”>&nbsp;</td></tr>

</table>

</div> …

</form>

PHP code : Đây là đoạn xử lý quan trọng :

<?php

$to = $_POST[’emailto’];

$from = $_POST[’email’];

$subject =”Mail from :”.$_POST[‘name’];

$message = $_POST[‘message’];

$headers = “From: $from”;


// boundary

$semi_rand = md5(time());

$mime_boundary = “==Multipart_Boundary_x{$semi_rand}x”;

// headers cho attachment

$headers .= “\nMIME-Version: 1.0\n” . “Content-Type: multipart/mixed;\n” . ” boundary=\”{$mime_boundary}\””;

// multipart boundary

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

$message .= “–{$mime_boundary}\n”;

for($x=0;$x<100;$x++)

{

if($_FILES[‘fileatt’][‘tmp_name’][$x]==””)

{

break;

}

$fileatt      = $_FILES[‘fileatt’][‘tmp_name’][$x];

$fileatt_type = $_FILES[‘fileatt’][‘type’][$x];

$fileatt_name = $_FILES[‘fileatt’][‘name’][$x];

$file = fopen($fileatt,’rb’);

$data = fread($file,filesize($fileatt));

fclose($file);

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

$message .= “Content-Type: {\”application/octet-stream\”};\n” . ” name=\”$fileatt_name\”\n” .

“Content-Disposition: attachment;\n” . ” filename=\”$fileatt_name\”\n” .

“Content-Transfer-Encoding: base64\n\n” . $data . “\n\n”;

$message .= “–{$mime_boundary}\n”;

}

$ok = @mail($to, $subject, $message, $headers);

if ($ok) {

echo “<p>mail sent to $to!</p>”;

} else {

echo “<p>mail could not be sent!</p>”;

}

?>

Đầu tiên ta lấy thông tin người nhận , gửi …

$to = $_POST[’emailto’];

$from = $_POST[’email’];

$subject =”Mail from :”.$_POST[‘name’];

$message = $_POST[‘message’];

$headers = “From: $from”;

Tiếp theo là khai báo các thông tin cần thiết để gửi attachment :

// boundary

$semi_rand = md5(time());

$mime_boundary = “==Multipart_Boundary_x{$semi_rand}x”;

// headers cho attachment

$headers .= “\nMIME-Version: 1.0\n” . “Content-Type: multipart/mixed;\n” . ” boundary=\”{$mime_boundary}\””;

// multipart boundary

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

$message .= “–{$mime_boundary}\n”;

Và dòng lệnh for , khi kiểm tra thấy không còn file nào nữa , thì break

for($x=0;$x<100;$x++)

{

if($_FILES[‘fileatt’][‘tmp_name’][$x]==””)

{

break;

}

$fileatt      = $_FILES[‘fileatt’][‘tmp_name’][$x];

$fileatt_type = $_FILES[‘fileatt’][‘type’][$x];

$fileatt_name = $_FILES[‘fileatt’][‘name’][$x];

$file = fopen($fileatt,’rb’);

$data = fread($file,filesize($fileatt));

fclose($file);

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

$message .= “Content-Type: {\”application/octet-stream\”};\n” . ” name=\”$fileatt_name\”\n” .

“Content-Disposition: attachment;\n” . ” filename=\”$fileatt_name\”\n” .

“Content-Transfer-Encoding: base64\n\n” . $data . “\n\n”;

$message .= “–{$mime_boundary}\n”;

}

Cuối cùng , chỉ còn lại công việc là send email


$ok = @mail($to, $subject, $message, $headers);

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s