【发布时间】:2017-12-11 02:23:43
【问题描述】:
我正在构建一个系统,允许 Intranet 用户将文件拖放到我们 ColdFusion 站点上的 div 中,经过一些验证后,该系统会自动将它们上传到文件服务器。我的要求之一是:当上传的文件是 .msg 文件(Outlook 电子邮件)时,提取作为该电子邮件附件的所有文件并单独上传。这可以使用org.apache.poi.hsmf.MAPIMessage Java 对象来实现。
使用以下代码,我可以看到列出的每个附件对象。然后我可以获取他们的文件名和扩展名并将每个文件保存到本地文件系统。
但是,如果附件是另一个 .msg 文件,这将不起作用。当我在附加的.msg 文件上调用getEmbeddedAttachmentObject() 时,它返回一个仅包含“未定义”的对象。非.msg 文件返回一个二进制对象,然后我可以将其传递给FileWrite() ColdFusion 函数。对MAPIMessage 对象的进一步检查表明它有一个write() 方法,但在调用它时我收到一条错误消息:
注意 - 此文件格式尚不支持写入,抱歉。
http://poi.apache.org 上的文档也支持这一点。
总而言之,我可以毫无问题地将每个电子邮件附件写入文件系统,除非附件是另一封电子邮件。是我运气不好还是有其他方法可以做到这一点?
<cfscript>
// Load test .msg into MAPIMessage object
MAPIMessage = createObject("java", "org.apache.poi.hsmf.MAPIMessage");
message = MAPIMessage.init('C:\Test\Test Email 1 Attachment.msg');
// Get array of attached files
attachments = message.getAttachmentFiles();
// If attachments were found
if(arrayLen(attachments) > 0) {
// Loop over each attachment
for (i=1; i LTE arrayLen(attachments); i++) {
// Dump the current attachment object
writeDump( attachments[i] );
// Get current attachment's binary data
local.data=attachments[i].getEmbeddedAttachmentObject();
// Dump binary data
writeDump( local.data );
// Get attachment's filename and extension
attachmentFileName = attachments[i].attachLongFileName.toString();
attachmentExtension = attachments[i].attachExtension.toString();
// Dump filename and extension
writeDump( attachmentFileName );
writeDump( attachmentExtension );
// Write attachment to local file system
FileWrite("#expandPath('/')##attachments[i].attachLongFileName.toString()#", local.data);
}
}
</cfscript>
【问题讨论】:
标签: java email coldfusion outlook apache-poi