vmail 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/vmail/imap_client.rb +33 -31
- data/lib/vmail/version.rb +1 -1
- metadata +3 -3
data/lib/vmail/imap_client.rb
CHANGED
@@ -70,6 +70,18 @@ module Vmail
|
|
70
70
|
@imap.select(@mailbox)
|
71
71
|
end
|
72
72
|
|
73
|
+
def prime_connection
|
74
|
+
reconnect_if_necessary(4) do
|
75
|
+
# this is just to prime the IMAP connection
|
76
|
+
# It's necessary for some reason before update and deliver.
|
77
|
+
log "priming connection for delivering"
|
78
|
+
res = @imap.fetch(@ids[-1], ["ENVELOPE"])
|
79
|
+
if res.nil?
|
80
|
+
raise IOError, "IMAP connection seems broken"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
73
85
|
def list_mailboxes
|
74
86
|
@mailboxes ||= (@imap.list("[Gmail]/", "%") + @imap.list("", "%")).
|
75
87
|
select {|struct| struct.attr.none? {|a| a == :Noselect} }.
|
@@ -90,6 +102,7 @@ module Vmail
|
|
90
102
|
|
91
103
|
# id_set may be a range, array, or string
|
92
104
|
def fetch_envelopes(id_set)
|
105
|
+
log "fetch_envelopes: #{id_set.inspect}"
|
93
106
|
if id_set.is_a?(String)
|
94
107
|
id_set = id_set.split(',')
|
95
108
|
end
|
@@ -206,19 +219,18 @@ module Vmail
|
|
206
219
|
query.unshift "1:#@num_messages"
|
207
220
|
@all_search = false
|
208
221
|
end
|
222
|
+
log "@all_search #{@all_search}"
|
209
223
|
@query = query.join(' ')
|
210
224
|
log "search query: #@query"
|
211
|
-
ids = reconnect_if_necessary do
|
225
|
+
@ids = reconnect_if_necessary do
|
212
226
|
@imap.search(@query)
|
213
227
|
end
|
214
|
-
|
215
|
-
|
216
|
-
@
|
217
|
-
|
218
|
-
@
|
219
|
-
ids[@start_index
|
220
|
-
else
|
221
|
-
ids
|
228
|
+
# save ids in @ids, because filtered search relies on it
|
229
|
+
fetch_ids = if @all_search
|
230
|
+
@ids
|
231
|
+
else #filtered search
|
232
|
+
@start_index = [@ids.length - limit, 0].max
|
233
|
+
@ids[@start_index..-1]
|
222
234
|
end
|
223
235
|
log "search query result: #{fetch_ids.inspect}"
|
224
236
|
res = fetch_envelopes(fetch_ids)
|
@@ -226,31 +238,24 @@ module Vmail
|
|
226
238
|
end
|
227
239
|
|
228
240
|
def update
|
229
|
-
|
230
|
-
# this is just to prime the IMAP connection
|
231
|
-
# It's necessary for some reason.
|
232
|
-
log "priming connection for update"
|
233
|
-
res = @imap.fetch(@all_ids[-1], ["ENVELOPE"])
|
234
|
-
if res.nil?
|
235
|
-
raise IOError, "IMAP connection seems broken"
|
236
|
-
end
|
237
|
-
end
|
241
|
+
prime_connection
|
238
242
|
ids = reconnect_if_necessary {
|
239
243
|
log "search #@query"
|
240
244
|
@imap.search(@query)
|
241
245
|
}
|
242
246
|
# TODO change this. will throw error now
|
243
|
-
new_ids = ids
|
247
|
+
new_ids = ids.select {|x| x > @ids.max}
|
248
|
+
@ids = @ids + new_ids
|
244
249
|
log "UPDATE: NEW UIDS: #{new_ids.inspect}"
|
245
250
|
if !new_ids.empty?
|
246
251
|
res = fetch_envelopes(new_ids)
|
247
|
-
@all_ids = ids
|
248
252
|
res
|
249
253
|
end
|
250
254
|
end
|
251
255
|
|
252
256
|
# gets 100 messages prior to id
|
253
257
|
def more_messages(message_id, limit=100)
|
258
|
+
log "more_messages: message_id #{message_id}"
|
254
259
|
message_id = message_id.to_i
|
255
260
|
if @all_search
|
256
261
|
x = [(message_id - limit), 0].max
|
@@ -259,26 +264,31 @@ module Vmail
|
|
259
264
|
add_more_message_line(res, x)
|
260
265
|
else
|
261
266
|
# filter search query
|
267
|
+
log "@start_index #@start_index"
|
262
268
|
x = [(@start_index - limit), 0].max
|
263
269
|
y = [@start_index - 1, 0].max
|
264
270
|
@start_index = x
|
271
|
+
log "fetch_envelopes @ids[#{x}..#{y}]"
|
265
272
|
res = fetch_envelopes(@ids[x..y])
|
266
273
|
add_more_message_line(res, @ids[x])
|
267
274
|
end
|
268
275
|
end
|
269
276
|
|
270
277
|
def add_more_message_line(res, start_id)
|
278
|
+
log "add_more_message_line for start_id #{start_id}"
|
271
279
|
if @all_search
|
272
280
|
return res if start_id.nil?
|
273
281
|
if start_id <= 1
|
274
282
|
return res
|
275
283
|
end
|
276
|
-
log "remaining = start_id - 1: #{start_id} - 1"
|
277
284
|
remaining = start_id - 1
|
278
285
|
else # filter search
|
279
|
-
log "remaining = @ids.index(#{start_id}) - 1; @ids.size: #{@ids.size}"
|
280
286
|
remaining = @ids.index(start_id) - 1
|
281
287
|
end
|
288
|
+
if remaining < 1
|
289
|
+
log "none remaining"
|
290
|
+
return res
|
291
|
+
end
|
282
292
|
log "remaining messages: #{remaining}"
|
283
293
|
"> Load #{[100, remaining].min} more messages. #{remaining} remaining.\n" + res
|
284
294
|
end
|
@@ -465,15 +475,7 @@ EOF
|
|
465
475
|
def deliver(text)
|
466
476
|
# parse the text. The headers are yaml. The rest is text body.
|
467
477
|
require 'net/smtp'
|
468
|
-
|
469
|
-
# this is just to prime the IMAP connection
|
470
|
-
# It's necessary for some reason.
|
471
|
-
log "priming connection for delivering"
|
472
|
-
res = @imap.fetch(@all_ids[-1], ["ENVELOPE"])
|
473
|
-
if res.nil?
|
474
|
-
raise IOError, "IMAP connection seems broken"
|
475
|
-
end
|
476
|
-
end
|
478
|
+
prime_connection
|
477
479
|
mail = new_mail_from_input(text)
|
478
480
|
mail.delivery_method(*smtp_settings)
|
479
481
|
log mail.deliver!
|
data/lib/vmail/version.rb
CHANGED