1

在 Windows 8 上运行 Apache 2.2 和 PHP 5.3。试图让 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 代码中为此创建解决方法?

4

1 回答 1

1

这是我写的解决此问题的内容。

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

static $altAttachmentId = 0;

在 IF 块的末尾if($this->attachmentsDir) {添加以下内容,其中右}括号是:

} 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 解决方案的灵感。

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

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

于 2013-04-07T01:04:35.267 回答