2011-09-08 125 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.解码它 ..当然保存文件到磁盘:)