Сохранить тело письма и его вложения из Thunderbird - PullRequest
2 голосов
/ 03 января 2012

Я пытаюсь сохранить тело письма и его вложения из 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] Приведенный выше код сохраняет вложения, но открывает диалоговое окно SaveAs. Это можно сделать тихо? Можно ли сохранить тело письма в родном формате EML? Спасибо! [/ EDIT]

1 Ответ

4 голосов
/ 05 апреля 2012

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

  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 для очень скромной реализации - вы, вероятно, должны подключить свои собственные функции там, чтобы проверить, что все прошло нормально).

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

...