使用javascript(thunderbird)获取邮件正文

时间:2014-11-26 21:16:14

标签: javascript thunderbird-addon

我正在开发一个雷鸟扩展,我想获得收到消息的消息体 我用过这个功能,但它不起作用...... 我怎样才能做到这一点?

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

1 个答案:

答案 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); 
}

希望这有帮助!

相关问题