【问题标题】:Save e-mail body and its attachments from Thunderbird从 Thunderbird 保存电子邮件正文及其附件
【发布时间】:2012-02-01 13:13:08
【问题描述】:

我正在尝试使用自定义插件从 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, });
}

[编辑] 上面的代码确实保存了附件,但它打开了另存为对话框。可以悄悄地做吗?邮件正文是否可以保存为原生 EML 格式?谢谢! [/编辑]

【问题讨论】:

    标签: javascript thunderbird thunderbird-addon


    【解决方案1】:

    我写了上面的例子。你几乎完成了,你找出了最难的部分。这是我刚刚为弄清楚如何回答您的问题所做的工作。

    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

    您可能需要向函数传递一个已经打开的 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,请参阅https://github.com/protz/GMail-Conversation-View/blob/master/modules/message.js#L1492 以获得非常简单的实现——您可能应该将你自己的函数挂在那里以检查一切是否正常)。

    我没有尝试过这段代码,但我确信这些准则是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2010-09-12
      • 1970-01-01
      • 2017-12-12
      相关资源
      最近更新 更多