2016-12-17 7 views
1

Я пишу расширение Thunderbird, и мне интересно, есть ли способ создать сообщение и сохранить его в какой-то папке. Код будет выглядеть так.Создать и сохранить сообщение в папке

create nsIMsgDBHdr header 
header.subject = sub 
header.from = from 
header.to = to 
header.body = body // although nsIMsgDBHdr doesen't have body attr 
nsIMsgFolder folder 
folder.save(header) 

Сейчас я использую добрый грязный способ выполнить эту работу. Я собираю сообщение для отправки позже, сохраняя его в локальной исходящей папке, а затем перемещаю в заданной папке.

var localSrv = accountManager.FindServer("nobody", "Local Folders", "none"); 
var localAcc = accountManager.FindAccountForServer(localSrv); 
var outbox = localSrv.rootFolder.getChildNamed("Outbox"); 
var inbox = server.rootFolder.getChildNamed("Inbox"); 
var account = accountManager.FindAccountForServer(server); 

let compFields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields); 
compFields.subject = subject; 
compFields.from = fromAddr; 
compFields.to = toAddr; 
compFields.body = body; 

let msgComposeParams = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams); 
msgComposeParams.composeFields = compFields; 

let gMsgCompose = Components.classes["@mozilla.org/messengercompose/compose;1"].createInstance(Components.interfaces.nsIMsgCompose); 
gMsgCompose.initialize(msgComposeParams); 
gMsgCompose.SendMsg(Components.interfaces.nsIMsgCompDeliverMode.Later, 
        account.defaultIdentity, // identity 
        account.key, // account 
        null, // message window 
        null); // nsIMsgProgress 

let copyService = Components.classes["@mozilla.org/messenger/messagecopyservice;1"].getService(Components.interfaces.nsIMsgCopyService); 

var jsMsgHdrArray = []; 
var newestDate = -1; 
var newestHdr; 

for (let msgHdr in fixIterator(outbox.messages, Components.interfaces.nsIMsgDBHdr)) 
{ 
    if (msgHdr.date > newestDate) 
    { 
     newestHdr = msgHdr; 
     newestDate = msgHdr.date; 
    } 
} 

jsMsgHdrArray.push(newestHdr); 
let xpcomHdrArray = toXPCOMArray(jsMsgHdrArray, Components.interfaces.nsIMutableArray); 
copyService.CopyMessages(outbox, xpcomHdrArray, inbox, true, null, null, false); 

ответ

1

После нескольких часов просмотра базы данных mozilla я нашел удовлетворительное решение.

let source = "From - Sat Nov 1 12:39:54 2008\n" + 
      "X-Mozilla-Status: 0001\n" + 
      "X-Mozilla-Status2: 00000000\n" + 
      "Message-ID: <" + msgId + ">\n" + 
      "Date: Wed, 11 Jun 2008 20:32:02 -0400\n" + 
      "From: Tester <[email protected]>\n" + 
      "MIME-Version: 1.0\n" + 
      "To: [email protected]\n" + 
      "Subject: " + aSubject + "\n" + 
      "Content-Type: text/plain; charset=ISO-8859-1\n" + 
      "Content-Transfer-Encoding: 7bit\n" + 
      "\n" + aBody + "\n"; 

folder.QueryInterface(Components.interfaces.nsIMsgLocalMailFolder); 
folder.addMessage(source);