我正在开发一个雷鸟扩展,我想获得收到消息的消息体 我用过这个功能,但它不起作用...... 我怎样才能做到这一点?
function getMessageBody() {
let messageURI = GetLoadedMessage();
let aMessageHeader = messenger.msgHdrFromURI(messageURI);
// I try
// aMessageHeader = messenger.messageServiceFromURI(messageURI).messageURIToMsgHdr(messageURI);
// aMessageHeader = url.QueryInterface(Components.interfaces.nsIMsgMessageUrl).messageHeader;
// too
let messenger = Components.classes["@mozilla.org/messenger;1"]
.createInstance(Components.interfaces.nsIMessenger);
let listener = Components.classes["@mozilla.org/network/sync-stream-listener;1"]
.createInstance(Components.interfaces.nsISyncStreamListener);
let uri = aMessageHeader.folder.getUriForMsg(aMessageHeader);
messenger.messageServiceFromURI(uri)
.streamMessage(uri, listener, null, null, false, "");
let folder = aMessageHeader.folder;
return folder.getMsgTextFromStream(listener.inputStream,
aMessageHeader.Charset,
65536,
32768,
false,
true, {});
}
答案 0 :(得分:1)
你是否在mailListener中调用了getMessageBody()来拦截新传入的电子邮件? 在那种情况下,我有同样的问题,在mailListener的msgAdded方法中,流的消息尚不可用。我认为这是因为nsISyncStreamListener使用阻塞流。看到我的问题:How to intercept incoming email and retrieve message body in thunderbird
如果您正在尝试获取特定“文件夹”中已有邮件的邮件正文(而不是拦截新传入的电子邮件),那么您需要首先获取nsIMsgDBHdr,然后从中获取uri以进行流式处理身体。以下代码为我工作,我迭代特定文件夹的所有消息。
for each (let aMessageHeader in fixIterator(folder.msgDatabase.EnumerateMessages(), Ci.nsIMsgDBHdr)){
let messenger = Components.classes["@mozilla.org/messenger;1"]
.createInstance(Components.interfaces.nsIMessenger);
let listener = Components.classes["@mozilla.org/network/sync-stream-listener;1"]
.createInstance(Components.interfaces.nsISyncStreamListener);
let uri = aMessageHeader.folder.getUriForMsg(aMessageHeader);
messenger.messageServiceFromURI(uri).streamMessage(uri, listener, null, null, false, "");
let folder = aMessageHeader.folder;
let messageBody = folder.getMsgTextFromStream(listener.inputStream,
aMessageHeader.Charset,
65536,
32768,
false,
true,
{ });
alert("message body : " + messageBody);
}
希望这有帮助!