Вопрос очень хороший . Я придумал решение (довольно варварское), но столкнулся с проблемами при реализации.
Идея решения такая. Нужно установить Filtaquilla (вообще полезная вещь) и в её настройках задать возможность использовать собственный JavaScript при поиске. Затем создать виртуальную папку, отображающую такие сообщения из «All Mail», для которых в папках ярлыков нет сообщений с идентичным Message-ID.
В первом приближении код выглядит так:
let messageID = message.messageId; let subfolders = Cc["@mozilla.org/supports-array;1"] .createInstance(Ci.nsISupportsArray); Cc["@mozilla.org/messenger/account-manager;1"] .getService(Ci.nsIMsgAccountManager) .FindServer('mylogin@gmail.com', 'imap.googlemail.com', 'imap') .rootFolder .ListDescendents(subfolders); ( ( function() { for each (let subfolder in fixIterator(subfolders, Ci.nsIMsgFolder)) { if (!subfolder.getFlag(0x40405720)) { let messages = subfolder.messages; while(messages.hasMoreElements()) { let _message = messages.getNext(); if (_message.messageId == messageID) {return false;} } } } return true; } )() )
Проблема в том, что _message.messageId чаще всего undefined. Не всегда, конечно. Если письмо с ярлыком было только что просмотрено, то соответствующий nsiMsgDBHdr всё-таки имеет правильный messageId.
Значение mailnews.customDBHeaders установлено в message-id, папки переиндексированы. Что ему ещё нужно, кто знает?
Отредактировано luitzen (14-09-2010 13:11:50)
Отсутствует
Что ему ещё нужно, кто знает?
А не хватает ему сказанного в нужном месте следующего:
uzi1, считаю вопрос решённым, если нужно что-то дополнительно разъяснить, спрашивайте.
Отсутствует
ОК, последовательность действий такая.
let messageID = message.messageId; let subfolders = Cc["@mozilla.org/supports-array;1"] .createInstance(Ci.nsISupportsArray); Cc["@mozilla.org/messenger/account-manager;1"] .getService(Ci.nsIMsgAccountManager) .FindServer('mylogin@gmail.com', 'imap.googlemail.com', 'imap') .rootFolder .ListDescendents(subfolders); ( ( function() { for each (let subfolder in fixIterator(subfolders, Ci.nsIMsgFolder)) { if (!subfolder.getFlag(0x40405720)) { let messages = subfolder.messages; while(messages.hasMoreElements()) { let _message = messages.getNext() .QueryInterface(Ci.nsIMsgDBHdr); if (_message.messageId == messageID) {return false;} } } } return true; } )() )
В восьмой строке нужно указать свой логин. Поиск дубликатов производится во всех папках, кроме стандартных и виртуальных.
Отредактировано luitzen (14-09-2010 13:08:17)
Отсутствует