在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代码中为此创建变通方法的任何想法吗?
答案 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编码文件以及未内联的任何其他附件。观察大文件的内存使用情况。
如果它们不完全相同,它也不会覆盖同名的现有文件。