如何使用PHP将电子邮件附件保存到服务器?
时间:2020-03-06 15:01:44 来源:igfitidea点击:
在过去两天的大部分时间里,我一直在与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字符串转换为真实数据的东西。
解决方案
MIME数据是基于base-64编码的,因此我认为我们应该能够使用base64_decode对其进行解码
我在这里找到了如何使用PHP处理电子邮件的快速指南。
在该页面的底部,有一个附件主体echo
:
if (substr($ContentType,0,4) == "text") { echo imap_qprint($fileContent); } else { echo imap_base64($fileContent); }
我想这就是我们可能需要的...
(编辑:在情况下,如果总是图像,则可以跳过" if"部分。当然,请保存文件而不是回显它:)
我们可以使用imap_base64
函数并将其输出到文件中,或者使用imap_savebody
Zend框架包含Zend_Mail和Zend_Mime,它应该使阅读邮件变得更加容易,而Zend_Mime可以将多部分的mime消息解析为一个合理的数据结构。
http://framework.zend.com/manual/en/zend.mail.read.html