如何附加两个或多个文件,并在PHP中发送邮件

下面的代码只发送一个附件,但我需要附加并发送两个文件(一个rar文件和pdf)

$email_to = "$email"; // The email you are sending to (example) $email_from = "online@example.co.in"; // The email you are sending from (example) $email_subject = "subject line"; // The Subject of the email $email_txt = "text body of message"; // Message that the email has in it $fileatt = "files/example.rar"; // Path to the file (example) $fileatt_type = "application/x-rar-compressed"; // File Type $fileatt_name = "example.rar"; // Filename that will be used for the file as the attachment $file = fopen($fileatt,'rb'); $data = fread($file,filesize($fileatt)); fclose($file); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers="From: $email_from"; // Who the email is from (example) $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $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; $email_message .= "\n\n"; $data = chunk_split(base64_encode($data)); $email_message .= "--{$mime_boundary}\n" . "Content-Type: {$fileatt_type};\n" . " name=\"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n" . "--{$mime_boundary}--\n"; mail($email_to,$email_subject,$email_message,$headers); 
 <form action="#" method="POST" enctype="multipart/form-data" > <input type="file" name="csv_file[]" /> <br/> <input type="file" name="csv_file[]" /> <br/> <input type="file" name="csv_file[]" /> <br/> <input type="submit" name="upload" value="Upload" /> <br/> </form> <?php if($_POST) { for($i=0; $i < count($_FILES['csv_file']['name']); $i++){ $ftype[] = $_FILES['csv_file']['type'][$i]; $fname[] = $_FILES['csv_file']['name'][$i]; } // array with filenames to be sent as attachment $files = $fname; // email fields: to, from, subject, and so on $to = "example@gmail.com"; $from = "example@gmail.com"; $subject ="My subject"; $message = "My message"; $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for 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"; // preparing attachments for($x=0;$x<count($files);$x++){ $file = fopen($files[$x],"rb"); $data = fread($file,filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } } ?> 

遵循可重用性原则 ,您可以使用https://github.com/Synchro/PHPMailer

 <?php require 'PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup server $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'jswan'; // SMTP username $mail->Password = 'secret'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted $mail->From = 'from@example.com'; $mail->FromName = 'Mailer'; $mail->addAddress('josh@example.net', 'Josh Adams'); // Add a recipient $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; exit; } echo 'Message has been sent'; 

在核心php邮件function中检查以下多个文件附件。

 <?php /** Mail with attachment */ function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $bcc, $subject, $message){ $uid = md5(uniqid(time())); $mime_boundary = "==Multipart_Boundary_x{$uid}x"; $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Bcc: ".$bcc."\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--".$mime_boundary."\r\n"; $header .= "Content-type:text/html; charset=iso-8859-1\r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $header .= nl2br($message)."\r\n\r\n"; $header .= "--".$mime_boundary."\r\n"; foreach($filename as $k=>$v){ $file = $path.$v; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $header .= "Content-Type: application/octet-stream; name=\"".$v."\"\r\n"; // use different content types here $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$v."\"\r\n\r\n"; $header .= $content."\r\n\r\n"; $header .= "--".$mime_boundary."--"."\r\n"; } if (mail($mailto, $subject, "", $header)) { //echo "mail send ... OK"; // or use booleans here return true; } else { //echo "mail send ... ERROR!"; return false; } } ?> 

这是我得到多个邮件附件和testing成功的最佳解决scheme之一。

这个代码给你自由的附加文件的电子邮件,而不需要上传到你的托pipe服务器空间。 这是非常需要的。

有很多解决scheme告诉如何上传文件到你的服务器,然后发送到电子邮件,但这个解决scheme给“ 直接多个文件附件到电子邮件

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>E-mail with Attachment</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if ($_SERVER['REQUEST_METHOD']=="POST"){ // we'll begin by assigning the To address and message subject $to="me@me.com"; $subject="E-mail with attachment"; // get the sender's name and email address // we'll just plug them a variable to be used later $from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">"; // generate a random string to be used as the boundary marker $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x"; // now we'll build the message headers $headers = "From: $from\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: multipart/mixed;\r\n" . " boundary=\"{$mime_boundary}\""; // here, we'll start the message body. // this is the text that will be displayed // in the e-mail $message="This is an example"; $message .= "Name:".$_POST["fromname"]."Message Posted:".$_POST["modlist"]; // next, we'll build the invisible portion of the message body // note that we insert two dashes in front of the MIME boundary // when we use it $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"; // now we'll process our uploaded files foreach($_FILES as $userfile){ // store the file information to variables for easier access $tmp_name = $userfile['tmp_name']; $type = $userfile['type']; $name = $userfile['name']; $size = $userfile['size']; // if the upload succeded, the file will exist if (file_exists($tmp_name)){ // check to make sure that it is an uploaded file and not a system file if(is_uploaded_file($tmp_name)){ // open the file for a binary read $file = fopen($tmp_name,'rb'); // read the file content into a variable $data = fread($file,filesize($tmp_name)); // close the file fclose($file); // now we encode it and split it into acceptable length lines $data = chunk_split(base64_encode($data)); } // now we'll insert a boundary to indicate we're starting the attachment // we have to specify the content type, file name, and disposition as // an attachment, then add the file content. // NOTE: we don't set another boundary to indicate that the end of the // file has been reached here. we only want one boundary between each file // we'll add the final one after the loop finishes. $message .= "--{$mime_boundary}\n" . "Content-Type: {$type};\n" . " name=\"{$name}\"\n" . "Content-Disposition: attachment;\n" . " filename=\"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; } } // here's our closing mime boundary that indicates the last of the message $message.="--{$mime_boundary}--\n"; // now we just send the message if (@mail($to, $subject, $message, $headers)) echo "Message Sent"; else echo "Failed to send"; } else { ?> <p>Send an e-mail with an attachment:</p> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1"> <p>Your name: <input type="text" name="fromname"></p> <p>Your e-mail: <input type="text" name="fromemail"></p> <p>Mod List: <textarea name="question" maxlength="1000" cols="25" rows="6" name="modlist"></textarea> <p>File: <input type="file" name="file1"></p> <p>File: <input type="file" name="file2"></p> <p>File: <input type="file" name="file3"></p> <p>File: <input type="file" name="file4"></p> <p>File: <input type="file" name="file5"></p> <p>File: <input type="file" name="file6"></p> <p>File: <input type="file" name="file7"></p> <p>File: <input type="file" name="file8"></p> <p><input type="submit" name="Submit" value="Submit"></p> </form> <?php } ?> </body> </html> 

试试这个。 把你的文件放在一个数组中,然后使用一个表单循环把它们中的每一个添加到$email_messagevariables中

 $email_to = "$email"; // The email you are sending to (example) $email_from = "online@example.co.in"; // The email you are sending from (example) $email_subject = "subject line"; // The Subject of the email $email_message = "text body of message"; // Message that the email has in it $files = array("file_1.ext","file_2.ext","file_3.ext",......); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers="From: $email_from"; // Who the email is from (example) $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $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; $email_message .= "\n\n"; for($x=0;$x<count($files);$x++){ $file = fopen($files[$x],"rb"); $data = fread($file,filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $email_message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $email_message .= "--{$mime_boundary}\n"; } mail($email_to,$email_subject,$email_message,$headers); 

希望它能正常工作:)

这是我用来发送多个附件的代码,我希望这也可以帮助你。 您实际上需要在连接多个文件时使用循环。

  $files = array("file1.pdf","file2.pdf"); $body = "email in html form"; // email fields: to, from, subject, and so on $to = "e-mail id of person you are sending to"; $from = "your e-mail id"; $subject = "email subject"; $message = html_entity_decode($body); $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for 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/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; $message .= "--{$mime_boundary}\n"; // preparing attachments for ($x = 0; $x < count($files); $x++) { $file = fopen($files[$x], "rb"); $data = fread($file, filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } 
 <input type="file" name="file" multiple> //select multiple file $target_dir = "upload/"; //first upload your directory path $names = $_FILES['file']['name']; //file Name $i =0; foreach($names as $name){ $target_file = $target_dir . basename($name); //first upload your directory path move_uploaded_file($_FILES["file"]["tmp_name"][$i], $target_file); //upload your directory $mail->addAttachment($target_file); //after upload file path fetch and atachment $i++; } 

简单的工作和testing的例子:

 <?php mail_attachment("mail@mail.com","Subject","Here is the body",array("file1.pdf","file2.pdf")); function mail_attachment($to, $subject, $message, $files) { $headers = "From: no-reply@mail.com"; $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}\""; $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" . $message . "\n\n"; $message .= "--{$mime_boundary}\n"; foreach ($files as $file) { $filename = end(explode("/",$file)); $data = file_get_contents($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$file\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$file\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } echo (@mail($to, $subject, $message, $headers)) ? "<p>Send to $to!</p>" : "<p>Not send toaar $to!</p>"; } // mail-attachment ?> 

仅供参考,从原来的post,以及一些答案这一行,将导致一些电子邮件系统的问题。

$ headers。=“\ nMIME-Version:1.0 \ n”。

\ n开始时导致附件在发送到托pipe在emailpros.com上的地址时失败,这是一个安全的HIPAA兼容电子邮件系统。 简单地删除换行解决了那里的问题。 但是,发送到Gmail帐户和另一个主机(Hostmonster)时,它一直工作得很好。 这种方式在所有这些方面工作得很好。 $ headers。=“MIME-Version:1.0 \ n”。

  <?php // upload recommendation file section $target_dir = "wp-content/uploads/rec_file/"; $target_file = $target_dir . basename($_FILES["RC_file"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $check = getimagesize($_FILES["RC_file"]["tmp_name"]); if($check !== false) { $error_msg = "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { $error_msg = "File is not an image."; $uploadOk = 0; } // Check if file already exists if (file_exists($target_file)) { $error_msg = "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["RC_file"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { $error_msg = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $error_msg = "your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["RC_file"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["RC_file"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file. ". $error_msg ; } } // upload driven licence file section $DL_target_dir = "wp-content/uploads/rec_file/"; $DL_target_file = $DL_target_dir . basename($_FILES["DL_file"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($DL_target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $check = getimagesize($_FILES["DL_file"]["tmp_name"]); if($check !== false) { $error_msg = "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { $error_msg = "File is not an image."; $uploadOk = 0; } // Check if file already exists if (file_exists($DL_target_file)) { $error_msg = "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["DL_file"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { $error_msg = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $error_msg = "your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["DL_file"]["tmp_name"], $DL_target_file)) { echo "The file ". basename( $_FILES["DL_file"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file. ". $error_msg ; } } // array with filenames to be sent as attachment $files = array($target_file,$DL_target_file); // email fields: to, from, subject, and so on $to = "tkdilankumara@gmail.com"; $from = "help@soosti.com"; $subject ="Member Registration"; $headers = "From: $from"; $eol = "\r\n"; $message .= "Member Registration Information.".$eol; $message .= $username.$eol; $message .= $email.$eol; $message .= $Fname.$eol; $message .= $Lname.$eol; $message .= $address.$eol; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for 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"; // preparing attachments for($x=0;$x<count($files);$x++){ //$file = @fopen($files[$x],"rb"); //$data = @fread($file,filesize($files[$x])); //@fclose($file); $content =file_get_contents($files[$x],"rb"); $content = chunk_split(base64_encode($content)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $content . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } ?>