Class: Imap::Backup::Account::Folder
- Inherits:
-
Object
- Object
- Imap::Backup::Account::Folder
- Extended by:
- Forwardable
- Includes:
- RetryOnError
- Defined in:
- lib/imap/backup/account/folder.rb
Constant Summary collapse
- BODY_ATTRIBUTE =
"BODY[]".freeze
- UID_FETCH_RETRY_CLASSES =
[EOFError, Errno::ECONNRESET, IOError].freeze
- APPEND_RETRY_CLASSES =
[Net::IMAP::BadResponseError].freeze
- PERMITTED_FLAGS =
%i(Answered Draft Flagged Seen).freeze
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
- #add_flags(uids, flags) ⇒ Object
- #append(message) ⇒ Object
- #clear ⇒ Object
- #create ⇒ Object
- #delete_multi(uids) ⇒ Object
- #exist? ⇒ Boolean
- #fetch_multi(uids, attr = [BODY_ATTRIBUTE, "FLAGS"]) ⇒ Object
-
#folder ⇒ Object
Deprecated: use #name.
-
#initialize(connection, name) ⇒ Folder
constructor
A new instance of Folder.
- #remove_flags(uids, flags) ⇒ Object
- #set_flags(uids, flags) ⇒ Object
- #uid_validity ⇒ Object
- #uids ⇒ Object
- #unseen(uids) ⇒ Object
Methods included from RetryOnError
Constructor Details
#initialize(connection, name) ⇒ Folder
Returns a new instance of Folder.
24 25 26 27 28 |
# File 'lib/imap/backup/account/folder.rb', line 24 def initialize(connection, name) @connection = connection @name = name @uid_validity = nil end |
Instance Attribute Details
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
19 20 21 |
# File 'lib/imap/backup/account/folder.rb', line 19 def connection @connection end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
20 21 22 |
# File 'lib/imap/backup/account/folder.rb', line 20 def name @name end |
Instance Method Details
#add_flags(uids, flags) ⇒ Object
116 117 118 119 120 121 |
# File 'lib/imap/backup/account/folder.rb', line 116 def add_flags(uids, flags) # Use read-write access, via `select` client.select(utf7_encoded_name) flags.reject! { |f| f == :Recent } client.uid_store(uids, "+FLAGS", flags) end |
#append(message) ⇒ Object
94 95 96 97 98 99 100 101 102 103 |
# File 'lib/imap/backup/account/folder.rb', line 94 def append() body = .imap_body date = .date&.to_time flags = .flags & PERMITTED_FLAGS retry_on_error(errors: APPEND_RETRY_CLASSES, limit: 3) do response = client.append(utf7_encoded_name, body, flags, date) flags = .flags & PERMITTED_FLAGS extract_uid(response) end end |
#clear ⇒ Object
128 129 130 131 132 133 134 |
# File 'lib/imap/backup/account/folder.rb', line 128 def clear existing = uids return if existing.empty? add_flags(existing, [:Deleted]) client.expunge end |
#create ⇒ Object
42 43 44 45 46 |
# File 'lib/imap/backup/account/folder.rb', line 42 def create return if exist? client.create(utf7_encoded_name) end |
#delete_multi(uids) ⇒ Object
105 106 107 108 |
# File 'lib/imap/backup/account/folder.rb', line 105 def delete_multi(uids) add_flags(uids, [:Deleted]) client.expunge end |
#exist? ⇒ Boolean
35 36 37 38 39 40 |
# File 'lib/imap/backup/account/folder.rb', line 35 def exist? examine true rescue FolderNotFound false end |
#fetch_multi(uids, attr = [BODY_ATTRIBUTE, "FLAGS"]) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/imap/backup/account/folder.rb', line 73 def fetch_multi(uids, attr = [BODY_ATTRIBUTE, "FLAGS"]) examine fetch_data_items = retry_on_error(errors: UID_FETCH_RETRY_CLASSES) do client.uid_fetch(uids, attr) end return nil if fetch_data_items.nil? fetch_data_items.map do |item| attributes = item.attr { uid: attributes["UID"], body: attributes[BODY_ATTRIBUTE], flags: attributes["FLAGS"] } end rescue FolderNotFound nil end |
#folder ⇒ Object
Deprecated: use #name
31 32 33 |
# File 'lib/imap/backup/account/folder.rb', line 31 def folder name end |
#remove_flags(uids, flags) ⇒ Object
123 124 125 126 |
# File 'lib/imap/backup/account/folder.rb', line 123 def remove_flags(uids, flags) client.select(utf7_encoded_name) client.uid_store(uids, "-FLAGS", flags) end |
#set_flags(uids, flags) ⇒ Object
110 111 112 113 114 |
# File 'lib/imap/backup/account/folder.rb', line 110 def set_flags(uids, flags) client.select(utf7_encoded_name) flags.reject! { |f| f == :Recent } client.uid_store(uids, "FLAGS", flags) end |
#uid_validity ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/imap/backup/account/folder.rb', line 48 def uid_validity @uid_validity ||= begin examine client.responses["UIDVALIDITY"][-1] end end |
#uids ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/imap/backup/account/folder.rb', line 56 def uids examine client.uid_search(["ALL"]).sort rescue FolderNotFound [] rescue NoMethodError = "Folder '#{name}' caused a NoMethodError. " \ "Probably this was `undefined method `[]' for nil:NilClass (NoMethodError)` " \ "in `search_internal` in stdlib net/imap.rb. " \ 'This is caused by `@responses["SEARCH"] being unset/undefined. ' \ "Among others, Apple Mail servers send empty responses when " \ "folders are empty, causing this error." Logger.logger.warn [] end |
#unseen(uids) ⇒ Object
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/imap/backup/account/folder.rb', line 136 def unseen(uids) = uids.map(&:to_s).join(",") examine client.uid_search([, "UNSEEN"]) rescue NoMethodError # Apple Mail returns an empty response when searches have no results [] rescue FolderNotFound nil end |