2014-03-07 36 views
6

发送邮件下面的代码只发送一个附件,但我需要连接和发送两个文件(一个RAR文件和PDF)如何连接两个或多个文件,并在PHP

$email_to = "$email"; // The email you are sending to (example) 
$email_from = "[email protected]"; // 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); 
+1

使用phpmailer https://github.com/PHPMailer/PHPMailer – zzlalani

+0

你真的不应该使用PHP的mail()函数。 –

回答

5

reusability principles,你可以使用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 = '[email protected]'; 
$mail->FromName = 'Mailer'; 
$mail->addAddress('[email protected]', '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'; 
0

试试看。把数组中的文件,然后使用一个循环的形式添加的每个人在$email_message可变

$email_to = "$email"; // The email you are sending to (example) 
$email_from = "[email protected]"; // 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); 

希望它工作得很好:)

+0

kakashihatake2它不工作 – user3309116

+0

你得到什么错误? – prateekkathal

+0

其不发送邮件 – user3309116

0

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

$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>"; 
    } 
10
<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 = "[email protected]"; 
    $from = "[email protected]"; 
    $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>"; 
    } 



} 

?> 
+0

真棒...工作完美:) –

+0

它为我工作也很好:) –

0
<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++; 
} 
+0

嗨,欢迎来到SO!请使用一些信息来增强您的答案。为什么这个工作,原来的提问者错了什么? – Chilion

0

简单的工作和测试,例如:

<?php 
    mail_attachment("[email protected]","Subject","Here is the body",array("file1.pdf","file2.pdf")); 
    function mail_attachment($to, $subject, $message, $files) { 
     $headers = "From: [email protected]"; 
     $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 
?> 
5

检查PHP核心邮件功能以下多个文件附件。

<?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; 
    } 
} 
?> 
2

这是我获得多个邮件附件和测试成功的最佳解决方案之一。

此代码通过附加电子邮件中的文件而不需要上传到您的托管服务器空间,为您提供了自由。这是非常需要的。

有很多的解决方案,告诉如何将文件上传到服务器,然后发送到电子邮件,但这种解决方案提供了从原来的“直接多个文件附件的电子邮件

<!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="[email protected]"; 
    $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> 
+1

你钉了它。它像一个魅力。一千万祝福你Guru和Hein Pauwelyn。 –

0

FYI,这条线帖子以及一些答案,会在某些电子邮件系统上造成问题。

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

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

0
<?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 = "[email protected]"; 
    $from = "[email protected]"; 
    $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>"; 
} 
?>