从Thunderbird保存电子邮件正文及其附件

时间:2012-01-03 13:48:32

标签: javascript thunderbird thunderbird-addon

我正在尝试使用自定义插件从javascript中保存电子邮件正文及其附件,我无法按照http://forums.mozillazine.org/viewtopic.php?f=19&t=2030903中所述进行操作。您有任何建议吗?电子邮件正文是否可以保存为本机EML格式?谢谢!

alert("Messages selected: " + gFolderDisplay.selectedCount);
let enumerator = gFolderDisplay.selectedMessages;
for each (let msgHdr in fixIterator(enumerator, Ci.nsIMsgDBHdr)) {
    var messageID = msgHdr.messageId;
    alert("MessageID: " + messageID);
    var subject = msgHdr.mime2DecodedSubject;
    alert("Subject: " + subject);
    MsgHdrToMimeMessage(msgHdr, null, function (aMsgHdr, aMimeMsg) {
        try {
            alert("Size of the message: " + aMimeMsg.size);
            alert("Structure of the message:\n" + aMimeMsg.prettyString(true, undefined, true));
            let attachments = aMimeMsg.allUserAttachments || aMimeMsg.allAttachments;
            alert("Number of attachments: " + attachments.length);
            for (let [index, att] in Iterator(attachments))
            {
                alert ("URL: " + att.url  + " Name: " + att.name);
                let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);  
                let neckoURL = null;  
                neckoURL = ioService.newURI(att.url, null, null);  
                neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);  
                let uri = neckoURL.uri;  
                let attInfo = new AttachmentInfo(att.contentType, att.url, att.name, uri, att.isExternal);
                attInfo.save();
            }
        } catch (err) {
            alert(err);
        }
    }, true, { examineEncryptedParts: true, });
}

[编辑]上面的代码确实保存了附件,但它打开了SaveAs对话框。可以安静地完成吗?电子邮件正文是否可以保存为本机EML格式?谢谢! [/编辑]

1 个答案:

答案 0 :(得分:4)

我写了上面的例子。你差不多完成了,你找出了最困难的部分。这就是我刚才想弄清楚如何回答你的问题。

  1. 我在AttachmentInfo上运行了mxr搜索,结果发现是在http://mxr.mozilla.org/comm-central/source/mail/base/content/msgHdrViewOverlay.js#1643定义的
  2. 结果save只是nsIMessenger :: saveAttachment的代理,定义在http://mxr.mozilla.org/comm-central/source/mailnews/base/public/nsIMessenger.idl#81
  3. 事实证明那里有一个saveAttachmentToFile方法!可能你需要什么。阅读定义,它似乎是一个很好的候选人http://mxr.mozilla.org/comm-central/source/mailnews/base/src/nsMessenger.cpp#614
  4. 你可能需要传递一个已经打开的nsIFile函数(参见https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile,因为那里有很好的参考资料),以及附件的URI(在代码中以uri形式提供),消息的uri(可能是msgHdr.folder.getUriForMsg(msgHdr)的内容),内容类型(此处为att.contentType),以及实现nsIUrlListener的监听器(在此处定义:http://mxr.mozilla.org/comm-central/source/mailnews/base/public/nsIUrlListener.idl#48,请参阅{ {3}}对于一个非常准确的实现 - 你应该把你自己的函数挂钩到那里检查一切正常。)

    我没有试过这段代码,但我非常有信心这些指导方针是合理的。