如何做nsIMsgDBHdr永久更改提交



如果可能的话,我需要一些帮助。我开发了一个插件,它在发送过程中为字母添加额外的 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中的消息进行永久更改?

提前感谢您的帮助!

我很确定这种方法不起作用,因为您只会修改本地存储的消息标头,而不是实际的消息。虽然这适用于本地文件夹/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(标题工具精简版)的源代码即可了解它们是如何做到的。

干杯

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

// 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];
}

实际上有一个开源软件包,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
});

最新更新