mailhandler 1.0.21 → 1.0.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mailhandler/receiver.rb +6 -0
- data/lib/mailhandler/receiving/base.rb +8 -0
- data/lib/mailhandler/receiving/filelist/filter/base.rb +30 -7
- data/lib/mailhandler/receiving/folder.rb +8 -1
- data/lib/mailhandler/receiving/imap.rb +42 -2
- data/lib/mailhandler/receiving/mail.rb +91 -0
- data/lib/mailhandler/version.rb +1 -1
- data/spec/unit/mailhandler/receiver_spec.rb +4 -0
- data/spec/unit/mailhandler/receiving/imap_spec.rb +0 -6
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ffda69ae4a9be229a9071524a77f71a3b873748
|
4
|
+
data.tar.gz: 6b28a918816ee5f8830529792066210b781321d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 836a3e85fe73ca400d881c44b1e520fabb78fdc63859ea98df4f7cfb8d7c34fa6188b911d3aa061e256749da63474723cb4a7fd2b4c59b5fff6a4a7708ea2bd9
|
7
|
+
data.tar.gz: 13ad0ea77e75ce066cd71789343f01f49333d764e159921ea120374fcf55823a75e3742cab9bf6e7bfc1739e780d8943e441ce16b4cd644131f7945d04ec095d
|
data/lib/mailhandler/receiver.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'receiving/folder'
|
2
2
|
require_relative 'receiving/imap'
|
3
3
|
require_relative 'receiving/observer'
|
4
|
+
require_relative 'receiving/mail.rb'
|
4
5
|
|
5
6
|
module MailHandler
|
6
7
|
|
@@ -43,6 +44,7 @@ module MailHandler
|
|
43
44
|
def find_email(options)
|
44
45
|
|
45
46
|
init_search_details(options)
|
47
|
+
checker.start
|
46
48
|
|
47
49
|
until search_time_expired?
|
48
50
|
|
@@ -57,6 +59,10 @@ module MailHandler
|
|
57
59
|
|
58
60
|
checker.search_result
|
59
61
|
|
62
|
+
ensure
|
63
|
+
|
64
|
+
checker.stop
|
65
|
+
|
60
66
|
end
|
61
67
|
|
62
68
|
private
|
@@ -57,20 +57,43 @@ module MailHandler
|
|
57
57
|
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
module ByDate
|
61
61
|
|
62
|
-
|
62
|
+
class Since < Base
|
63
63
|
|
64
|
-
|
65
|
-
|
64
|
+
def initialize(files, date)
|
65
|
+
|
66
|
+
super(files)
|
67
|
+
@date = date
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def meets_expectation?(file)
|
74
|
+
|
75
|
+
(File.exists? file)? (File.ctime file) > @date : false
|
76
|
+
|
77
|
+
end
|
66
78
|
|
67
79
|
end
|
68
80
|
|
69
|
-
|
81
|
+
class Before < Base
|
82
|
+
|
83
|
+
def initialize(files, date)
|
84
|
+
|
85
|
+
super(files)
|
86
|
+
@date = date
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
70
91
|
|
71
|
-
|
92
|
+
def meets_expectation?(file)
|
72
93
|
|
73
|
-
|
94
|
+
(File.exists? file)? (File.ctime file) < @date : false
|
95
|
+
|
96
|
+
end
|
74
97
|
|
75
98
|
end
|
76
99
|
|
@@ -44,6 +44,12 @@ module MailHandler
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
+
def start
|
48
|
+
|
49
|
+
verify_mailbox_folders
|
50
|
+
|
51
|
+
end
|
52
|
+
|
47
53
|
private
|
48
54
|
|
49
55
|
# filter options which need to be done by searching files
|
@@ -51,7 +57,8 @@ module MailHandler
|
|
51
57
|
|
52
58
|
:by_subject => FileList::Filter::ByEmailSubject,
|
53
59
|
:by_content => FileList::Filter::ByEmailContent,
|
54
|
-
:since => FileList::Filter::ByDate,
|
60
|
+
:since => FileList::Filter::ByDate::Since,
|
61
|
+
:before => FileList::Filter::ByDate::Before,
|
55
62
|
:by_recipient => FileList::Filter::ByEmailRecipient
|
56
63
|
}
|
57
64
|
|
@@ -27,15 +27,45 @@ module MailHandler
|
|
27
27
|
def find(options)
|
28
28
|
|
29
29
|
verify_and_set_search_options(options)
|
30
|
-
init_retriever
|
31
30
|
@found_emails = find_emails(search_options)
|
32
31
|
|
33
32
|
search_result
|
34
33
|
|
35
34
|
end
|
36
35
|
|
36
|
+
def start
|
37
|
+
|
38
|
+
init_retriever
|
39
|
+
connect
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def stop
|
44
|
+
|
45
|
+
disconnect
|
46
|
+
|
47
|
+
end
|
48
|
+
|
37
49
|
private
|
38
50
|
|
51
|
+
def mailer
|
52
|
+
|
53
|
+
@mailer ||= Mail.retriever_method
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def connect
|
58
|
+
|
59
|
+
mailer.connect
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def disconnect
|
64
|
+
|
65
|
+
mailer.disconnect
|
66
|
+
|
67
|
+
end
|
68
|
+
|
39
69
|
# search options:
|
40
70
|
# by_subject - String, search by a whole string as part of the subject of the email
|
41
71
|
# by_content - String, search by a whole string as part of the content of the email
|
@@ -46,6 +76,8 @@ module MailHandler
|
|
46
76
|
|
47
77
|
:by_subject,
|
48
78
|
:by_content,
|
79
|
+
:since,
|
80
|
+
:before,
|
49
81
|
:count,
|
50
82
|
:archive,
|
51
83
|
:by_recipient
|
@@ -92,7 +124,7 @@ module MailHandler
|
|
92
124
|
|
93
125
|
def find_emails(options)
|
94
126
|
|
95
|
-
result =
|
127
|
+
result = mailer.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options), :delete_after_find => options[:archive])
|
96
128
|
(result.kind_of? Array)? result : [result]
|
97
129
|
|
98
130
|
end
|
@@ -117,6 +149,14 @@ module MailHandler
|
|
117
149
|
|
118
150
|
keys << 'BODY' << options[:by_content].to_s
|
119
151
|
|
152
|
+
when :since
|
153
|
+
|
154
|
+
keys << 'SINCE' << Net::IMAP.format_date(options[:since])
|
155
|
+
|
156
|
+
when :before
|
157
|
+
|
158
|
+
keys << 'BEFORE' << Net::IMAP.format_date(options[:before])
|
159
|
+
|
120
160
|
else
|
121
161
|
|
122
162
|
# do nothing
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Mail
|
2
|
+
|
3
|
+
class IMAP
|
4
|
+
|
5
|
+
attr_accessor :imap
|
6
|
+
|
7
|
+
def find(options={}, &block)
|
8
|
+
|
9
|
+
options = validate_options(options)
|
10
|
+
|
11
|
+
options[:read_only] ? imap.examine(options[:mailbox]) : imap.select(options[:mailbox])
|
12
|
+
|
13
|
+
uids = imap.uid_search(options[:keys])
|
14
|
+
uids.reverse! if options[:what].to_sym == :last
|
15
|
+
uids = uids.first(options[:count]) if options[:count].is_a?(Integer)
|
16
|
+
uids.reverse! if (options[:what].to_sym == :last && options[:order].to_sym == :asc) ||
|
17
|
+
(options[:what].to_sym != :last && options[:order].to_sym == :desc)
|
18
|
+
|
19
|
+
|
20
|
+
if block_given?
|
21
|
+
|
22
|
+
uids.each do |uid|
|
23
|
+
uid = options[:uid].to_i unless options[:uid].nil?
|
24
|
+
fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
|
25
|
+
new_message = Mail.new(fetchdata.attr['RFC822'])
|
26
|
+
new_message.mark_for_delete = true if options[:delete_after_find]
|
27
|
+
if block.arity == 3
|
28
|
+
yield new_message, imap, uid
|
29
|
+
else
|
30
|
+
yield new_message
|
31
|
+
end
|
32
|
+
imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find] && new_message.is_marked_for_delete?
|
33
|
+
break unless options[:uid].nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
imap.expunge if options[:delete_after_find]
|
37
|
+
|
38
|
+
else
|
39
|
+
|
40
|
+
emails = []
|
41
|
+
|
42
|
+
unless uids.nil?
|
43
|
+
|
44
|
+
uids.each do |uid|
|
45
|
+
uid = options[:uid].to_i unless options[:uid].nil?
|
46
|
+
fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
|
47
|
+
emails << Mail.new(fetchdata.attr['RFC822'])
|
48
|
+
imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find]
|
49
|
+
break unless options[:uid].nil?
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
imap.expunge if options[:delete_after_find]
|
56
|
+
emails.size == 1 && options[:count] == 1 ? emails.first : emails
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# Start an IMAP session
|
63
|
+
def connect(config=Mail::Configuration.instance)
|
64
|
+
|
65
|
+
puts "connect"
|
66
|
+
@imap = Net::IMAP.new(settings[:address], settings[:port], settings[:enable_ssl], nil, false)
|
67
|
+
|
68
|
+
if settings[:authentication].nil?
|
69
|
+
imap.login(settings[:user_name], settings[:password])
|
70
|
+
else
|
71
|
+
# Note that Net::IMAP#authenticate('LOGIN', ...) is not equal with Net::IMAP#login(...)!
|
72
|
+
# (see also http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/imap/rdoc/classes/Net/IMAP.html#M000718)
|
73
|
+
imap.authenticate(settings[:authentication], settings[:user_name], settings[:password])
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
def disconnect
|
79
|
+
|
80
|
+
puts "disconnect"
|
81
|
+
if defined?(imap) && imap && !imap.disconnected?
|
82
|
+
|
83
|
+
imap.disconnect
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/lib/mailhandler/version.rb
CHANGED
@@ -14,6 +14,8 @@ describe MailHandler::Receiver do
|
|
14
14
|
allow(checker).to receive(:search_result) { true }
|
15
15
|
allow(checker).to receive(:found_emails) { [found_email] }
|
16
16
|
allow(checker).to receive(:reset_found_emails) { [] }
|
17
|
+
allow(checker).to receive(:start) { nil }
|
18
|
+
allow(checker).to receive(:stop) { nil }
|
17
19
|
checker
|
18
20
|
|
19
21
|
}
|
@@ -72,6 +74,8 @@ describe MailHandler::Receiver do
|
|
72
74
|
allow(checker).to receive(:search_result) { false }
|
73
75
|
allow(checker).to receive(:found_emails) { [] }
|
74
76
|
allow(checker).to receive(:reset_found_emails) { [] }
|
77
|
+
allow(checker).to receive(:start) { nil }
|
78
|
+
allow(checker).to receive(:stop) { nil }
|
75
79
|
checker
|
76
80
|
|
77
81
|
}
|
@@ -54,12 +54,6 @@ describe MailHandler::Receiving::IMAPChecker do
|
|
54
54
|
|
55
55
|
context 'invalid' do
|
56
56
|
|
57
|
-
it 'by date' do
|
58
|
-
|
59
|
-
expect { checker.find({:since => Time.now}) }.to raise_error MailHandler::Error
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
57
|
it 'by_test' do
|
64
58
|
|
65
59
|
expect { checker.find({:by_test => 'test'}) }.to raise_error MailHandler::Error
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailhandler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Balos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mail
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/mailhandler/receiving/filelist/filter/email.rb
|
68
68
|
- lib/mailhandler/receiving/folder.rb
|
69
69
|
- lib/mailhandler/receiving/imap.rb
|
70
|
+
- lib/mailhandler/receiving/mail.rb
|
70
71
|
- lib/mailhandler/receiving/notification/console.rb
|
71
72
|
- lib/mailhandler/receiving/notification/email.rb
|
72
73
|
- lib/mailhandler/receiving/notification/email/content.rb
|