2008-10-02 6 views
6

Tôi đã chiến đấu với chức năng đọc email của PHP cho phần tốt hơn trong hai ngày. Tôi đang viết một kịch bản để đọc email từ một hộp thư và lưu bất kỳ tệp đính kèm nào vào máy chủ. Nếu bạn đã từng làm điều gì đó tương tự, bạn có thể hiểu nỗi đau của tôi: PHP không hoạt động tốt với email!Làm cách nào để lưu tệp đính kèm email vào máy chủ bằng PHP?

Tôi đã kết nối với máy chủ POP3 và tôi có thể lặp lại các tệp. Dưới đây là đường viền thô của mã:

if (!$mbox = imap_open ("{myserver.com:110/pop3/notls}INBOX", "u", "p")) 
    die ('Cannot connect/check mail! Exiting'); 

if ($hdr = imap_check($mbox)) 
    $msgCount = $hdr->Nmsgs; 
else 
    die ("Failed to get mail"); 

foreach ($overview as $message) { 
    $msgStruct = imap_fetchstructure($mbox, $message->msgno); 

    // if it has parts, there are attachments that need reading 
    if ($msgStruct->parts) { 
     foreach ($msgStruct->parts as $key => $part) { 
      switch (strtoupper($part->subtype)) { 
       case 'GIF': case 'JPEG':case 'PNG': 

        //do something - but what?! 

        break; 
      } 
     } 
    } 
} 

Tôi đã đánh dấu nơi tôi bị kẹt. Tôi có thể sử dụng imap_fetchbody($mbox, $message->msgno, $key+1) nhưng điều đó mang lại cho tôi một loạt dữ liệu như sau:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S 
EhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU 
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR 
CAHiAi0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA 
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK 
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG 
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA 
... 

Tôi tin rằng đây là dữ liệu MIME. Tôi cần nó như một hình ảnh! Tôi đã nhìn thấy một số lớp học ném bom trên internet mà yêu cầu bồi thường để làm thủ thuật cần thiết. Tôi không thể khiến bất kỳ ai trong số họ làm việc. Tôi không hiểu tại sao tôi lại gặp khó khăn như vậy!

Trong ngắn, tôi đang tìm một thứ có thể biến chuỗi MIME thô thành dữ liệu thực.

+0

bạn đã kiểm tra mã hóa tệp đính kèm là gì chưa? – kender

+0

bạn có thể đăng một đoạn mã hoàn chỉnh hơn không? tôi không thể có vẻ để có được nó để làm việc bc im không chắc chắn nơi tổng quan $ là đến từ – st4ck0v3rfl0w

+0

Tôi có cùng một vấn đề như của bạn. Tôi đã tìm thấy một số bài viết hay và tôi nghĩ rằng nó có thể giúp bạn http://www.linuxscope.net/articles/mailAttachmentsPHP.html tận hưởng nó :) – Hassan

Trả lời

4

Tôi tìm thấy một hướng dẫn nhanh cách xử lý email với PHP: here.

Ở dưới cùng của trang đó có một tập tin đính kèm thân echo:

if (substr($ContentType,0,4) == "text") { 
echo imap_qprint($fileContent); 
} else { 
echo imap_base64($fileContent); 
} 

Tôi đoán đây là những gì bạn có thể cần ...

(chỉnh sửa: trong trường hợp của bạn nếu nó là hình ảnh luôn bạn có thể bỏ qua phần if. và tất nhiên, lưu tập tin thay vì lặp lại nó :)

+0

Làm việc như một sự quyến rũ. Vâng tôi đã làm việc phát hiện kiểu nội dung (với câu lệnh switch của tôi) nên tôi chỉ cần imap_base64. – Oli

1

MIME dữ liệu là cơ sở-64 được mã hóa, vì vậy tôi nghĩ rằng bạn sẽ có thể giải mã nó bằng cách sử base64_decode

1

bạn có thể sử dụng chức năng imap_base64 và chỉ ra rằng vào một tập tin, hoặc sử dụng imap_savebody

+0

imap_savebody (từ kinh nghiệm gần đây của tôi) lưu dữ liệu được mã hóa (giống như khi bạn chạy tìm nạp) – Oli

1

Khung công tác Zend chứa Zend_Mail, điều này sẽ làm cho việc đọc thư trở nên dễ dàng hơn nhiều và Zend_Mime, mà tôi tin rằng có thể phân tích cú pháp thông điệp nhiều phần trăm thành một cấu trúc dữ liệu hợp lý.

http://framework.zend.com/manual/en/zend.mail.read.html

+0

Tôi rất muốn có thể triển khai trên Khung công tác Zend nhưng giới hạn lưu trữ hạn chế nó. Đó là một điều đáng tiếc thực sự bởi vì chức năng đọc thư trong PHP thuần tuý bị xoắn vượt quá mọi hiểu biết logic. – Oli

+0

Đây có phải là kích thước của khung làm việc giúp bạn quay trở lại không? Gói ứng dụng web zend framework của chúng tôi khi nó không có sẵn trên máy chủ web của khách hàng. –