如何在php中保存电子邮件的附件?

时间:2011-09-08 08:51:14

标签: php email imap

我正在检索电子邮件,然后解析到数据库中。

但问题是我能够检索电子邮件,但附件部分也会显示在浏览器上。我需要将此附件部分保存到某个位置。附件的格式为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);
?>

这里我有一个电子邮件

但我不知道如何保存附件。 当我使用imap_body时,附件也显示在电子邮件正文下方。

那么我应该如何分开这两个......

2 个答案:

答案 0 :(得分: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.获取编码部分并去除所有行,这样就有一个单行字符串 解码它 ..当然将文件保存到磁盘:)

答案 1 :(得分:0)

通过使用imap_fetchstructure()分析邮件,您可以获得邮件不同部分的列表。使用imap_fetchstructure(),您实际上会对您感兴趣。在评论中查看后面的文档以获取示例代码。