PHP类ImapMailbox不下载附件

时间:2013-04-06 21:32:24

标签: php class email imap

在Windows上运行带有PHP 5.3的Apache 2.2 8.尝试让PHP类ImapMailbox下载附件,但每次getMail()时,附件值在每个有附件的电子邮件上都是空的。

所有其余的电子邮件信息都已正确下载。

我查看了类代码,但无法确定问题所在。

这是我目前的代码:

$mailbox = new ImapMailbox('{testsite.com:110/pop3/novalidate-cert}INBOX', 'testemail@testsite.com', 'MyPaSs', ATTACH_DIR, 'utf-8');

$mails = array();

foreach($mailbox->searchMailbox('SUBJECT "test attach" SINCE "' . date('m/d/Y', strtotime('-1 week')) . '"') as $mailId) {
        $mail = $mailbox->getMail($mailId);
       $mails[] = $mail;
}

在getMail()中转储$ data var后,会出现winmail.dat格式的附件。代码无法访问这些代码,因为由于空的“ifid”值而未分配attachmentId值。解码winmail.dat附件可以完成,但前提是它们被检测到并写入文件。

有关如何在ImapMailbox代码中为此创建变通方法的任何想法吗?

1 个答案:

答案 0 :(得分:1)

以下是我所写的解决此问题的方法。

在initMailPart()方法的开头,添加以下内容:

static $altAttachmentId = 0;

if($this->attachmentsDir) {的IF块结尾处添加以下结束}括号的位置:

} elseif (!empty($params['fileName']) || !empty($params['filename']) || !empty($params['name'])) { // Process attachments that are not inline.
                            // Check if need to decode TNEF (Winmail.dat) file.
                            if ($partStructure->ifsubtype && $partStructure->subtype == 'MS-TNEF') {
                                require_once 'path_to_your/tnef_decoder.php';

                                $Tnef = new tnef_decoder;

                                $un_tnef = $Tnef->decompress($data);


                                $attached_files = array();

                                foreach ($un_tnef as $f) {
                                    if (!empty($f['name']) && !empty($f['stream'])) {
                                        $attachment = new IncomingMailAttachment();

                                        $attachment->id = $altAttachmentId;
                                        $attachment->name = $f['name'];
                                        $attachment->filePath = $this->attachmentsDir . DIRECTORY_SEPARATOR . preg_replace('~[\\\\/]~', '', $f['name']);

                                        $mail->addAttachment($attachment);

                                        if (file_exists($attachment->filePath) && md5($f['stream']) != md5_file($attachment->filePath)) {
                                            $attachment->filePath = $this->attachmentsDir . DIRECTORY_SEPARATOR . preg_replace('~[\\\\/]~', '', $mail->id . '_' . $altAttachmentId . '_' . $f['name']);
                                        }

                                        file_put_contents($attachment->filePath, $f['stream']);

                                        $altAttachmentId++;
                                    }
                                }
                            } else {
                                if (!empty($params['filename'])) {
                                    $fileName = $params['filename']; // Account for random camel-case mistake on element.
                                } elseif (!empty($params['fileName'])) {
                                    $fileName = $params['fileName'];
                                } else {
                                    $fileName = $params['name'];
                                }

                                $attachment = new IncomingMailAttachment();
                                $attachment->id = $altAttachmentId;
                                $attachment->name = $fileName;
                                $attachment->filePath = $this->attachmentsDir . DIRECTORY_SEPARATOR . preg_replace('~[\\\\/]~', '', $mail->id . '_' . $altAttachmentId . '_' . $fileName);

                                $mail->addAttachment($attachment);

                                file_put_contents($attachment->filePath, $data);

                                $altAttachmentId++;
                            }
                        }

请注意,必须包含Roundcube Webmail包中的tnef_decoder.php文件才能使TNEF解码正常工作。我获得了TNEF解决方案的灵感here

此修改将处理Winmail.dat文件中的所有TNEF编码文件以及未内联的任何其他附件。观察大文件的内存使用情况。

如果它们不完全相同,它也不会覆盖同名的现有文件。