2011-09-08 129 views
2

我正在檢索電子郵件,然後解析到數據庫中。如何在php中保存電子郵件的附件?

但問題是我能夠檢索電子郵件,但附件部分也顯示在瀏覽器上。我需要將此附件保存到某個位置。附件格式爲text/plain。

這裏是我的代碼

<?php 
    $inbox=imap_open("{xyz.com:995/pop3/ssl/novalidate-cert}INBOX", "username", "password"); 
    $count = imap_num_msg($inbox); 

    for($i = 1; $i <= 1; $i++) { 
    $raw_body = imap_body($inbox, $i); 
    echo $raw_body; 
    imap_delete($inbox, 1); 
    } 
    imap_expunge ($inbox); 
?> 

這裏我有一個retrievd電子郵件

但我不知道如何保存附件。 當我使用imap_body時,附件也顯示在電子郵件正文的下方。

所以,我應該怎麼用imap_fetchstructure()分析郵件區分開這兩個..

回答

0

你可以得到一個列表,郵件的不同部分。有了imap_fetchstructure(),你實際上會將這些零件帶給你。查看註釋中示例代碼的後面的文檔。

1

那麼現在你知道如何從Lars響應的電子郵件源中提取附件。 我想你可能還需要解碼附件。 要做到這一點,你需要知道它是如何編碼的。 1. BASE64_ENCODE() 2. chunk_split()

代碼編碼文件看起來是這樣的:

<?php 
$body .= "--".$boundary1 . $this->line; 
$body .= "Content-Type: " . $file_type . "; name=\"" . $file_name . "\"" . $this->line; 
$body .= "Content-Transfer-Encoding: base64" . $this->line; 
$body .= "Content-Disposition: attachment; filename=\"" . $file_name . "\"; size=" . $file_size . ";" . $this->line; 
$body .= $this->line; // empty line 

$fp = fopen($file_url, 'r'); 
do { 
    $data = fread($fp, 8192); 
    if (strlen($data) == 0) break; 
    $content .= $data; 
} 
while (true); 

$body .= chunk_split(base64_encode($content)); 
$body .= $this->line; 
$body .= $this->line; 
?> 

的結果是這樣的:

--ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 
Content-Type: text/plain; name="sample.txt" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename="sample.txt"; size=123; 

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== 

現在解碼它需要以相反的方式再做兩件事。 1.取編碼部分並去掉所有行,這樣你有一個單一的線串 2.解碼它 ..當然保存文件到磁盤:)