2011-12-08 44 views
5

Tôi đã sử dụng mã này để gửi email có tệp đính kèm bằng php, nhưng có lỗi trong phần đính kèm vì tôi nhận được email và tệp đính kèm xuất hiện trong nội dung. trước khi tôi sử dụng cùng một mã và nó đã hoạt động thành công. tại sao???gửi email có tệp đính kèm bằng cách sử dụng php

<?php 
// sending email with attachments 

    function sendEmail($to,$from,$file,$ext){ 

     $to = "[email protected]"; 
    $from = "[email protected]"; 
     $subject = "Translation Request"; 

    $random_hash = md5(date('r', time())); 

    $headers = "From: [email protected]\r\nReply-To: [email protected]"; 

    $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 

    $attachment = chunk_split(base64_encode(file_get_contents("Test.doc"))); 

    $output = " 
     --PHP-mixed-$random_hash; 
     Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash' 
     --PHP-alt-$random_hash 
     Content-Type: text/plain; charset='iso-8859-1' 
     Content-Transfer-Encoding: 7bit 

     Hello World! 
     This is the simple text version of the email message. 

     --PHP-alt-$random_hash 
     Content-Type: text/html; charset='iso-8859-1' 
     Content-Transfer-Encoding: 7bit 

     <h2>Hello World!</h2> 
     <p>This is the <b>HTML</b> version of the email message.</p> 

     --PHP-alt-$random_hash-- 

     --PHP-mixed-$random_hash 
     Content-Type: application/doc; name=Test.doc 
     Content-Transfer-Encoding: base64 
     Content-Disposition: attachment 

     $attachment 
     --PHP-mixed-$random_hash--"; 
     $send = @mail($to, $subject, $output, $headers); 
    return $send; 
    } 
?> 

vui lòng trợ giúp.

+0

thể trùng lặp của [Làm thế nào để gửi email với tập tin đính kèm sử dụng PHP?] (Http://stackoverflow.com/questions/2027069/how-to-send-email-with-attachment-using-php) – mario

+0

Mã của bạn không đáng để sửa. Nó btw thụt đầu dòng phá vỡ đánh dấu MIME. – mario

Trả lời

2

Bạn có thể thực hiện theo cách mô tả this mô tả hoặc bạn có thể sử dụng một trong các mô-đun PEAR để gửi email có tệp đính kèm theo cách mô tả this.

Sử dụng PEAR có lẽ là lựa chọn tốt hơn vì dễ thực hiện hơn. Điểm báo trước duy nhất là PEAR không khả dụng trên tất cả các máy chủ.

6

vì lý do gì không sử dụng phpmailer? ví dụ cho một tập tin đính kèm:

function mandaMail ($nombredest, $maildest, $asunto, $cuerpo) { 
require_once("mailer/class.phpmailer.php"); 
$mail = new PHPMailer(true); 
$mail->IsSMTP(); 

try { 
    $mail->Host = "xxxx"; $mail->Port = 25; // smtp server 
    $mail->SMTPAuth = true; 
    $mail->Username = "xxxx"; // smtp username 
    $mail->Password = "xxxx"; // smtp pass 
    $mail->AddReplyTo("xxxx", "xxxx"); // email & name 
    $mail->SetFrom("xxxx", "xxxx"); // similar to up value 

    $mail->AddAddress($maildest, $nombredest); 
    $mail->Subject = $asunto; 
    $mail->MsgHTML(file_get_contents($cuerpo)); 

    $mail->AddAttachment("xxxx", "xxxx"); // attachments directory, attachment name (ie: dir/blah.jpg, blah.jpg) 
    $mail->Send(); 

} catch (phpmailerException $e) { echo $e->errorMessage(); 
} catch (Exception $e) { echo $e->getMessage(); } 
+0

^Thêm xoăn ở cuối –

+0

đã xóa thêm dấu –

0

Tôi đang sử dụng này:

function attachfile($file, $type = "application/octetstream") { 
    if(!($fd = fopen($file, "r"))) { 
     $this->errstr = "Error opening $file for reading."; 
     return 0; 
    } 
    $_buf = fread($fd, filesize($file)); 
    fclose($fd); 

    $fname = $file; 
    for($x = strlen($file); $x > 0; $x--) 
     if($file[$x] == "/") 
     $fname = substr($file, $x, strlen($file) - $x); 

    // Convert to base64 becuase mail attachments are not binary safe. 
    $_buf = chunk_split(base64_encode($_buf)); 

    $this->attachments[$file] = "\n--" . $this->boundary . "\n"; 
    $this->attachments[$file] .= "Content-Type: $type; name=\"$fname\"\n"; 
    $this->attachments[$file] .= "Content-Transfer-Encoding: base64\n"; 
    $this->attachments[$file] .= "Content-Disposition: attachment; " . 
            "filename=\"$fname\"\n\n"; 
    $this->attachments[$file] .= $_buf; 

    return 1; 
    } 
0

Mã của bạn sẽ không được làm việc, bởi vì hỗ trợ doesnt email khoảng trắng.

$output = " 
     --PHP-mixed-$random_hash; 
     Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash' 
     --PHP-alt-$random_hash 
     Content-Type: text/plain; charset='iso-8859-1' 
     Content-Transfer-Encoding: 7bit 

Bạn phải sử dụng mà không cần khoảng trắng

$output = " 
--PHP-mixed-$random_hash; 
Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash' 
--PHP-alt-$random_hash 
Content-Type: text/plain; charset='iso-8859-1' 
Content-Transfer-Encoding: 7bit 
0

Tôi đang sử dụng này và (với bằng cách sử dụng PHPMailer), Hy vọng điều này là hữu ích cho bạn .

<form enctype="multipart/form-data" method="POST" action=""> 
    <label>Your Name <input type="text" name="sender_name" /> </label> <br> 
    <label>Your Email <input type="email" name="sender_email" /> </label> <br> 
    <label>Subject <input type="text" name="subject" /> </label> <br> 
    <label>Message <textarea name="message"></textarea> </label> <br> 
    <label>Attachment <input type="file" name="my_file" /></label><br> 
    <label><input type="submit" name="button" value="Submit" /></label> 
</form> 

<?php 
echo "<pre>";print_r($_REQUEST);echo "</pre>"; //comment this line 
echo "<pre>";print_r($_FILES);echo "</pre>"; //comment this line 
if($_POST && isset($_FILES['my_file'])) 
{ 

    $from_email   = '[email protected]_domain.com'; //from mail, it is mandatory with some hosts 
    $recipient_email = '[email protected]'; //recipient email (most cases it is your personal email) 

    //Capture POST data from HTML form and Sanitize them, 
    $sender_name = filter_var($_POST["sender_name"], FILTER_SANITIZE_STRING); //sender name 
    $reply_to_email = filter_var($_POST["sender_email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header 
    $subject  = filter_var($_POST["subject"], FILTER_SANITIZE_STRING); //get subject from HTML form 
    //$message  = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message 
    $message  = "Name : ".$sender_name."\nMessage : ".$_POST["message"]; //message 

    //Get uploaded file data 
    $file_tmp_name = $_FILES['my_file']['tmp_name']; 
    $file_name  = $_FILES['my_file']['name']; 
    $file_size  = $_FILES['my_file']['size']; 
    $file_type  = $_FILES['my_file']['type']; 
    $file_error  = $_FILES['my_file']['error']; 

    if($file_error > 0) 
    { 
     die('Upload error or No files uploaded'); 
    } 
    //read from the uploaded file & base64_encode content for the mail 
    $handle = fopen($file_tmp_name, "r"); 
    $content = fread($handle, $file_size); 
    fclose($handle); 
    $encoded_content = chunk_split(base64_encode($content)); 

     $boundary = md5("sanwebe"); 
     //headers 
     $headers = "MIME-Version: 1.0\r\n"; 
     $headers .= "From:".$from_email."\r\n"; 
     $headers .= "Reply-To: ".$reply_to_email."" . "\r\n"; 
     $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 

     //body plain text 
     $body = "--$boundary\r\n"; 
     $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"; 
     $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
     $body .= chunk_split(base64_encode($message)); 

     //attachment file 
     $body .= "--$boundary\r\n"; 
     $body .="Content-Type: $file_type; name=".$file_name."\r\n"; 
     $body .="Content-Disposition: attachment; filename=".$file_name."\r\n"; 
     $body .="Content-Transfer-Encoding: base64\r\n"; 
     $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
     $body .= $encoded_content; 
    $sentMail = @mail($recipient_email, $subject, $body, $headers); 
    if($sentMail) //output success or failure messages 
    {  
     die('Thank you for your email'); 
    }else{ 
     die('Could not send mail!'); 
    } 
} 
?> 
Các vấn đề liên quan