MailKit IMAP извлекает только новые, не загруженные сообщения

Да, через DOM Manipulation:

function add() {
    var tag = document.createElement('input'); // Create a `input` element,
    tag.setAttribute('type', 'text');          // Set it's `type` attribute,
    tag.setAttribute('name', i);               // Set it's `name` attribute,

    var br = document.createElement('br');     // Create a `br` element,

    var y = document.getElementById("y");      // "Get" the `y` element,
    y.appendChild(tag);                        // Append the input to `y`,
    y.appendChild(br);                         // Append the br to `y`.
    i++;
}

Это не вызывает парсер DOM браузера, как это делает innerHTML, оставив все неповрежденным.

(innerHTML заставляет браузер повторно анализировать всю DOM, потому что все может быть добавлено с помощью innerHTML, поэтому браузер ничего не может предсказать, в отличие от добавления узла к элементу.)

Теперь, чтобы добавить это:

<li class="ie7fix" style="width:620px;">
    <div class="m_elementwrapper" style="float:left;">
        <label class="fieldlabel" style="width:106px;float:left;padding-top:3px;" for="p1f4">
            <span>
                <span class="pspan arial" style="text-align:right;font-size:14px;">
                    <span class="ispan" xml:space="preserve">
                    </span>
                </span>
            </span>
        </label>
        <div style="float:left;width:475px;" class="m_elementwrapper">
            <input type="text" style="font-family:Arial, Helvetica, sans-serif;font-size:14px;width:244px;max-width:244px;" name="' + i + '"  class="fieldcontent">
            <div class="fielderror">
            </div>
        </div>
    </div>
    <div style="clear:both;font-size:0;">
    </div>
</li>

Вам понадобится:

function add() {
    // Create elements
    var d1 = c('div'),  s1 = c('span'), ip = c('input'),
        d2 = c('div'),  s2 = c('span'), li = c('li'),
        d3 = c('div'),  s3 = c('span'), la = c('label'),
        d4 = c('div');
    // You can "chain" `appendChild`.
    // `li.appendChild(d1).appendChild(la);` is the same as `li.appendChild(d1); d1.appendChild(la);`
    li.appendChild(d1).appendChild(la).appendChild(s1).appendChild(s2).appendChild(s3);
    d1.appendChild(d2).appendChild(ip);
    d2.appendChild(d3);
    li.appendChild(d4);

    setAttributes(
        [li, d1, la, s2, s3, d2, ip, d3, d4],
        [
            {'class':"ie7fix",              'style':"width:620px;"  },
            {'class':"m_elementwrapper",    'style':"float:left;"   },
            {'class':"fieldlabel",          'style':"width:106px;float:left;padding-top:3px;", 'for':"p1f4" },
            {'class':"pspan arial",         'style':"text-align:right;font-size:14px;"  },
            {'class':"ispan",               'xml:space':"preserve"  },
            {'class':"m_elementwrapper",    'style':"float:left;width:475px;"   },
            {'class':"fieldcontent",        'type':"text",      'style':"font-family:Arial, Helvetica, sans-serif;font-size:14px;width:244px;max-width:244px;", 'name':''+i},
            {'class':"fielderror"   },
            {'style':"clear:both;font-size:0;"  }
        ]
    );
    var br = document.createElement('br');     // Create a `br` element,
    var y = document.getElementById("y");      // "Get" the `y` element,
    y.appendChild(li);                         // Append the input to `y`,
    y.appendChild(br);                         // Append the br to `y`.
    i++;
}

// Apply a array of attributes objects {key:value,key:value} to a array of DOM elements.
function setAttributes(elements, attributes){
    var el = elements.length,
        al = attributes.length;
    if(el === al){
        for(var n = 0; n < el; n++){
            var e = elements[n],
                a = attributes[n];
            for(var key in a){
                e.setAttribute(key, a[key]);
            }
        }
    }else{
        console.error("Elements length " + el + " does not match Attributes length " + al);
    }
}

// Alias for shorter code.
function c(type){
    return document.createElement(type);
};
1
задан jstedfast 17 January 2019 в 15:40
поделиться

1 ответ

Есть ли способ сделать это?

Да, конечно. API позволяет запрашивать информацию для любого набора сообщений, который вы хотите, независимо от того, хотите ли вы ссылаться на них по индексу или по UID.

Настоящий вопрос - как? и все это зависит от двух вещей:

  1. Расширения IMAP, поддерживаемые вашим сервером IMAP
  2. Дизайн вашего почтового клиента и то, как вы решили заполнить кэш сводки сообщений. информация (необходима для заполнения вашего ListView или TreeView сообщений в вашем пользовательском интерфейсе).

Если ваш IMAP-сервер поддерживает расширение QRESYNC , вам нужно прочитать эту спецификацию, чтобы понять, как лучше ее использовать, а также взглянуть на ImapFolder. .Open (доступ к FolderAccess, uid vidValidity, ulong highModSeq, IList uids, CancellationToken cancellationToken) метод.

Если сервер IMAP не поддерживает QRESYNC, возможно, вы захотите воспользоваться преимуществом расширения CONDSTORE . Вы можете воспользоваться этим расширением, используя любой из методов Fetch () или FetchAsync (), которые принимают значение modseq.

В конце ваш код будет выглядеть примерно так (непроверено):

var uidValidity = cache.GetUidValidity ();
var known = cache.GetKnownUids ();
UniqueIdSet missing;

folder.MessageFlagsChanged += OnMessageFlagsChanged;

if (client.Capabilities.HasFlag (ImapCapabilities.QuickResync)) {
    var highestModSeq = cache.GetHighestKnownModSeq ();

    folder.MessagesVanished += OnMessagesVanished;

    // This version of the Open() method will emit MessagesVanished and MessageFlagsChanged
    // for all messages that have been expunged or have changed since the last session.
    folder.Open (FolderAccess.ReadWrite, uidValidity, highestModSeq, known);

    if (folder.UidValidity != uidValidity) {
        // our cache is no longer valid, we'll need to start over from scratch
        cache.Clear ();
        cache.SetUidValidity (folder.UidValidity);

        missing = folder.Search (SearchQuery.All);
    } else {
        // figure out which messages we are missing in our cache
        missing = new UniqueIdSet (SortOrder.Ascending);
        var all = folder.Search (SearchQuery.All);
        foreach (var uid in all) {
            if (!known.Contains (uid))
                missing.Add (uid);
        }
    }
} else {
    folder.MessageExpunged += OnMessageExpunged;
    folder.Open (ImapFolder.ReadWrite);

    if (folder.UidValidity != uidValidity) {
        // our cache is no longer valid, we'll need to start over from scratch
        cache.Clear ();
        cache.SetUidValidity (folder.UidValidity);

        missing = folder.Search (SearchQuery.All);
    } else {
        var all = folder.Search (SearchQuery.All);

        // purge messages from our cache that have been purged on the remote IMAP server
        foreach (var uid in known) {
            if (!all.Contains (uid))
                cache.Remove (uid);
        }

        // sync flag changes since our last session
        known = cache.GetKnownUids ();
        if (known.Count > 0) {
            IList<IMessageSummary> changed;
            if (client.Capabilities.HasFlag (ImapCapabilities.CondStore)) {
                var highestModSeq = cache.GetHighestKnownModSeq ();
                changed = folder.Fetch (known, highestModSeq, MessageSummaryItems.Flags | MessageSummaryItems.ModSeq | MessageSummaryItems.UniqueId);
            } else {
                changed = folder.Fetch (known, MessageSummaryItems.Flags | MessageSummaryItems.UniqueId);
            }

            foreach (var item in changed) {
                // update the cache for this message
                cache.Update (item);
            }
        }

        // figure out which messages we are missing in our cache
        missing = new UniqueIdSet (SortOrder.Ascending);
        foreach (var uid in all) {
            if (!known.Contains (uid))
                missing.Add (uid);
        }
    }
}

// fetch the summary information for the messages we are missing
var fields = MessageSummaryItems.Full | MessageSummaryItems.UniqueId;

if (client.Capabilities.HasFlag (ImapCapabilities.CondStore))
    fields |= MessageSummaryItems.ModSeq;

var newMessages = folder.Fetch (missing, fields);
foreach (var message in newMessages)
    cache.Add (message);

cache.SetHighestModSeq (folder.HighestModSeq);

И тогда вам понадобятся как минимум следующие обработчики событий:

void OnMessageFlagsChanged (object sender, MessageFlagsChangedEventArgs e)
{
    cache.Update (e.Index, e.Flags, e.ModSeq);
}

void OnMessageExpunged (object sender, MessageExpungedEventArgs e)
{
    cache.Remove (e.Index);
}

void OnMessagesVanished (object sender, MessagesVanishedEventArgs e)
{
    cache.RemoveRange (e.UniqueIds);
}
0
ответ дан jstedfast 17 January 2019 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: