jmcarbo-imapstore 0.4.2 → 0.4.5
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/README.rdoc +1 -1
- data/bin/imapstore +22 -7
- data/lib/imapstore/imapstore.rb +86 -75
- data/lib/imapstore.rb +1 -1
- metadata +1 -1
data/README.rdoc
CHANGED
data/bin/imapstore
CHANGED
@@ -12,7 +12,7 @@ opt = GetOptions.new(%w( help subject=s command=s dir=s files=@s recursive! vers
|
|
12
12
|
|
13
13
|
if opt['help']
|
14
14
|
puts "Usage: imapstore -c <#{COMMAND_LIST.join(', ')}> -s <subject> -d <folder> -f <file list or glob> "
|
15
|
-
puts " -i <imapstore> -x --recursive --versioned --all"
|
15
|
+
puts " -i <imapstore> -x --recursive --versioned --all -t <text of message>"
|
16
16
|
puts " imapstore -h"
|
17
17
|
exit 0
|
18
18
|
end
|
@@ -28,18 +28,25 @@ versioned = opt['versioned']
|
|
28
28
|
verbose = opt['x'] || false
|
29
29
|
text = opt['text'] || "no text"
|
30
30
|
|
31
|
+
|
32
|
+
|
33
|
+
|
31
34
|
begin
|
35
|
+
|
32
36
|
if COMMAND_LIST.include? command
|
33
37
|
if command == 'setup'
|
34
38
|
IMAPSTORE::Imapstore.create_config_file
|
35
39
|
exit
|
36
40
|
end
|
37
41
|
|
38
|
-
|
42
|
+
puts "Opening mailstore #{imapstore} configured in #{File.expand_path('~/.imapstore/config.yml')}" if verbose
|
39
43
|
i = IMAPSTORE::Imapstore.new(File.expand_path('~/.imapstore/config.yml'), imapstore)
|
44
|
+
puts "Mailstore #{imapstore} opened" if verbose
|
45
|
+
|
40
46
|
i.versioned=versioned if versioned!=nil
|
41
47
|
i.verbose = verbose
|
42
|
-
|
48
|
+
|
49
|
+
puts "Executing command #{command}" if verbose
|
43
50
|
case command
|
44
51
|
when 'ls':
|
45
52
|
files.each do |f|
|
@@ -50,8 +57,9 @@ if COMMAND_LIST.include? command
|
|
50
57
|
end
|
51
58
|
end
|
52
59
|
when 'put':
|
53
|
-
|
60
|
+
puts "Storing files" if verbose
|
54
61
|
files.each do |f|
|
62
|
+
f = File.expand_path(f)
|
55
63
|
local_dir = File.dirname(f)
|
56
64
|
f = local_dir + "/**/" + File.basename(f) if recursive
|
57
65
|
|
@@ -60,8 +68,12 @@ if COMMAND_LIST.include? command
|
|
60
68
|
remote_dir = dir
|
61
69
|
append_dir = File.dirname(f2).sub(/^#{local_dir}\/*/,"")
|
62
70
|
remote_dir = remote_dir + "/" + append_dir if append_dir != ""
|
63
|
-
|
64
|
-
|
71
|
+
if File.exists?(f2)
|
72
|
+
puts "Storing file #{f2} in remote dir \"#{remote_dir}\""
|
73
|
+
i.store_file(f2,remote_dir,subject)
|
74
|
+
else
|
75
|
+
puts "File #{f2} does not exist."
|
76
|
+
end
|
65
77
|
end
|
66
78
|
end
|
67
79
|
end
|
@@ -92,13 +104,16 @@ if COMMAND_LIST.include? command
|
|
92
104
|
|
93
105
|
i.snipplet(subject,text,dir, nil)
|
94
106
|
else
|
95
|
-
|
107
|
+
raise "unimplemented command #{command}"
|
96
108
|
end
|
97
109
|
|
98
110
|
|
99
111
|
|
100
112
|
i.disconnect
|
113
|
+
else
|
114
|
+
puts "command #{command} is unimplemented"
|
101
115
|
end
|
116
|
+
|
102
117
|
rescue
|
103
118
|
puts "An error has occured #{$!}"
|
104
119
|
end
|
data/lib/imapstore/imapstore.rb
CHANGED
@@ -18,13 +18,15 @@ default:
|
|
18
18
|
store_tag: IMAPSTORE
|
19
19
|
imap_server: imap.gmail.com
|
20
20
|
imap_port: 993
|
21
|
-
|
21
|
+
ssl: true
|
22
|
+
|
22
23
|
other:
|
23
24
|
email: other_account@gmail.com
|
24
25
|
password: password
|
25
26
|
store_tag: IMAPSTORE
|
26
27
|
imap_server: imap.gmail.com
|
27
28
|
imap_port: 993
|
29
|
+
ssl: true
|
28
30
|
END
|
29
31
|
|
30
32
|
def self.create_config_file(file = File.expand_path('~/.imapstore/config.yml'))
|
@@ -36,11 +38,13 @@ END
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def initialize(file = File.expand_path('~/.imapstore/config.yml'), imapstore="default")
|
41
|
+
puts "Initializing IMAP" if @verbose
|
39
42
|
@versioned = true
|
40
43
|
@verbose = false
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
|
45
|
+
puts "Getting configuration file #{file} for account #{imapstore}" if @verbose
|
46
|
+
get_config(file, imapstore)
|
47
|
+
connect
|
44
48
|
end
|
45
49
|
|
46
50
|
def versioned
|
@@ -75,13 +79,17 @@ END
|
|
75
79
|
@verbose
|
76
80
|
end
|
77
81
|
|
78
|
-
def verbose=value
|
82
|
+
def verbose=(value)
|
79
83
|
@verbose = value
|
80
84
|
end
|
81
85
|
|
82
86
|
def connect()
|
83
87
|
if !@imap && @email && @password && @imap_server && @imap_port
|
84
|
-
|
88
|
+
if(@ssl == true)
|
89
|
+
@imap = Net::IMAP.new(@imap_server, @imap_port, true)
|
90
|
+
else
|
91
|
+
@imap = Net::IMAP.new(@imap_server, @imap_port, false)
|
92
|
+
end
|
85
93
|
@imap.login(@email, @password)
|
86
94
|
end
|
87
95
|
end
|
@@ -109,26 +117,29 @@ END
|
|
109
117
|
@store_tag = aConfig[imapstore]['store_tag'] || "IMAPSTORE"
|
110
118
|
@imap_server = aConfig[imapstore]['imap_server']
|
111
119
|
@imap_port = aConfig[imapstore]['imap_port']
|
120
|
+
@ssl = aConfig[imapstore]['ssl'] || false
|
112
121
|
#END CONFIGURATION SECTION
|
122
|
+
|
123
|
+
aConfig
|
113
124
|
end
|
114
125
|
|
115
126
|
def snipplet(subject = "snipplet", body = "", folder="snipplets", file = nil)
|
116
127
|
puts "Storing snipplet" if @verbose
|
117
128
|
|
118
129
|
mail = TMail::Mail.new
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
130
|
+
mail.to = @email
|
131
|
+
mail.from = @email
|
132
|
+
mail.subject = subject
|
133
|
+
|
134
|
+
mail.date = Time.now
|
135
|
+
mail.mime_version = '1.0'
|
125
136
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
137
|
+
mailpart1=TMail::Mail.new
|
138
|
+
mailpart1.set_content_type 'text', 'plain'
|
139
|
+
mailpart1.body = body
|
140
|
+
mail.parts << mailpart1
|
141
|
+
mail.set_content_type 'multipart', 'mixed'
|
142
|
+
|
132
143
|
# if file && FileTest.exists?(file)
|
133
144
|
# mailpart=TMail::Mail.new
|
134
145
|
# mailpart.body = Base64.encode64(chunk.to_s)
|
@@ -140,14 +151,14 @@ END
|
|
140
151
|
@imap.append(folder, mail.to_s, [:Seen], Time.now)
|
141
152
|
|
142
153
|
end
|
143
|
-
|
154
|
+
|
144
155
|
def store_file_chunk( file, folder = "INBOX", subject = "", chunk=nil, chunk_no=0, max_chunk_no=0 )
|
145
156
|
if(max_chunk_no>0)
|
146
157
|
puts "Storing part #{chunk_no} of #{max_chunk_no}"
|
147
158
|
end
|
148
|
-
|
159
|
+
basename = File.basename(file)
|
149
160
|
version = 0
|
150
|
-
|
161
|
+
|
151
162
|
if max_chunk_no == 0
|
152
163
|
tag = "#{@store_tag}[#{basename}]"
|
153
164
|
else
|
@@ -164,12 +175,12 @@ END
|
|
164
175
|
@imap.expunge
|
165
176
|
|
166
177
|
mail = TMail::Mail.new
|
167
|
-
|
168
|
-
|
178
|
+
mail.to = @email
|
179
|
+
mail.from = @email
|
169
180
|
if max_chunk_no == 0
|
170
|
-
|
181
|
+
mail.subject = "#{@store_tag}[#{basename}]"
|
171
182
|
else
|
172
|
-
|
183
|
+
mail.subject = "#{@store_tag}[#{basename}](#{chunk_no}-#{max_chunk_no})"
|
173
184
|
end
|
174
185
|
|
175
186
|
if version > 0
|
@@ -180,36 +191,36 @@ END
|
|
180
191
|
mail.subject = mail.subject + ": #{subject}"
|
181
192
|
end
|
182
193
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
194
|
+
mail.date = Time.now
|
195
|
+
mail.mime_version = '1.0'
|
196
|
+
|
197
|
+
mailpart1=TMail::Mail.new
|
198
|
+
mailpart1.set_content_type 'text', 'plain'
|
199
|
+
mailpart1.body = "This is a mail storage message of file #{file}"
|
200
|
+
mail.parts << mailpart1
|
201
|
+
mail.set_content_type 'multipart', 'mixed'
|
202
|
+
|
203
|
+
if FileTest.exists?(file)
|
204
|
+
mailpart=TMail::Mail.new
|
205
|
+
mailpart.body = Base64.encode64(chunk.to_s)
|
206
|
+
mailpart.transfer_encoding="Base64"
|
196
207
|
if max_chunk_no == 0
|
197
|
-
|
208
|
+
mailpart['Content-Disposition'] = "attachment; filename=#{CGI::escape(basename)}"
|
198
209
|
else
|
199
|
-
|
210
|
+
mailpart['Content-Disposition'] = "attachment; filename=#{CGI::escape(basename)}_#{chunk_no}-#{max_chunk_no}"
|
200
211
|
end
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
212
|
+
mail.parts.push(mailpart)
|
213
|
+
end
|
214
|
+
|
215
|
+
|
216
|
+
@imap.append(folder, mail.to_s, [:Seen], File.new(file).atime)
|
217
|
+
|
207
218
|
end
|
208
219
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
220
|
+
def store_file( file, folder = "INBOX", subject = "")
|
221
|
+
|
222
|
+
@imap.create(folder) if !@imap.list("", folder)
|
223
|
+
|
213
224
|
size = File.size(file)
|
214
225
|
if(size > MAX_FILE_SIZE)
|
215
226
|
remaining = size
|
@@ -227,12 +238,12 @@ END
|
|
227
238
|
content=File.open(file).read
|
228
239
|
store_file_chunk( file, folder, subject, content)
|
229
240
|
end
|
230
|
-
|
231
|
-
|
241
|
+
end
|
242
|
+
|
232
243
|
def transverse(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false, folder_only=false)
|
233
244
|
file_list=[]
|
234
|
-
|
235
|
-
|
245
|
+
|
246
|
+
|
236
247
|
|
237
248
|
|
238
249
|
begin
|
@@ -241,7 +252,7 @@ END
|
|
241
252
|
puts "..... fetching #{target_folder} " if @verbose
|
242
253
|
|
243
254
|
@imap.list(target_folder, "*").each do |folder|
|
244
|
-
|
255
|
+
|
245
256
|
puts "..... transversing #{folder.name} " if @verbose
|
246
257
|
|
247
258
|
if ((recursive == true) && (target_folder == "" ? true : folder.name.match(/^#{target_folder}(\/.+)*$/))) || (folder.name == target_folder)
|
@@ -250,9 +261,9 @@ END
|
|
250
261
|
yield(folder.name, nil, nil, nil, nil) if block_given?
|
251
262
|
|
252
263
|
if((!folder.attr.include? :Noselect) && (folder_only==false))
|
253
|
-
|
264
|
+
|
254
265
|
@imap.select(folder.name)
|
255
|
-
|
266
|
+
|
256
267
|
@imap.search(["NOT", "DELETED"]).each do |message_id|
|
257
268
|
a = @imap.fetch(message_id, "RFC822")
|
258
269
|
mail = TMail::Mail.parse(a[0].attr["RFC822"])
|
@@ -266,14 +277,14 @@ END
|
|
266
277
|
rescue
|
267
278
|
end
|
268
279
|
|
269
|
-
|
280
|
+
file_list.sort
|
270
281
|
end
|
271
|
-
|
272
|
-
|
282
|
+
|
283
|
+
def ls(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
|
273
284
|
transverse(target_folder, glob, recursive, dot_files, false)
|
274
|
-
|
275
|
-
|
276
|
-
|
285
|
+
end
|
286
|
+
|
287
|
+
def get_file(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
|
277
288
|
file_list = transverse(target_folder, glob, recursive, dot_files, false) do |folder, file, message_id, mail, file_name|
|
278
289
|
|
279
290
|
if mail && mail.multipart? then
|
@@ -282,7 +293,7 @@ END
|
|
282
293
|
append_dir = folder.sub(/^#{target_folder}\/*/,"")
|
283
294
|
if append_dir != ""
|
284
295
|
Dir.mkdir(append_dir) if !File.exists? append_dir
|
285
|
-
|
296
|
+
|
286
297
|
file_name = append_dir + "/" + file_name
|
287
298
|
end
|
288
299
|
File.open(file_name,"w").write(m.body)
|
@@ -290,21 +301,21 @@ END
|
|
290
301
|
end
|
291
302
|
end
|
292
303
|
end
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
304
|
+
end
|
305
|
+
|
306
|
+
|
307
|
+
|
308
|
+
def rm_file(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
|
298
309
|
file_list = transverse(target_folder, glob, false, dot_files, false) do |folder, file, message_id, mail, file_name|
|
299
310
|
if file && message_id
|
300
|
-
|
311
|
+
@imap.store(message_id, "+FLAGS", [:Deleted])
|
301
312
|
@imap.expunge
|
302
313
|
end
|
303
314
|
end
|
304
315
|
|
305
|
-
|
306
|
-
|
307
|
-
|
316
|
+
file_list
|
317
|
+
end
|
318
|
+
|
308
319
|
def mkdir(folder)
|
309
320
|
@imap.create(folder)
|
310
321
|
end
|
@@ -319,11 +330,11 @@ END
|
|
319
330
|
|
320
331
|
if file && message_id
|
321
332
|
puts "..... actually removing dir #{folder} file #{file_name}" if @verbose
|
322
|
-
|
333
|
+
@imap.store(message_id, "+FLAGS", [:Deleted])
|
323
334
|
@imap.expunge
|
324
335
|
end
|
325
336
|
end
|
326
|
-
|
337
|
+
|
327
338
|
|
328
339
|
folders.each do |folder|
|
329
340
|
puts "..... actually removing dir #{folder}" if @verbose
|
data/lib/imapstore.rb
CHANGED