2013-03-15 36 views
7

Tôi đang cố gắng triển khai chức năng thư trong php, hoạt động tốt với tệp đính kèm duy nhất, nhưng vấn đề là khi tôi cố gửi nhiều tệp đính kèm, không hoạt động. Tôi đang sử dụng hàm php mail() để gửi email, tôi đang cố đính kèm tệp PDF và tệp Hình ảnh. Nếu PDF đính kèm thì Image sẽ không đính kèm, nếu Image đính kèm thì PDF sẽ không đính kèm. Bất kỳ suy nghĩ mà tôi đang làm sai?php: gửi email không thành công với nhiều tệp đính kèm

$header  .= 'From: test <[email protected]>' . "\r\n";  
$header  .= "MIME-Version: 1.0\r\n"; 
$file   = '1.png' 
$displayname = '1.png'; 
$file_size  = filesize($file); 
$handle  = fopen($file, "r"); 
$content  = fread($handle, $file_size); 
fclose($handle); 
$content  = chunk_split(base64_encode($content)); 
$uid   = md5(uniqid(time())); 
$name   = basename($file); 

$filepdf  = '1.pdf' 
$displaynamepdf= '1.pdf'; 
$file_sizepdf = filesize($filepdf); 
$handlepdf  = fopen($filepdf, "r"); 
$contentpdf = fread($handlepdf, $file_sizepdf); 
fclose($handlepdf); 
$contentpdf = chunk_split(base64_encode($contentpdf)); 
$name   = basename($file); 

$header  .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; 
$header  .= "This is a multi-part message in MIME format.\r\n"; 
$header  .= "--".$uid."\r\n"; 
$header  .= "Content-type:text/plain; charset=iso-8859-1\r\n"; 
$header  .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; 
$header  .= $message."\r\n\r\n"; 
$header  .= "--".$uid."\r\n"; 
$header  .= "Content-Type: application/octet-stream; name=\"".$displayname."\"\r\n"; // use different content types here 
$header  .= "Content-Transfer-Encoding: base64\r\n"; 
$header  .= "Content-Disposition: attachment; filename=\"".$displayname."\"\r\n\r\n"; 
$header  .= $content."\r\n\r\n"; 

$header  .= "Content-Type: application/octet-stream; name=\"".$displaynamepdf."\"\r\n"; // use different contentpdf types here 
$header  .= "Content-Transfer-Encoding: base64\r\n"; 
$header  .= "Content-Disposition: attachment; filename=\"".$displaynamepdf."\"\r\n\r\n"; 
$header  .= $contentpdf."\r\n\r\n"; 
$header  .= "--".$uid."--"; 

if (mail($to, $subject, "", $header)) { 
    return 'sent'; 
} else { 
    return 'not sent'; 
} 
+6

My 2 ¢: Hãy thử sử dụng [PHPMailer] (http://phpmailer.worxware.com/) hoặc [swiftmailer] (http://swiftmailer.org/). –

+1

Phải, sử dụng thư viện nếu bạn có thể - có rất nhiều vấn đề khiến nhiều người thông minh mất rất nhiều thời gian để tìm ra. Tôi thích PHPMailer. Vấn đề có thể là nhỏ và phụ thuộc vào loại máy chủ SMTP của bạn. Một thư viện sẽ xử lý những vấn đề này. –

+1

Mihai đã chạm vào điểm này, nhưng php 'mail()' thường không đủ cho bất kỳ dự án thực sự nào. Tôi đề nghị PHPMailer. Phải mất 5 phút để thiết lập và rất mạnh mẽ. Tôi không khuyến khích bất kỳ mô-đun thư PEAR nào. –

Trả lời

1
+1

PHPMailer là lựa chọn tốt nhất và dễ thực hiện cũng nhờ đề nghị – user2172726

+0

@ user2172726 chào mừng !!! Chúng tôi ở đây để giúp đỡ nhau .... vì vậy nhờ vào Stack Overflow !!! –

0

Bạn có $file$filepdf cả hai được đặt thành '1.png'. Đặt $filepdf="1.pdf" để phần còn lại của tiêu đề là chính xác.

0

Đây là mã cho nhiều file đính kèm trong email chức năng ..

Tôi đã tạo ra các chức năng cho nhiều tập tin đính kèm. và kiểm tra điều này.

/* 
    * Function Name: sentMail 
    * Scope  : Sent Mail Function with CC , BCC and Attachment files.. 
    * Input  : Recipient Name   => $recipientName // (Required) 
    *    Recipient MailId(Many) => $recipientMailId // (Required & Array Format) 
    *    Subject Content   => $subjectContent // (Required) 
    *    Message Content   => $messageContent // (Required) 
    *    Sender MailId    => $senderMailId // (Required) 
    *    Sender Name(Many)   => $senderName  // (Required) 
    *    Recipient CC MailId  => $recipientCCMailId //(Optional & Array Format) 
    *    Recipient BCC MailId  => $recipientBCCMailId //(Optional & Array Format) 
    *    Attachment Files   => $attachmentFiles  //(Optional & Array Format) 
    * Output  : Sent mail to the Recipient. 
    */ 
    public function sentMail($recipientName,$recipientMailId,$subjectContent,$messageContent,$senderName,$senderMailId,$recipientCCMailId,$recipientBCCMailId,$attachmentFiles) 
    { 
     try 
     { 
      /*Get the Mulitple Recipient CC MailId*/ 
      if(isset($recipientCCMailId)){ 
       if(count($recipientCCMailId)>1){ 
        $recipientCCMailId = implode(',',$recipientCCMailId); 
       } 
       else{ 
        $recipientCCMailId = $recipientCCMailId[0]; 
       } 
      } 

      /*Get the Mulitple Recipient BCC MailId*/ 
      if(isset($recipientBCCMailId)){ 
       if(count($recipientBCCMailId)>1){ 
        $recipientBCCMailId = implode(',',$recipientBCCMailId); 
       } 
       else{ 
        $recipientBCCMailId = $recipientBCCMailId[0]; 
       } 
      } 

      /*** Mail Contents Starts ***/ 
       $subj = $subjectContent; 
       $msg =""; 

       /*Get the Mulitple Recipient BCC MailId*/ 
       if(count($recipientMailId)>1){ 
        $recipientMailId = implode(',',$recipientMailId); 
        $msg .="Dear, <b>All</b>\r <br>"; 
       } 
       else{ 
        $recipientMailId = $recipientMailId[0]; 
        $msg .="Dear, <b>".ucwords($user_name)."</b> \r <br>"; 
       } 
       $msg .=$messageContent."\r <br><br>"; 
       $msg .="Thank you"."\r\n\n <br>"; 
       $msg .=$senderName."\r\n\n <br><br>"; 

       $headers =""; 

       /** Get the Mulitple Attachment files and Attachment Process Starts **/ 
       if(isset($attachmentFiles)){ 
        $headers .= "From: ".$senderMailId."\r\n"; 
        $headers .= "Cc: ".$recipientCCMailId."\r\n"; 
        $headers .= "Bcc: ".$recipientBCCMailId."\r\n"; 
        // 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 
        $msg .= "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . 
        "Content-Transfer-Encoding: 7bit\n\n" . $msg . "\n\n"; 

        // preparing attachments 
        for($i=0;$i<count($attachmentFiles);$i++) 
        { 
         if(is_file($attachmentFiles[$i])) 
         { 
          $msg .= "--{$mime_boundary}\n"; 
          $fp  = @fopen($attachmentFiles[$i],"rb"); 
          $data = @fread($fp,filesize($attachmentFiles[$i])); 
             @fclose($fp); 
          $data = chunk_split(base64_encode($data)); 
          $msg .= "Content-Type: application/octet-stream; name=\"".basename($attachmentFiles[$i])."\"\n" . 
          "Content-Description: ".basename($attachmentFiles[$i])."\n" . 
          "Content-Disposition: attachment;\n" . " filename=\"".basename($attachmentFiles[$i])."\"; size=".filesize($attachmentFiles[$i]).";\n" . 
          "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
         } 
        } 
        $msg .= "--{$mime_boundary}--"; 
       } 
       /** Attachment Process Ends **/ 
       else{ 
        $headers .= "MIME-Version: 1.0" . "\r\n"; 
        $headers .= "Content-type:text/html;charset=utf-8" . "\r\n"; 
        //$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n"; 
        $headers .= "From: ".$senderMailId."\r\n"; 
        $headers .= "Cc: ".$recipientCCMailId."\r\n"; 
        $headers .= "Bcc: ".$recipientBCCMailId."\r\n"; 
       } 
      /*** Mail Contents Ends ***/  
      $sent_mail=mail($recipientMailId,$subj,$msg,$headers); 
      if($sent_mail) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch (Exception $e) 
     { 
      getConnection('close'); 
      echo "Caught Exception:",$e->getMessage(); 
     } 
    } 
+0

Điều này có thể giúp ích cho bạn. – MKV

0

tôi đang đối mặt với cùng một vấn đề. Vấn đề là với ranh giới mime. Không thêm "-". $ Uid. "-"; sau mỗi tệp đính kèm. Thêm ranh giới trước khi loại nội dung đính kèm là đủ.

Các vấn đề liên quan