Class: Imap::Backup::Downloader

Inherits:
Object
  • Object
show all
Defined in:
lib/imap/backup/downloader.rb

Overview

Downloads as yet undownloaded emails from an account’s server

Defined Under Namespace

Classes: MultiFetchFailedError

Instance Method Summary collapse

Constructor Details

#initialize(folder, serializer, multi_fetch_size: 1, reset_seen_flags_after_fetch: false) ⇒ Downloader

Returns a new instance of Downloader.

Parameters:

  • folder (Account::Folder)

    the remote folder to download from

  • serializer (Serializer)

    the local serializer that stores messages

  • multi_fetch_size (Integer) (defaults to: 1)

    how many messages to fetch per batch

  • reset_seen_flags_after_fetch (Boolean) (defaults to: false)

    true to restore unseen flags after fetch



15
16
17
18
19
20
21
22
23
# File 'lib/imap/backup/downloader.rb', line 15

def initialize(folder, serializer, multi_fetch_size: 1, reset_seen_flags_after_fetch: false)
  @folder = folder
  @serializer = serializer
  @multi_fetch_size = multi_fetch_size
  @reset_seen_flags_after_fetch = reset_seen_flags_after_fetch
  @folder_uids = nil
  @serializer_uids = nil
  @uids = nil
end

Instance Method Details

#runvoid

This method returns an undefined value.

Runs the downloader



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/imap/backup/downloader.rb', line 27

def run
  debug("#{serializer_uids.count} messages already downloaded")
  debug("#{folder_uids.count} messages on server")
  local_only_count = (serializer_uids - folder_uids).count
  if local_only_count.positive?
    debug("#{local_only_count} downloaded messages no longer on server")
  end

  if uids.none?
    debug("no new messages on server — skipping")
    return
  end

  info("#{uids.count} new messages")

  download
rescue Net::IMAP::ByeResponseError
  folder.client.reconnect
  retry
end