jmcarbo-imapstore 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/imapstore +9 -4
- data/lib/imapstore.rb +1 -1
- data/lib/imapstore/imapstore.rb +87 -36
- metadata +1 -1
data/bin/imapstore
CHANGED
@@ -6,15 +6,16 @@ require 'imapstore'
|
|
6
6
|
require 'getoptions'
|
7
7
|
|
8
8
|
COMMAND_LIST = ['ls', 'rm', 'put', 'get', 'rmdir', 'mkdir', 'quota', 'setup' ]
|
9
|
-
opt = GetOptions.new(%w(help subject=s command=s dir=s files=@s recursive! versioned! all! ))
|
9
|
+
opt = GetOptions.new(%w( help subject=s command=s dir=s files=@s recursive! versioned! all! imapstore:s x! ))
|
10
10
|
|
11
11
|
if opt['help']
|
12
12
|
puts "Usage: imapstore -c <#{COMMAND_LIST.join(', ')}> -s <subject> -d <folder> -f <file list or glob> "
|
13
|
+
puts " -i <imapstore> -x --recursive --versioned --all"
|
13
14
|
puts " imapstore -h"
|
14
15
|
exit 0
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
imapstore = opt['imapstore'] || "default"
|
18
19
|
command = opt['command'] || "ls"
|
19
20
|
dir = opt['dir'] || "INBOX"
|
20
21
|
files = opt['files'] || "*"
|
@@ -22,6 +23,7 @@ subject = opt['subject'] || ""
|
|
22
23
|
recursive = opt['recursive'] || false
|
23
24
|
all = opt['all'] || false
|
24
25
|
versioned = opt['versioned']
|
26
|
+
verbose = opt['x'] || false
|
25
27
|
|
26
28
|
|
27
29
|
begin
|
@@ -30,9 +32,12 @@ if COMMAND_LIST.include? command
|
|
30
32
|
IMAPSTORE::Imapstore.create_config_file
|
31
33
|
exit
|
32
34
|
end
|
33
|
-
i = IMAPSTORE::Imapstore.new
|
34
|
-
i.versioned=versioned if versioned!=nil
|
35
35
|
|
36
|
+
|
37
|
+
i = IMAPSTORE::Imapstore.new(File.expand_path('~/.imapstore/config.yml'), imapstore)
|
38
|
+
i.versioned=versioned if versioned!=nil
|
39
|
+
i.verbose = verbose
|
40
|
+
|
36
41
|
case command
|
37
42
|
when 'ls':
|
38
43
|
files.each do |f|
|
data/lib/imapstore.rb
CHANGED
data/lib/imapstore/imapstore.rb
CHANGED
@@ -12,11 +12,19 @@ module IMAPSTORE
|
|
12
12
|
CHUNK_SIZE=10000000
|
13
13
|
|
14
14
|
CONFIG_TEMPLATE = <<-END
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
default:
|
16
|
+
email: account@gmail.com
|
17
|
+
password: password
|
18
|
+
store_tag: IMAPSTORE
|
19
|
+
imap_server: imap.gmail.com
|
20
|
+
imap_port: 993
|
21
|
+
|
22
|
+
other:
|
23
|
+
email: other_account@gmail.com
|
24
|
+
password: password
|
25
|
+
store_tag: IMAPSTORE
|
26
|
+
imap_server: imap.gmail.com
|
27
|
+
imap_port: 993
|
20
28
|
END
|
21
29
|
|
22
30
|
def self.create_config_file(file = File.expand_path('~/.imapstore/config.yml'))
|
@@ -27,9 +35,11 @@ END
|
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
30
|
-
def initialize
|
38
|
+
def initialize(file = File.expand_path('~/.imapstore/config.yml'), imapstore="default")
|
31
39
|
@versioned = true
|
32
|
-
|
40
|
+
@verbose = false
|
41
|
+
|
42
|
+
get_config(file, imapstore)
|
33
43
|
connect
|
34
44
|
end
|
35
45
|
|
@@ -61,6 +71,14 @@ END
|
|
61
71
|
@imap_port
|
62
72
|
end
|
63
73
|
|
74
|
+
def verbose
|
75
|
+
@verbose
|
76
|
+
end
|
77
|
+
|
78
|
+
def verbose=value
|
79
|
+
@verbose = value
|
80
|
+
end
|
81
|
+
|
64
82
|
def connect()
|
65
83
|
if !@imap && @email && @password && @imap_server && @imap_port
|
66
84
|
@imap = Net::IMAP.new(@imap_server, @imap_port, true)
|
@@ -78,18 +96,19 @@ END
|
|
78
96
|
end
|
79
97
|
end
|
80
98
|
|
81
|
-
def get_config(file = File.expand_path('~/.imapstore/config.yml'))
|
99
|
+
def get_config(file = File.expand_path('~/.imapstore/config.yml'), imapstore = "default")
|
82
100
|
if !File.exists?(file)
|
83
101
|
File.open(file,"w").write(CONFIG_TEMPLATE)
|
84
102
|
end
|
103
|
+
|
85
104
|
aConfig = YAML::load_file(file)
|
86
105
|
|
87
106
|
#COFIGURATION SECTION
|
88
|
-
@email = aConfig['email']
|
89
|
-
@password = aConfig['password']
|
90
|
-
@store_tag = aConfig['store_tag'] || "IMAPSTORE"
|
91
|
-
@imap_server = aConfig['imap_server']
|
92
|
-
@imap_port = aConfig['imap_port']
|
107
|
+
@email = aConfig[imapstore]['email']
|
108
|
+
@password = aConfig[imapstore]['password']
|
109
|
+
@store_tag = aConfig[imapstore]['store_tag'] || "IMAPSTORE"
|
110
|
+
@imap_server = aConfig[imapstore]['imap_server']
|
111
|
+
@imap_port = aConfig[imapstore]['imap_port']
|
93
112
|
#END CONFIGURATION SECTION
|
94
113
|
end
|
95
114
|
|
@@ -184,27 +203,41 @@ END
|
|
184
203
|
def transverse(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false, folder_only=false)
|
185
204
|
file_list=[]
|
186
205
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
begin
|
210
|
+
target_folder = "" if target_folder == "/"
|
211
|
+
|
212
|
+
puts "..... fetching #{target_folder} " if @verbose
|
191
213
|
|
192
|
-
|
214
|
+
@imap.list(target_folder, "*").each do |folder|
|
193
215
|
|
194
|
-
|
216
|
+
puts "..... transversing #{folder.name} " if @verbose
|
217
|
+
|
218
|
+
if ((recursive == true) && (target_folder == "" ? true : folder.name.match(/^#{target_folder}(\/.+)*$/))) || (folder.name == target_folder)
|
219
|
+
puts "..... got hit transversing #{folder.name} " if @verbose
|
220
|
+
file_list << folder.name
|
221
|
+
yield(folder.name, nil, nil, nil, nil) if block_given?
|
222
|
+
|
223
|
+
if((!folder.attr.include? :Noselect) && (folder_only==false))
|
224
|
+
|
225
|
+
@imap.select(folder.name)
|
195
226
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
227
|
+
@imap.search(["NOT", "DELETED"]).each do |message_id|
|
228
|
+
a = @imap.fetch(message_id, "RFC822")
|
229
|
+
mail = TMail::Mail.parse(a[0].attr["RFC822"])
|
230
|
+
file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
|
231
|
+
file_list << folder.name + "/" + file_name if file_name.match(glob)
|
232
|
+
yield(folder.name, file_name, message_id, mail, file_name) if block_given? && file_name.match(glob)
|
233
|
+
end
|
202
234
|
end
|
203
235
|
end
|
204
236
|
end
|
237
|
+
rescue
|
205
238
|
end
|
206
|
-
|
207
|
-
file_list.sort
|
239
|
+
|
240
|
+
file_list.sort
|
208
241
|
end
|
209
242
|
|
210
243
|
def ls(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
|
@@ -232,13 +265,14 @@ END
|
|
232
265
|
|
233
266
|
|
234
267
|
|
235
|
-
def rm_file(
|
236
|
-
file_list = transverse(target_folder, glob,
|
237
|
-
|
268
|
+
def rm_file(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
|
269
|
+
file_list = transverse(target_folder, glob, false, dot_files, false) do |folder, file, message_id, mail, file_name|
|
270
|
+
if file && message_id
|
271
|
+
@imap.store(message_id, "+FLAGS", [:Deleted])
|
272
|
+
@imap.expunge
|
273
|
+
end
|
238
274
|
end
|
239
|
-
|
240
|
-
@imap.expunge
|
241
|
-
|
275
|
+
|
242
276
|
file_list
|
243
277
|
end
|
244
278
|
|
@@ -246,11 +280,28 @@ END
|
|
246
280
|
@imap.create(folder)
|
247
281
|
end
|
248
282
|
|
249
|
-
def rmdir(
|
250
|
-
|
251
|
-
|
283
|
+
def rmdir(target_folder, recursive = false, dot_files = false)
|
284
|
+
folders = []
|
285
|
+
puts "..... Deleting #{target_folder}" if @verbose
|
286
|
+
|
287
|
+
transverse(target_folder, /.+/, recursive, dot_files, false) do |folder, file, message_id, mail, file_name|
|
288
|
+
puts "..... assigning dir #{folder} for removal" if @verbose
|
289
|
+
folders << folder if !(folders.include? folder)
|
290
|
+
|
291
|
+
if file && message_id
|
292
|
+
puts "..... actually removing dir #{folder} file #{file_name}" if @verbose
|
293
|
+
@imap.store(message_id, "+FLAGS", [:Deleted])
|
294
|
+
@imap.expunge
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
|
299
|
+
folders.each do |folder|
|
300
|
+
puts "..... actually removing dir #{folder}" if @verbose
|
252
301
|
@imap.delete(folder)
|
253
302
|
end
|
303
|
+
|
304
|
+
folders
|
254
305
|
end
|
255
306
|
|
256
307
|
def quota(folder)
|