如何在PHP中将电子邮件附件保存到服务器?

如何在PHP中将电子邮件附件保存到服务器?

问题描述:

我在两天的较好时间里一直在为PHP的电子邮件阅读功能而战。我正在编写一个脚本来读取邮箱中的电子邮件并将任何附件保存到服务器上。如果你曾经做过类似的事情,你可能会明白我的痛苦:PHP在电子邮件中播放不好!如何在PHP中将电子邮件附件保存到服务器?

我已经连接到POP3服务器,我可以迭代文件。这里是代码的粗略轮廓:

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; 
      } 
     } 
    } 
} 

我已经标记了卡住的位置。我可以使用imap_fetchbody($mbox, $message->msgno, $key+1)但我得到一组数据是这样的:

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

我带领相信这是MIME数据。我需要它作为一个图像!我已经看到几个在互联网上爆炸的班级,声称要做所需的魔法。我无法让他们工作。我不明白为什么我很难找到这个!

简而言之,我正在寻找可以将原始MIME字符串变成真实数据的东西。

+0

你检查过什么是附件编码? – kender 2008-10-02 14:28:27

+0

嘿你能发布一个更完整的代码片段吗?我似乎无法得到它的工作bc我不知道$概述来自 – st4ck0v3rfl0w 2010-02-19 02:58:33

+0

我有和你一样的问题。我发现了一些很好的文章,我认为它可以帮助你 http://www.linuxscope.net/articles/mailAttachmentsPHP.html 享受它:) – Hassan 2011-09-15 12:43:37

我发现一个快速指导如何对待电子邮件与PHP将其解码:here

在该页面的底部,有一个安装基体echo

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

我想这是你可能会需要什么...

(编辑:在您的情况,如果它的形象总是你可以跳过if一部分。当然,保存文件,而不是附和它:)

MIME数据是base-64编码,所以我觉得你应该可以使用BASE64_DECODE

可以使用imap_base64功能,只是输出到文件,或者使用imap_savebody

Zend框架包含Zend_Mail,它可以使阅读邮件消息更容易,Zend_Mime,我相信它可以将多部分MIME消息解析为合理的数据结构。

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