36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/vmail/showing_message.rb', line 36
def fetch_and_cache(message_id)
if message = cached_full_message?(message_id)
log "- full message cache hit"
return message.plaintext
end
log "- full message cache miss"
params = { message_id: message_id, label_id: @label.label_id }
labeling = Labeling[params] || Labeling.create(params)
unless (labeling && labeling.uid)
log "- Labeling not found for #{ params.inspect }"
return "\nUnable to get message for #{ labeling.values }"
end
uid = labeling.uid
log "- fetching message uid #{ uid }"
fetch_data = reconnect_if_necessary do
res = retry_if_needed do
@imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])
end
raise "Message uid #{ uid } could not be fetched from server" if res.nil?
res[0]
end
seqno = fetch_data.seqno
rfc822 = Mail.new(fetch_data.attr['RFC822'])
formatter = Vmail::MessageFormatter.new rfc822
message = Message[message_id]
parts_list = format_parts_info(formatter.list_parts)
= formatter.
['date']
=
body = formatter.plaintext_part
if /charset=([\w-]+)/.match(parts_list)
conv_from = /charset=([\w-]+)/.match(parts_list)[1].strip
body = body.encode!('utf-8', conv_from, undef: :replace, invalid: :replace)
else
body = body.encode!('us-ascii', 'utf-8', undef: :replace, invalid: :replace)
end
message_text = <<-EOF
#{ message_id } #{ number_to_human_size message.size } #{ message.flags } #{ parts_list }
#{ divider '-' }
#{ }
#{ body }
EOF
message.update(:rfc822 => rfc822)
if !message_text.valid_encoding?
message_text.encode!('utf-8', undef: :replace, invalid: :replace)
end
begin
message.update(:plaintext => message_text)
rescue
log message_text.encoding
raise
end
message_text
rescue
msg = "Error encountered in fetch_and_cache(), message_id #{ message_id } [#@mailbox]:\n#{$!}\n#{$!.backtrace.join("\n")}"
log msg
msg
end
|