2012-01-03 2 views
2

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

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]

ответ

4

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

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

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

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