Сохранение тела сообщения электронной почты и его вложений из Thunderbird

Я пытаюсь сохранить тело сообщения электронной почты и его вложения из javascript с помощью специальной надстройки, и мне не удается сделать это, как описано в http://forums.mozillazine.org/viewtopic.php?f=19&t=2030903 У вас есть предложения? Можно ли сохранить тело сообщения электронной почты в родном формате EML? Спасибо!

alert("Messages selected: " + gFolderDisplay.selectedCount);
let enumerator = gFolderDisplay.selectedMessages;
for each (let msgHdr in fixIterator(enumerator, Ci.nsIMsgDBHdr)) {
    var messageID = msgHdr.messageId;
    alert("MessageID: " + messageID);
    var subject = msgHdr.mime2DecodedSubject;
    alert("Subject: " + subject);
    MsgHdrToMimeMessage(msgHdr, null, function (aMsgHdr, aMimeMsg) {
        try {
            alert("Size of the message: " + aMimeMsg.size);
            alert("Structure of the message:\n" + aMimeMsg.prettyString(true, undefined, true));
            let attachments = aMimeMsg.allUserAttachments || aMimeMsg.allAttachments;
            alert("Number of attachments: " + attachments.length);
            for (let [index, att] in Iterator(attachments))
            {
                alert ("URL: " + att.url  + " Name: " + att.name);
                let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);  
                let neckoURL = null;  
                neckoURL = ioService.newURI(att.url, null, null);  
                neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);  
                let uri = neckoURL.uri;  
                let attInfo = new AttachmentInfo(att.contentType, att.url, att.name, uri, att.isExternal);
                attInfo.save();
            }
        } catch (err) {
            alert(err);
        }
    }, true, { examineEncryptedParts: true, });
}

[EDIT] Приведенный выше код сохраняет вложения, но открывает диалоговое окно «Сохранить как». Можно ли это сделать тихо? Можно ли сохранить тело сообщения электронной почты в родном формате EML? Спасибо! [/РЕДАКТИРОВАТЬ]


person Ștefan-Mihai MOGA    schedule 03.01.2012    source источник


Ответы (1)


Я написал пример выше. Вы почти закончили, и вы выяснили самые сложные части. Вот что я только что сделал, чтобы понять, как ответить на ваш вопрос.

  1. Я выполнил поиск mxr по AttachmentInfo, который, как оказалось, определен по адресу http://mxr.mozilla.org/comm-central/source/mail/base/content/msgHdrViewOverlay.js#1643
  2. Оказывается, save — это просто прокси для nsIMessenger::saveAttachment, определенный в http://mxr.mozilla.org/comm-central/source/mailnews/base/public/nsIMessenger.idl#81
  3. Также оказывается, что там есть метод saveAttachmentToFile! Наверное, то, что вам нужно. Судя по определению, это хороший кандидат на http://mxr.mozilla.org/comm-central/source/mailnews/base/src/nsMessenger.cpp#614

Вероятно, вам нужно передать функции уже открытый nsIFile (см. https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile, так как там есть хороший справочный материал), а также URI вложения (доступен как uri в вашем коде), uri сообщения (возможно, что-то вроде строк msgHdr.folder.getUriForMsg(msgHdr)), тип содержимого (att.contentType здесь) и прослушиватель, реализующий nsIUrlListener (определенный здесь: http://mxr.mozilla.org/comm-central/source/mailnews/base/public/nsIUrlListener.idl#48, см. https://github.com/protz/GMail-Conversation-View/blob/master/modules/message.js#L1492 для очень простой реализации - вам, вероятно, следует подключить свои собственные функции, чтобы проверить, что каждый дело пошло хорошо).

Я не пробовал этот код, но я уверен, что рекомендации верны.

person Jonathan Protzenko    schedule 04.04.2012