imap_processor 1.1.1 → 1.7

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.
@@ -0,0 +1,48 @@
1
+ require 'net/imap'
2
+
3
+ class Net::IMAP
4
+
5
+ ##
6
+ # Sends an IDLE command that waits for notifications of new or expunged
7
+ # messages. Yields responses from the server during the IDLE.
8
+ #
9
+ # Use #idle_done to leave IDLE.
10
+
11
+ def idle(&response_handler)
12
+ raise LocalJumpError, "no block given" unless response_handler
13
+
14
+ response = nil
15
+
16
+ synchronize do
17
+ tag = Thread.current[:net_imap_tag] = generate_tag
18
+ put_string "#{tag} IDLE#{CRLF}"
19
+
20
+ begin
21
+ add_response_handler response_handler
22
+
23
+ @idle_done_cond = new_cond
24
+ @idle_done_cond.wait
25
+ @idle_done_cond = nil
26
+ ensure
27
+ remove_response_handler response_handler
28
+ put_string "DONE#{CRLF}"
29
+ response = get_tagged_response tag
30
+ end
31
+ end
32
+
33
+ response
34
+ end
35
+
36
+ ##
37
+ # Leaves IDLE
38
+
39
+ def idle_done
40
+ raise Net::IMAP::Error, 'not during idle' unless @idle_done_cond
41
+
42
+ synchronize do
43
+ @idle_done_cond.signal
44
+ end
45
+ end
46
+
47
+ end unless Net::IMAP.method_defined? :idle
48
+
@@ -0,0 +1,185 @@
1
+ require 'rubygems'
2
+ require 'minitest/autorun'
3
+ require 'imap_processor'
4
+ require 'time'
5
+
6
+ ##
7
+ # These tests expect a local IMAP server with a 'test' login with a 'test'
8
+ # password. It's fairly easy to set up dovecot to do this:
9
+ #
10
+ # In dovecot.conf:
11
+ #
12
+ # mail_location = mbox:~/mail:INBOX=~/Mailbox
13
+ #
14
+ # auth default {
15
+ # mechanisms = plain
16
+ #
17
+ # passdb passwd-file {
18
+ # args = scheme=plain username_format=%n /path/to/etc/dovecot/passwd
19
+ # }
20
+ #
21
+ # userdb passwd-file {
22
+ # args = username_format=%n /path/to/etc/dovecot/passwd
23
+ # }
24
+ # }
25
+ #
26
+ # And in /path/to/etc/dovecot/passwd:
27
+ #
28
+ # test:test:<your uid>:<your gid>::/path/to/your/home/dovecot
29
+
30
+ class TestIMAPProcessor < MiniTest::Unit::TestCase
31
+
32
+ def setup
33
+ host, port, username, password = 'localhost', 143, 'test', 'test'
34
+
35
+ @ip = IMAPProcessor.new :Host => host, :Port => port,
36
+ :Username => username, :Password => password,
37
+ :Verbose => false
38
+
39
+ @connection = @ip.connect
40
+
41
+ @imap = @connection.imap
42
+ @ip.instance_variable_set :@imap, @imap
43
+
44
+ @delim = @imap.list('', 'INBOX').first.delim
45
+
46
+ @NI = Net::IMAP
47
+ end
48
+
49
+ def teardown
50
+ @imap.select 'INBOX'
51
+ uids = @imap.search 'ALL'
52
+ @imap.store uids, '+FLAGS.SILENT', [:Deleted] unless uids.empty?
53
+ @imap.expunge
54
+ @imap.list('', '*').each do |mailbox|
55
+ next if mailbox.name == 'INBOX'
56
+ @imap.delete mailbox.name
57
+ end
58
+ @imap.disconnect
59
+ end
60
+
61
+ # pre-run cleanup
62
+ test = self.new nil
63
+ test.setup
64
+ test.teardown
65
+
66
+ def test_capability
67
+ res =
68
+ @NI::UntaggedResponse.new('OK',
69
+ @NI::ResponseText.new(
70
+ @NI::ResponseCode.new('CAPABILITY',
71
+ 'IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN'),
72
+ 'Dovecot ready.'),
73
+ "OK [CAPABAILITY ...] Dovecot ready.\r\n")
74
+
75
+ cap = @ip.capability @imap, res
76
+
77
+ assert_equal \
78
+ %w[IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN],
79
+ cap
80
+ end
81
+
82
+ def test_capability_no_cap
83
+ res =
84
+ @NI::TaggedResponse.new('RUBY0001', 'OK',
85
+ @NI::ResponseText.new(nil,
86
+ 'User logged in'),
87
+ "RUBY0001 OK User logged in\r\n")
88
+
89
+ cap = @ip.capability @imap, res
90
+
91
+ assert_includes cap, 'IMAP4REV1'
92
+ end
93
+
94
+ def test_capability_no_res
95
+ cap = @ip.capability @imap
96
+
97
+ assert_includes cap, 'IMAP4REV1'
98
+ end
99
+
100
+ def test_create_mailbox
101
+ @imap.create "directory#{@delim}"
102
+
103
+ assert_equal nil, @ip.create_mailbox('directory')
104
+
105
+ refute_nil @ip.create_mailbox('destination')
106
+ mailbox = @imap.list('', 'destination').first
107
+ assert_equal 'destination', mailbox.name
108
+ assert_equal [:Noinferiors, :Unmarked], mailbox.attr
109
+ end
110
+
111
+ def test_delete_messages
112
+ util_message
113
+ uids = util_uids
114
+
115
+ @ip.delete_messages uids
116
+
117
+ assert_empty util_uids
118
+ end
119
+
120
+ def test_delete_messages_no_expunge
121
+ util_message
122
+ uids = util_uids
123
+
124
+ @ip.delete_messages uids, false
125
+
126
+ uids = util_uids
127
+
128
+ refute_empty uids
129
+ assert_includes :Deleted, @imap.fetch(uids, 'FLAGS').first.attr['FLAGS']
130
+ end
131
+
132
+ def test_move_messages
133
+ util_message
134
+ uids = util_uids
135
+
136
+ @ip.move_messages uids, 'destination'
137
+
138
+ assert_equal 0, @imap.search('ALL').length
139
+
140
+ assert_equal 1, @imap.list('', 'destination').length
141
+ end
142
+
143
+ def test_show_messages
144
+ now = Time.now
145
+ util_message nil, now
146
+ uids = util_uids
147
+
148
+ out, = capture_io do
149
+ @ip.show_messages uids
150
+ end
151
+
152
+ expected = <<-EXPECTED
153
+ Subject: message 1
154
+ Date: #{now.rfc2822}
155
+ Message-Id: 1
156
+
157
+ EXPECTED
158
+
159
+ assert_equal expected, out
160
+ end
161
+
162
+ def util_message(flags = nil, time = Time.now)
163
+ @count ||= 0
164
+ @count += 1
165
+
166
+ message = <<-MESSAGE
167
+ From: from@example.com
168
+ To: to@example.com
169
+ Subject: message #{@count}
170
+ Date: #{time.rfc2822}
171
+ Message-Id: #{@count}
172
+
173
+ Hi, this is message number #{@count}
174
+ MESSAGE
175
+
176
+ @imap.append 'INBOX', message, flags, time
177
+ end
178
+
179
+ def util_uids
180
+ @imap.select 'INBOX'
181
+ @imap.search 'ALL'
182
+ end
183
+
184
+ end
185
+
metadata CHANGED
@@ -1,103 +1,152 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: imap_processor
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.7'
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
+ - Ryan Davis
7
8
  - Eric Hodel
8
9
  autorequire:
9
10
  bindir: bin
10
- cert_chain:
11
+ cert_chain:
11
12
  - |
12
13
  -----BEGIN CERTIFICATE-----
13
- MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
14
- YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
15
- ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
16
- cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
17
- FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
18
- LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
19
- U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
20
- Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
21
- mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
22
- g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
23
- sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
24
- BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
25
- kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
26
- bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
27
- DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
28
- UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
29
- 14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
30
- x52qPcexcYZR7w==
14
+ MIIDPjCCAiagAwIBAgIBBDANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
15
+ ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
16
+ GRYDY29tMB4XDTE5MTIxMzAwMDIwNFoXDTIwMTIxMjAwMDIwNFowRTETMBEGA1UE
17
+ AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
18
+ JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
19
+ b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
20
+ taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT
21
+ oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
22
+ GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
23
+ qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
24
+ gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
25
+ HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB
26
+ AQCkkcHqAa6IKLYGl93rn78J3L+LnqyxaA059n4IGMHWN5bv9KBQnIjOrpLadtYZ
27
+ vhWkunWDKdfVapBEq5+T4HzqnsEXC3aCv6JEKJY6Zw7iSzl0M8hozuzRr+w46wvT
28
+ fV2yTN6QTVxqbMsJJyjosks4ZdQYov2zdvQpt1HsLi+Qmckmg8SPZsd+T8uiiBCf
29
+ b+1ORSM5eEfBQenPXy83LZcoQz8i6zVB4aAfTGGdhxjoMGUEmSZ6xpkOzmnGa9QK
30
+ m5x9IDiApM+vCELNwDXXGNFEnQBBK+wAe4Pek8o1V1TTOxL1kGPewVOitX1p3xoN
31
+ h7iEjga8iM1LbZUfiISZ+WrB
31
32
  -----END CERTIFICATE-----
32
-
33
- date: 2009-05-19 00:00:00 -07:00
34
- default_executable:
35
- dependencies:
36
- - !ruby/object:Gem::Dependency
37
- name: hoe
33
+ date: 2020-06-04 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rdoc
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '4.0'
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '7'
38
45
  type: :development
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
42
49
  - - ">="
43
- - !ruby/object:Gem::Version
44
- version: 1.12.1
45
- version:
50
+ - !ruby/object:Gem::Version
51
+ version: '4.0'
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hoe
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.22'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.22'
46
69
  description: |-
47
70
  IMAPProcessor is a client for processing messages on an IMAP server. It
48
71
  provides some basic mechanisms for connecting to an IMAP server, determining
49
72
  capabilities and handling messages.
50
-
51
- IMAPProcessor ships with the imap_keywords executable which can query an IMAP
52
- server for keywords set on messages in mailboxes.
53
- email:
73
+
74
+ IMAPProcessor ships with several executables which can query and
75
+ manipulate IMAP mailboxes in several different ways:
76
+
77
+ imap_archive :: Archives old messages to a new dated mailbox.
78
+ imap_cleanse :: Delete messages older than a certain age in specified mailboxes.
79
+ imap_flag :: Flag messages to/from certain people.
80
+ imap_idle :: Shows new messages in a mailbox.
81
+ imap_keywords :: Queries an IMAP server for keywords set on messages
82
+ imap_learn :: Flags messages based on what you've flagged before.
83
+ imap_mkdir :: Ensures that certain mailboxes exist.
84
+ email:
85
+ - ryand-ruby@zenspider.com
54
86
  - drbrain@segment7.net
55
- executables:
87
+ executables:
88
+ - imap_archive
89
+ - imap_cleanse
90
+ - imap_flag
91
+ - imap_idle
56
92
  - imap_keywords
93
+ - imap_learn
94
+ - imap_mkdir
57
95
  extensions: []
58
-
59
- extra_rdoc_files:
60
- - History.txt
96
+ extra_rdoc_files:
97
+ - History.rdoc
61
98
  - Manifest.txt
62
- - README.txt
63
- files:
64
- - .autotest
65
- - History.txt
99
+ - README.rdoc
100
+ files:
101
+ - ".autotest"
102
+ - History.rdoc
66
103
  - Manifest.txt
67
- - README.txt
104
+ - README.rdoc
68
105
  - Rakefile
106
+ - bin/imap_archive
107
+ - bin/imap_cleanse
108
+ - bin/imap_flag
109
+ - bin/imap_idle
69
110
  - bin/imap_keywords
111
+ - bin/imap_learn
112
+ - bin/imap_mkdir
70
113
  - lib/imap_processor.rb
114
+ - lib/imap_processor/archive.rb
115
+ - lib/imap_processor/cleanse.rb
116
+ - lib/imap_processor/client.rb
117
+ - lib/imap_processor/flag.rb
118
+ - lib/imap_processor/idle.rb
71
119
  - lib/imap_processor/keywords.rb
120
+ - lib/imap_processor/learn.rb
121
+ - lib/imap_processor/mkdir.rb
72
122
  - lib/imap_sasl_plain.rb
73
- has_rdoc: true
74
- homepage: http://seattlerb.rubyforge.org/imap_processor
75
- licenses: []
76
-
123
+ - lib/net/imap/date.rb
124
+ - lib/net/imap/idle.rb
125
+ - test/test_imap_processor.rb
126
+ homepage: https://github.com/seattlerb/imap_processor
127
+ licenses:
128
+ - MIT
129
+ metadata:
130
+ homepage_uri: https://github.com/seattlerb/imap_processor
77
131
  post_install_message:
78
- rdoc_options:
79
- - --main
80
- - README.txt
81
- require_paths:
132
+ rdoc_options:
133
+ - "--main"
134
+ - README.rdoc
135
+ require_paths:
82
136
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
84
- requirements:
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
85
139
  - - ">="
86
- - !ruby/object:Gem::Version
87
- version: "0"
88
- version:
89
- required_rubygems_version: !ruby/object:Gem::Requirement
90
- requirements:
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
91
144
  - - ">="
92
- - !ruby/object:Gem::Version
93
- version: "0"
94
- version:
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
95
147
  requirements: []
96
-
97
- rubyforge_project: seattlerb
98
- rubygems_version: 1.3.3
148
+ rubygems_version: 3.0.3
99
149
  signing_key:
100
- specification_version: 3
150
+ specification_version: 4
101
151
  summary: IMAPProcessor is a client for processing messages on an IMAP server
102
152
  test_files: []
103
-