2011-01-03 51 views
14

Làm thế nào để gửi email với tập tin đính kèm sơ yếu lý lịch,php gửi email với tập tin đính kèm

tôi mất đoạn từ nơi này Click here

này Trong trang web này, đoạn hoạt động tốt,

Thậm chí tôi đã nhận mail, nhưng tập tin đính kèm không hoạt động, đang nhận được attment như noname với 0KB

tập tin kích thước, phát hành trong đoạn đó là gì,

+0

có thể trùng lặp của [Gửi email có tệp đính kèm trong PHP?] (http://stackoverflow.com/questions/1214646/send-email-with-attachments-in-php) –

+0

Vui lòng tìm kiếm câu hỏi hiện có/câu trả lời trước khi bạn đăng câu hỏi - đây không phải là g mới vòng và mọi người có lẽ sẽ không có xu hướng gỡ lỗi một số tập lệnh bạn đã chọn trên internet. –

Trả lời

39
function mail_attachment($to, $subject, $message, $from, $file) { 
    // $file should include path and filename 
    $filename = basename($file); 
    $file_size = filesize($file); 
    $content = chunk_split(base64_encode(file_get_contents($file))); 
    $uid = md5(uniqid(time())); 
    $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection 
    $header = "From: ".$from."\r\n" 
     ."MIME-Version: 1.0\r\n" 
     ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n" 
     ."This is a multi-part message in MIME format.\r\n" 
     ."--".$uid."\r\n" 
     ."Content-type:text/plain; charset=iso-8859-1\r\n" 
     ."Content-Transfer-Encoding: 7bit\r\n\r\n" 
     .$message."\r\n\r\n" 
     ."--".$uid."\r\n" 
     ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n" 
     ."Content-Transfer-Encoding: base64\r\n" 
     ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n" 
     .$content."\r\n\r\n" 
     ."--".$uid."--"; 
    return mail($to, $subject, "", $header); 
} 
+2

+1 Nhưng bạn có thể tạo cấu trúc mã tốt hơn không? – sv88erik

+1

Có, đã viết những năm trước và chưa thực sự xem xét mã kể từ đó. Tôi đã làm sạch nó rất nhiều ngay bây giờ. Mã này hiện chưa được kiểm tra. Nên được chính xác như nhau mặc dù ... chỉ ít dòng và hiệu quả hơn. – dqhendricks

+0

:) Có lẽ một chút không gian trước khi trở về? Và tôi sẽ bao gồm thông số charset tối ưu, $ pCharset = "ISO-8859-1" – sv88erik

4

Nếu bạn KHÔNG cố gắng tìm hiểu cách thực hiện nó bằng tay và chỉ muốn gửi một email có tệp đính kèm, thì bạn nên sử dụng một số loại thư viện cho điều đó. Tôi khuyên bạn nên SwiftMailer, tôi đã thử rất nhiều thư viện và thư viện này hoạt động tốt nhất. Kiểm tra mức độ dễ dàng để thêm tệp đính kèm bằng SwiftMailer tại đây: http://swiftmailer.org/docs/attaching-files

+0

nhưng điều này không yêu cầu cài đặt SwiftMailer lên máy chủ của bạn ?? ... nhiều webhost không cho phép cài đặt các mô-đun/thư viện bổ sung. – dsdsdsdsd

+2

SwiftMailer là một thư viện, do đó không có gì để "cài đặt" - chỉ cần tải lên các tệp nguồn và sử dụng chúng. –

3

Đặt cược tốt nhất của bạn là sử dụng thư viện MIME Mail PEAR để xử lý tệp đính kèm. Nó dễ dàng hơn và sạch hơn và bạn sẽ ít bị lỗi.

PEAR Mime Mail

Bạn có thể đính kèm tập tin vào một email đơn giản như thế này:

$headers['From'] = '[email protected]'; 
$headers['To'] = '[email protected]'; 
$headers['Subject'] = 'Email Subject'; 

$mime = new Mail_mime("\r\n"); 
$mime->setTXTBody('Email text'); 
$mime->addAttachment($filedata, 'application/octet-stream', 'filename', true, 'base64'); 

//Prepare the message to be sent 
$body = $mime->get(); 
$headers = $mime->headers($headers); 

//Send the message via SMTP 
$mail_obj =& Mail::factory('smtp', array('host' => 'mail.domain.com', 'port' => 25)); 
$mail_obj->send($to, $headers, $body); 
+0

cách sử dụng PERL? ... PHP có thể thực hiện việc này mà không cần sử dụng 2 ngôn ngữ .. – sv88erik

+0

PEAR không phải là PERL. PEAR là một hệ thống khung và phân phối cho các thành phần PHP có thể tái sử dụng. http://pear.php.net/ –

+0

Đọc nhanh hơn một chút. Dù sao, điều này có vẻ hơi overklill cho một điều dễ dàng như vậy. – sv88erik

0

Nếu bạn chỉ muốn gửi một hình thức đơn giản với một tập tin đính kèm đơn mã này có lẽ là điều tốt nhất và dễ nhất để sử dụng là mã sau nó hoạt động tốt.

chức năng submitSupportTicket() {

if(isset($_POST['submit'])) 
{ 

    $company = $_POST['company']; 
    $url = $_POST['url']; 
    $issue = $_POST['issue']; 

    $screenshot = basename($_FILES['screenshot']['name']); 

    $fileType = substr($screenshot, strrpos($screenshot, '.') + 1); 

    $fileSize = $_FILES['screenshot']['size']/1024; 

    $allowedFileTypes = array("jpg", "jpeg", "gif", "bmp", 'png'); 

    $allowedExt = false; 

    for($i=0; $i<sizeof($allowedFileTypes); $i++) 
    { 

     if(strcasecmp($allowedFileTypes[$i],$fileType) == 0) 
     { 

      $allowedExt = true; 

     } 

    } 

    if(!$allowedExt) 
    { 

     setMessage('The uploaded file is not supported file type. Only the following file types are supported: '.implode(',',$allowed_extensions), 0); 
     header('Location: '.currentURL()); 
     exit; 

    } 

    $filePath = 'mediaLibrary/attachments'.$screenshot; 

    $tmpPath = $_FILES['screenshot']['tmp_name']; 

    if(is_uploaded_file($tmpPath)) 
    { 

     if(!copy($tmpPath, $filePath)) 
     { 

      echo 'There was an error attaching the file.'; 
      exit; 

     } 

    } 

    $attachment = chunk_split(base64_encode(file_get_contents($_FILES['screenshot']['tmp_name']))); 

    $fileName = $_FILES['screenshot']['name']; 

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



    $headers = "From: [email protected]\r\nReply-To: [email protected]"; 
     $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\""; 

     $message = "This is a multi-part message in MIME format. 

--_1_$boundary 
Content-Type: multipart/alternative; boundary=\"_2_$boundary\" 

--_2_$boundary 
Content-Type: text/plain; charset=\"iso-8859-1\" 
Content-Transfer-Encoding: 7bit 

Company: $company 
URL: $url 
Issue: $issue 

Submitted from minttwist.com 

--_2_$boundary-- 
--_1_$boundary 
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment 
--_1_$boundary--"; 

    $to = '[email protected]'; 

    $subject = 'Support Request - '.$company; 

    mail($to, $subject, $message, $headers); 

    echo 'We have received your support request.'; 

    header('Location: '.currentURL()); 

} 

} 
-1

Tôi không thấy câu trả lời cho câu hỏi của bạn bất cứ nơi nào ở trên, vì vậy tôi sẽ cố gắng cung cấp thêm một ít thông tin có thể giúp.

Tôi đã có cùng một vấn đề chính xác ngay hôm nay. Tôi đã xây dựng một loạt các tệp PDF, sau đó được chuyển đổi thành một tệp tar.gz duy nhất và gói tệp này tôi muốn gửi email tới một nhân viên xử lý người sẽ trả lời các tài liệu này bằng hiện vật. Tuy nhiên, khi tôi sử dụng các tập lệnh khác nhau để tạo định dạng tin nhắn MIME chính xác, tôi đã kết thúc gửi tệp đính kèm có kích thước là 0 kB với tổng kích thước là "noname".

Với rất nhiều người cung cấp cùng một câu trả lời, tôi tự nghĩ rằng có câu trả lời phải chính xác và vấn đề phải ở đâu đó khác. Câu trả lời cho vấn đề không phải là định dạng nội dung thư, cũng như không nằm trong tiêu đề của bạn. Mọi thứ đều đúng. Vấn đề nằm trong các ứng dụng thư tồn tại giữa ứng dụng của bạn và địa chỉ e-mail của người nhận.

Tôi đã chuyển mã của mình đến máy chủ sản xuất và thư được gửi mà không gặp bất kỳ sự cố nào và cùng một tệp mà trước đây được gửi dưới dạng "noname 0kb" hiện được gửi dưới dạng "MikeyPoochigian_2013_05_10__16_28_27.tar.gz 241kb".

Tôi chưa biết nguyên nhân gây ra lỗi cụ thể này, nhưng tôi cho rằng đó là câu trả lời tương tự với câu trả lời tôi đã học vào đầu năm nay khi ứng dụng thư của tôi gửi tới gmail nhưng không gửi tới các máy chủ thư khác. Trong trường hợp cụ thể đó, các ứng dụng thư đã lọc nội dung cho SPAM giữa máy tính xách tay phát triển của tôi (có tên miền nội bộ là DevelopmentLaptop.local) và địa chỉ e-mail cuối cùng. Bởi vì máy chủ gốc của tôi được gửi từ miền "DovelopmentLaptop.địa phương ", và bởi vì tên miền này không được đăng ký với bất kỳ DNS nào như một địa chỉ đã biết, các máy chủ thư đó đã giải thích các thư kiểm tra của tôi là spam. Tôi nghi ngờ vấn đề tương tự đang can thiệp ngay bây giờ với các thư đang được gửi đi.

Câu trả lời dài bây giờ ngắn (nếu có thể), hãy thử chuyển mã của bạn đến một máy chủ sản xuất với một miền công cộng đã đăng ký và xem nó có hoạt động hay không. Nếu có, thì nó không phải là mã của bạn cần được sửa.

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