2012-04-02 59 views
10

tôi đang phát triển một trang web mà người dùng có thể gửi thư và đính kèm bất kỳ loại tệp nào vào một id thư cụ thể. Tôi cần thêm chủ đề thư, nội dung và tệp đính kèm vào cơ sở dữ liệu. Tôi đang làm điều này bằng cách sử dụng cron. Ngoại trừ các chấp trước mọi thứ đều hoạt động hoàn hảo. Tôi đã thấy một số bài viết tạo liên kết tải xuống. Vì tôi đang sử dụng cron tôi không thể làm điều đó bằng tay.cách tải xuống thư đính kèm vào thư mục cụ thể bằng IMAP và php

 $hostname = '{xxxx.net:143/novalidate-cert}INBOX'; 
     $username = '[email protected]'; 
     $password = 'zzzz'; 
     /* try to connect */ 
     $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to : ' . imap_last_error()); 
     $emails = imap_search($inbox,'ALL'); 

       if($emails) { 
      $output = ''; 
      rsort($emails); 
      foreach($emails as $email_number) { 
      $structure = imap_fetchstructure($inbox, $email_number); 
      $name = $structure->parts[1]->dparameters[0]->value; // name of the file 
      $type = $structure->parts[1]->type; //type of the file 
}} 

tôi có thể có được loại hình và tên của các tập tin nhưng không biết làm thế nào để tiến hành thêm

Bất kỳ một hãy giúp tôi. Cảm ơn bạn ...

Trả lời

6

Để lưu tệp đính kèm dưới dạng tệp, bạn cần phải phân tích cú pháp cấu trúc của thư và đưa ra tất cả các phần là tệp đính kèm trên chính tệp đó (bố cục nội dung). Bạn nên quấn đó vào lớp học của riêng mình, do đó bạn có quyền truy cập dễ dàng và bạn có thể xử lý các lỗi dễ dàng hơn theo thời gian, email phân tích cú pháp có thể mong manh:

$savedir = __DIR__ . '/imap-dump/'; 

$inbox = new IMAPMailbox($hostname, $username, $password); 
$emails = $inbox->search('ALL'); 
if ($emails) { 
    rsort($emails); 
    foreach ($emails as $email) { 
     foreach ($email->getAttachments() as $attachment) { 
      $savepath = $savedir . $attachment->getFilename(); 
      file_put_contents($savepath, $attachment); 
     } 
    } 
} 

Mã của các lớp này là nhiều hơn hoặc ít hơn gói các imap_... các hàm, nhưng đối với các lớp đính kèm, nó cũng đang thực hiện phân tích các cấu trúc. You find the code on github. Hy vọng điều này là hữu ích.

+0

cảm ơn bạn rất nhiều ... & + 1.Bây giờ làm việc của mình – Juice

+0

Xin chào @LimiJerin, Bạn sẽ rất tử tế để đăng các mã hoạt động tại đây? có vẻ như không hoạt động từ đầu của tôi, không phải tệp đính kèm đang được tải xuống –

5

Mặc dù sử dụng PHP + Cron và máy chủ thư chuẩn có thể hoạt động, số lượng công việc cần thiết để xử lý tất cả các trường hợp cạnh, báo cáo lỗi, v.v. có thể không đáng giá. Mặc dù tôi đã không sử dụng nó, Postmark Inbound có vẻ như một dịch vụ đáng kinh ngạc (trả tiền) sẽ loại bỏ hầu hết các nhức đầu của quá trình xử lý email thông qua api imap PHP.

Nếu bạn muốn xử lý mọi thứ qua PHP, bạn có thể muốn kiểm tra this resource.

+0

Đừng bao giờ đánh giá thấp gánh nặng để tích hợp và báo cáo lỗi khi xóa các dịch vụ. Đặc biệt là các trường hợp cạnh. – hakre

+0

Đúng - cả hai bên chắc chắn phải được cân nhắc. Nếu việc xử lý email không phải là cốt lõi trong dự án của bạn, tốt nhất bạn nên viết cho riêng mình, nhưng nếu bạn đang tìm cách đơn giản hóa gia công phần mềm xử lý email đến, logic đó có thể là một lựa chọn tốt. – iloveitaly

0

Trong trường hợp nếu bạn muốn tải file đính kèm như zip

$zip = new ZipArchive(); 
$tmp_file = tempnam('.', ''); 
$zip->open($tmp_file, ZipArchive::CREATE); 

$mailbox = $connection->getMailbox('INBOX'); 
foreach ($mailbox->getMessage() as $message) { 
    $attachments = $message->getAttachments(); 
    foreach ($attachments as $attachment) { 
     $zip->addFromString($attachment->getFilename(), $attachment->getDecodedContent()); 
    } 
} 

$zip->close(); 

# send the file to the browser as a download 
header('Content-disposition: attachment; filename=download.zip'); 
header('Content-type: application/zip'); 
readfile($tmp_file); 

This code uses library hosted on GitHub. Hy vọng điều này là hữu ích.

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