swallow 0.0.1 → 0.0.2
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/bin/swallow +3 -1
- data/lib/email.rb +6 -0
- data/lib/maildir.rb +21 -23
- data/lib/swallow.rb +36 -9
- data/test/test_age.rb +22 -0
- data/test/test_dir.rb +15 -0
- data/test/test_move.rb +11 -0
- metadata +54 -44
data/bin/swallow
CHANGED
data/lib/email.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'time_extentions'
|
4
|
+
require 'ftools'
|
4
5
|
|
5
6
|
module Swallow
|
6
7
|
class Email
|
@@ -34,9 +35,14 @@ module Swallow
|
|
34
35
|
# modify filename to "S" on end
|
35
36
|
end
|
36
37
|
|
38
|
+
def move_to(folder)
|
39
|
+
File.move(@filename, folder, true)
|
40
|
+
end
|
41
|
+
|
37
42
|
def to_s
|
38
43
|
File.open(@filename).read
|
39
44
|
end
|
45
|
+
|
40
46
|
def delete
|
41
47
|
File.delete(@filename)
|
42
48
|
end
|
data/lib/maildir.rb
CHANGED
@@ -36,11 +36,11 @@ module Swallow
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def unread_count
|
39
|
-
length
|
39
|
+
emails.find_all{ |e| e.read == false }.length
|
40
40
|
end
|
41
41
|
|
42
42
|
def read_count
|
43
|
-
length
|
43
|
+
emails.find_all{ |e| e.read == true }.length
|
44
44
|
end
|
45
45
|
|
46
46
|
def unknown_count
|
@@ -49,23 +49,23 @@ module Swallow
|
|
49
49
|
|
50
50
|
def length(sub_path)
|
51
51
|
length = 0
|
52
|
-
Dir.open(File.join(@folder_path,sub_path)).each
|
52
|
+
Dir.open(File.join(@folder_path,sub_path)).each do |filename|
|
53
53
|
next if filename == "." or filename == ".."
|
54
54
|
length += 1
|
55
|
-
|
55
|
+
end
|
56
56
|
length
|
57
57
|
end
|
58
58
|
|
59
59
|
def emails
|
60
60
|
list = Array.new
|
61
|
-
@sub_folders.each
|
61
|
+
@sub_folders.each do |sub_path|
|
62
62
|
path = File.join(@folder_path, sub_path)
|
63
|
-
Dir.open(path).each
|
63
|
+
Dir.open(path).each do |f|
|
64
64
|
filename = File.join(path,f)
|
65
65
|
next if File.directory?(filename)
|
66
66
|
list << Email.new(filename)
|
67
|
-
|
68
|
-
|
67
|
+
end
|
68
|
+
end
|
69
69
|
return list
|
70
70
|
end
|
71
71
|
|
@@ -75,6 +75,13 @@ module Swallow
|
|
75
75
|
puts "Deleted #{count} emails"
|
76
76
|
end
|
77
77
|
|
78
|
+
def add(emails)
|
79
|
+
# We'll take these emails from some other location and add them to our "cur" folder.
|
80
|
+
emails.each do |email|
|
81
|
+
email.move_to(File.join(@folder_path,"cur"))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
78
85
|
def emails_newer_than(limit)
|
79
86
|
emails.find_all { |e| e.newer_than?(limit) }
|
80
87
|
end
|
@@ -85,25 +92,16 @@ module Swallow
|
|
85
92
|
|
86
93
|
def sweep!(limit)
|
87
94
|
if limit.kind_of? Integer then
|
88
|
-
@sub_folder.each
|
95
|
+
@sub_folder.each do |sub_path|
|
89
96
|
Dir.open(File.join(@folder_path,sub_path)).sweep!(limit)
|
90
|
-
|
97
|
+
end
|
91
98
|
end
|
92
99
|
end
|
100
|
+
def status
|
101
|
+
"#{@folder_path} has #{unread_count} unread messages and #{read_count} read messages (#{unknown_count})."
|
102
|
+
end
|
93
103
|
def to_s
|
94
|
-
"#{@folder_path}
|
104
|
+
"#{@folder_path}"
|
95
105
|
end
|
96
106
|
end
|
97
107
|
end
|
98
|
-
|
99
|
-
if $0 == __FILE__ then
|
100
|
-
include Swallow
|
101
|
-
root = "/home/#{ENV['USER']}/Maildir/"
|
102
|
-
m = MailDirFolder.new(root)
|
103
|
-
puts m.to_s
|
104
|
-
m.enum.each { |folder|
|
105
|
-
n = MailDirFolder.new(m.path+folder)
|
106
|
-
puts n.to_s
|
107
|
-
puts n.enum
|
108
|
-
}
|
109
|
-
end
|
data/lib/swallow.rb
CHANGED
@@ -20,11 +20,9 @@ module Swallow
|
|
20
20
|
def process_junk
|
21
21
|
# Create Folder Objects
|
22
22
|
junk = MailDirFolder.new(@config[:maildir] + @config[:junk])
|
23
|
-
corpus = MailDirFolder.new(@config[:maildir] + @config[:corpus])
|
24
23
|
|
25
24
|
# Clean out the Junk Folder
|
26
25
|
@dspam.train_and_clean_folder(junk)
|
27
|
-
@dspam.train_and_clean_folder(corpus)
|
28
26
|
end
|
29
27
|
|
30
28
|
def process_inbox
|
@@ -33,12 +31,41 @@ module Swallow
|
|
33
31
|
# Feed new messages under the limit in the inbox to the filter as innocent corpus
|
34
32
|
@dspam.train_emails_as_innocent(inbox.emails_newer_than(@config[:limit]))
|
35
33
|
end
|
36
|
-
end
|
37
|
-
end
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
def process_innocent
|
36
|
+
innocent = MailDirFolder.new(@config[:maildir] + @config[:innocent])
|
37
|
+
inbox = MailDirFolder.new(@config[:maildir] + @config[:inbox])
|
38
|
+
@dspam.train_emails_as_innocent(innocent.emails)
|
39
|
+
inbox.add(innocent.emails)
|
40
|
+
end
|
41
|
+
|
42
|
+
def process_folder(folder_name, is_spam)
|
43
|
+
folder = MailDirFolder.new(@config[:maildir] + folder_name)
|
44
|
+
if is_spam == true then
|
45
|
+
@dspam.train_and_clean_folder(folder)
|
46
|
+
else
|
47
|
+
@dspam.train_emails_as_innocent(folder.emails)
|
48
|
+
end
|
49
|
+
end
|
44
50
|
|
51
|
+
def age_to_folder(src, dst, limit)
|
52
|
+
dst.add(src.emails_older_than(limit))
|
53
|
+
end
|
54
|
+
|
55
|
+
def age
|
56
|
+
puts "Aging folders..."
|
57
|
+
trash = MailDirFolder.new(@config[:maildir] + @config[:trash])
|
58
|
+
ruleset = RuleSet.new(@config[:files] + @config[:ruleset])
|
59
|
+
ruleset.rules.each do |rule|
|
60
|
+
if rule[:folder] != nil and rule[:day_limit] != nil then
|
61
|
+
puts "Folder #{rule[:folder]} has a limit of #{rule[:day_limit]}"
|
62
|
+
src = MailDirFolder.new(@config[:maildir] + "." + rule[:folder])
|
63
|
+
emails = src.emails_older_than(rule[:day_limit])
|
64
|
+
puts "Moved #{emails.length} emails"
|
65
|
+
trash.add(emails)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
data/test/test_age.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'swallow'
|
5
|
+
maildir = "#{ENV['HOME']}/Maildir/"
|
6
|
+
|
7
|
+
case ARGV.length
|
8
|
+
when 3
|
9
|
+
src = Swallow::MailDirFolder.new(maildir + ARGV[0])
|
10
|
+
dst = Swallow::MailDirFolder.new(maildir + ARGV[1])
|
11
|
+
limit = Integer(ARGV[2])
|
12
|
+
admin = Swallow::Admin.new
|
13
|
+
admin.age_to_folder(src,dst,limit)
|
14
|
+
else
|
15
|
+
admin = Swallow::Admin.new
|
16
|
+
admin.age
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
data/test/test_dir.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'swallow'
|
5
|
+
|
6
|
+
maildir = "#{ENV['HOME']}/Maildir/"
|
7
|
+
m = Swallow::MailDirFolder.new(maildir)
|
8
|
+
puts m.to_s
|
9
|
+
puts m.status
|
10
|
+
m.enum.each do |folder|
|
11
|
+
n = Swallow::MailDirFolder.new(m.path+folder)
|
12
|
+
puts n.to_s
|
13
|
+
puts n.status
|
14
|
+
puts n.enum
|
15
|
+
end
|
data/test/test_move.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'swallow'
|
5
|
+
|
6
|
+
exit(1) unless ARGV.length > 1
|
7
|
+
maildir = "#{ENV['HOME']}/Maildir/"
|
8
|
+
src = Swallow::MailDirFolder.new(maildir + ARGV[0])
|
9
|
+
dst = Swallow::MailDirFolder.new(maildir + ARGV[1])
|
10
|
+
|
11
|
+
dst.add(src.emails)
|
metadata
CHANGED
@@ -1,33 +1,34 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: swallow
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-10-29 00:00:00 -05:00
|
8
|
-
summary: A backend IMAP/Maildir Email Sorting/Routing/Cleanup system
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: swallow-dev@erik.rainey.name
|
12
|
-
homepage: http://erik.rainey.name/swallow
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: swallow
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.0.2
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Erik Rainey
|
8
|
+
autorequire: swallow
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-05-26 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: gurgitate-mail
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.8.5
|
23
|
+
version:
|
24
|
+
description:
|
25
|
+
email: swallow-dev@erik.rainey.name
|
26
|
+
executables:
|
27
|
+
- swallow
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- README
|
31
32
|
files:
|
32
33
|
- bin/swallow
|
33
34
|
- lib/time_extentions.rb
|
@@ -37,27 +38,36 @@ files:
|
|
37
38
|
- lib/swallow.rb
|
38
39
|
- lib/spamdetector.rb
|
39
40
|
- README
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
- test/test_folder.rb
|
41
|
+
has_rdoc: false
|
42
|
+
homepage: http://erik.rainey.name/swallow
|
43
|
+
post_install_message:
|
44
44
|
rdoc_options: []
|
45
45
|
|
46
|
-
|
47
|
-
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
52
60
|
requirements: []
|
53
61
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 0.9.5
|
64
|
+
signing_key:
|
65
|
+
specification_version: 2
|
66
|
+
summary: A backend IMAP/Maildir Email Sorting/Routing/Cleanup system
|
67
|
+
test_files:
|
68
|
+
- test/test_spam.rb
|
69
|
+
- test/test_ruleset.rb
|
70
|
+
- test/test_folder.rb
|
71
|
+
- test/test_move.rb
|
72
|
+
- test/test_age.rb
|
73
|
+
- test/test_dir.rb
|