2014-11-26 1 views
1

Я разрабатываю расширение thunderbird, и я хочу получить сообщение тела принятого сообщения.
Я использовал эту функцию, но она не работала ... Как я могу это достичь?Получить тело сообщения с помощью javascript (thunderbird)

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

Вы вызываете getMessageBody() в mailListener, который перехватывает новые входящие письма? В этом случае у меня такая же проблема, когда сообщение в поток еще недоступно внутри метода msgAdded mailListener. Я думаю, это потому, что nsISyncStreamListener использует блокирующий поток. см. мой вопрос: How to intercept incoming email and retrieve message body in thunderbird

Если вы пытаетесь получить тело сообщения уже доступных писем в определенной «папке» (вместо перехвата новых входящих сообщений), вам нужно сначала получить nsIMsgDBHdr, а затем получить ури из него, чтобы течь по телу. Следующий код работал для меня, где я повторяю все сообщения определенной папки.

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

надеюсь, что это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^