Чтение электронной почты через расширение Thunderbird в формате html

я использую

function MsgHdrToMimeMessage(aMsgHdr, aCallbackThis, aCallback,
                             aAllowDownload, aOptions) {

метод с http://mxr.mozilla.org/comm-central/source/mailnews/db/gloda/modules/mimemsg.js#171, чтобы прочитать выбранное письмо через расширение Thunderbird. Этот метод отлично работает, и единственная проблема заключается в том, что он дает простое текстовое сообщение, удаляя из сообщения весь HTML-код.

Как вместо этого получить html-версию сообщения?


person Vik    schedule 30.09.2013    source источник


Ответы (1)


Насколько я знаю, вы не можете получить доступ ко всему телу (с почтовыми и html-тегами). У вас есть функции и атрибуты интерфейса XPCOM с поддержкой сценариев nsIMsgDbHdr. У меня есть надстройка, которая отправляет почту. Я прочитал все тело письма с помощью следующего фрагмента кода. Как видите, я прочитал всю почту с диска и загрузил ее содержимое в переменную. Вы также можете использовать его для чтения всего тела письма.

function SendMailNow(aMsgDBHdr) {
    var aMsgURI = aMsgDBHdr.folder.getUriForMsg(aMsgDBHdr);

    var msgWindow = Components.classes["@mozilla.org/messenger/msgwindow;1"]
            .createInstance();
    msgWindow = msgWindow.QueryInterface(Components.interfaces.nsIMsgWindow);

    var msgStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"]
            .createInstance();
    msgStream = msgStream.QueryInterface(Components.interfaces.nsIInputStream);

    var aMsgService = messenger.messageServiceFromURI(aMsgURI);

    var scriptInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"]
            .createInstance();
    scriptInputStream = scriptInputStream
            .QueryInterface(Components.interfaces.nsIScriptableInputStream);

    scriptInputStream.init(msgStream);

    try {
        aMsgService.streamMessage(aMsgURI, // uri of message to stream
        msgStream, // a stream listener listening to the message
        msgWindow, // a nsIMsgWindow for progress and status feedback
        null, // a nsIUrlListener that is notified when url starts and stops
        false, // it will create a stream converter from message rfc2822 to
        null // Header added to the URI. e.g., header=filter
        );
    } catch (ex) {
    }

    // Creating content
    var content = "";
    while (scriptInputStream.available()) {
        content = content + scriptInputStream.read(512);
        if (content.match(/\r\n\r\n/) || content.match(/\n\n/)) {
            if (sendMail(content, aMsgDBHdr.messageId)) {
                log("SEND_DONE\t" + aMsgDBHdr.messageId + "\t"
                        + aMsgDBHdr.subject);
            } else {
                log("SEND_FAILED\t" + aMsgDBHdr.messageId + "\t"
                        + aMsgDBHdr.subject);
            }
        }
    }
}

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

person csikos.balint    schedule 30.09.2013
comment
этот код работает, но печатает много данных заголовка. есть ли способ печатать, начиная с тела сообщения? - person Vik; 01.10.2013
comment
Я не знаю никакой магии, чтобы сделать это. Вы самостоятельно анализируете содержимое с помощью функций, таких как replace(), match() и т. д., манипулируете строками Javascript. Как я вижу, здесь вы можете найти полезные регулярные выражения для этого. - person csikos.balint; 01.10.2013
comment
ну, это был бы обходной путь, чтобы вырезать текст и получить желаемые результаты. Мое намерение состояло в том, чтобы узнать, есть ли какой-либо другой метод или способ, который дает только тело - person Vik; 01.10.2013
comment
Я хотел написать расширение, которое показывает первые два или три слова для каждого письма в столбце. URI сообщения получен gDBView.getURIForViewIndex(row). Это работает, но Thunderbird падает при первом вызове scriptInputStream.available(), даже если я вызываю это только для одной строки. У вас есть идея, что я делаю неправильно? - person steffen; 04.02.2018