如果可能的话,我需要一些帮助。我开发了一个插件,它在发送过程中为字母添加额外的 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
});