如何做nsIMsgDBHdr永久更改提交

时间:2013-09-19 09:40:00

标签: javascript xpcom thunderbird-addon

如果可能的话,我需要一些帮助。我开发了一个插件,在发送过程中为字母添加了额外的StringReference标头。

在“已发送”文件夹中,我想收集threadId(这没关系),并从标题中删除额外的StringReference。我找到了以下http://mdn.beonex.com/en/XPCOM_Interface_Reference/nsIMsgDBHdr.html

  

清楚,如果要对邮件头进行持久更改,   例如将其标记为已阅读,或回复,或等等,您必须这样做   通过其相应的nsIMsgFolder(msgHdr.folder)或   nsIMsgDatabase(msgHdr.folder.msgDatabase)。

但是我无法创建一个正常工作的代码,因为我无法获得nsIMsgDatabase,但即使我可以将这个对象用于实际的msgHdrDb,我也应该使用某些提交类型调用Commit(type),这是我无法弄清楚的。任何人都可以通过一些示例帮助我如何对msgHdrDb中的消息进行永久性更改吗?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我很确定这种方法不起作用,因为你只会修改本地存储的消息头,而不是实际的消息。虽然这适用于本地文件夹/ POP3帐户,但它不适用于IMAP帐户,并且更改不会传播到IMAP服务器。

https://groups.google.com/forum/#!topic/mozilla.dev.apps.thunderbird/yWGIYQ8bwfE实际上有一个关于此问题的主题;它包含大量有价值的信息,并回答您的问题。您基本上必须创建消息的新副本并将其注入文件夹。这样做,您可以修改标题。我认为最重要的是:只需查看https://addons.mozilla.org/thunderbird/addon/header-tools-lite/?src=mozilla.dev.apps.thunderbird(标题工具精简版)的源代码,看看他们是如何做到的。

干杯,

答案 1 :(得分:0)

实际上我弄清楚了。当然这并不复杂,但为了帮助别人,我回答了我的问题。

// This mail is in the INBOX folder
if (MAIL_LIST[actualMsgHdrDb.messageId] != null) {
    // This is a FORCED answer mail in INBOX folder
    // Removing marker
    log("--------------------------- Removed from MAIL LIST ----------------------------");
    log("REMOVED MESSAGE:    "
            + MAIL_LIST[actualMsgHdrDb.messageId].subject);
    actualMsgHdrDb.setReferences("");

    MAIL_LIST[actualMsgHdrDb.messageId].subject = MAIL_LIST[actualMsgHdrDb.messageId].subject
            .replace(/Forced/, "Answered");

    log("REPLACED SUBJECT:   "
            + MAIL_LIST[actualMsgHdrDb.messageId].subject);

    /* THIS IS THE PART WHERE I FLUSH THE DATA TO DISK */
    MAIL_LIST[actualMsgHdrDb.messageId].folder.msgDatabase = null;

    log("SUBJECT HAS BEEN SET TO: "
            + MAIL_LIST[actualMsgHdrDb.messageId].subject);
    // Removing from list
    delete MAIL_LIST[actualMsgHdrDb.messageId];
}

答案 2 :(得分:0)

实际上有一个开源软件包thunderbird-stdlib,它开发的就是这样做的。代码看起来像这样

Components.utils.import("chrome://path/to/thunderbird-stdlib/msgHdrUtils.js")

var msgHdr = ... get the message header ...;
msgHdrsModifyRaw([msgHdr], function(input) {
    // modify the raw input here.
    var modified = input.modify()
    return modified
});