0

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

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

很明显,如果您想对消息头进行持久更改,例如将其标记为已读、已回复或其他任何内容,您必须通过其对应的 nsIMsgFolder (msgHdr.folder) 或 nsIMsgDatabase (msgHdr.folder. msg 数据库)。

但是我无法编写工作代码,因为我无法获得 nsIMsgDatabase,但即使我可以为实际的 msgHdrDb 拥有这个对象,我也应该使用一些我无法弄清楚的提交类型调用 Commit(type)。谁能帮我举一些例子,如何对 msgHdrDb 中的消息进行永久更改?

提前感谢您的帮助!

4

3 回答 3

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 (header tools lite) 的源代码即可看看他们是怎么做的。

干杯,

于 2013-09-27T21:18:52.087 回答
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];
}
于 2013-09-23T16:50:32.650 回答
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
});
于 2016-05-09T08:01:55.307 回答