使用 JavaScript 获取消息正文 (Thunderbird)

get message body using javascript (thunderbird)

本文关键字:Thunderbird 正文 消息 JavaScript 获取 使用      更新时间:2023-09-26

>我正在开发一个雷鸟扩展,我想获取收到的消息的消息正文。
我使用了这个功能,但它不起作用...我怎样才能做到这一点?

 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, {});
 }

您是否在拦截新传入电子邮件的 mailListener 中调用 getMessageBody()?在这种情况下,我遇到了同样的问题,其中要流式传输的消息在 mailListener 的 msgAdd 方法中尚不可用。我认为这是因为nsISyncStreamListener使用阻塞流。看我的问题:如何在雷鸟中拦截传入的电子邮件并检索邮件正文

如果您尝试在特定"文件夹"中获取已经可用的邮件的邮件正文(而不是拦截新的传入电子邮件),那么您需要先掌握 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); 
}

希望这有帮助!