net-imap 0.4.9.1 → 0.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/pages.yml +2 -2
- data/Gemfile +4 -0
- data/lib/net/imap/search_result.rb +2 -6
- data/lib/net/imap/sequence_set.rb +18 -6
- data/lib/net/imap.rb +1 -1
- data/net-imap.gemspec +0 -3
- data/sample/net-imap.rb +167 -0
- metadata +4 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40824569aad7172418bde7db999c302e9cf0243977526e8ec908083957dd6117
|
4
|
+
data.tar.gz: 89ce211e3be5c350bf890ecd1e161926824fd547f6225e5a16a0dbec7b62d77b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a2712176f738c38b2c81682f5d488c94ea0c2a5902c9e7aa5ef92c83ada7b0534458ff3850384534a06a12c1d44ef8710a36e3cbb926e5d844fe6a9d36c2b3f
|
7
|
+
data.tar.gz: 64aa5b6a2305d1a34055cdf79a3ce466131e3165c184583d03a21f1183f57a5f3745d926a4feacf93cd670a0454941b4000090a03d109643a412c6298e1b6827
|
data/.github/workflows/pages.yml
CHANGED
@@ -31,7 +31,7 @@ jobs:
|
|
31
31
|
- name: Build with RDoc
|
32
32
|
run: bundle exec rake rdoc
|
33
33
|
- name: Upload artifact
|
34
|
-
uses: actions/upload-pages-artifact@
|
34
|
+
uses: actions/upload-pages-artifact@v3
|
35
35
|
with: { path: 'doc' }
|
36
36
|
|
37
37
|
deploy:
|
@@ -43,4 +43,4 @@ jobs:
|
|
43
43
|
steps:
|
44
44
|
- name: Deploy to GitHub Pages
|
45
45
|
id: deployment
|
46
|
-
uses: actions/deploy-pages@
|
46
|
+
uses: actions/deploy-pages@v4
|
data/Gemfile
CHANGED
@@ -9,7 +9,7 @@ module Net
|
|
9
9
|
# For backward compatibility, SearchResult inherits from Array.
|
10
10
|
class SearchResult < Array
|
11
11
|
|
12
|
-
# Returns a
|
12
|
+
# Returns a SearchResult populated with the given +seq_nums+.
|
13
13
|
#
|
14
14
|
# Net::IMAP::SearchResult[1, 3, 5, modseq: 9]
|
15
15
|
# # => Net::IMAP::SearchResult[1, 3, 5, modseq: 9]
|
@@ -22,19 +22,15 @@ module Net
|
|
22
22
|
# §3.1.6]}[https://www.rfc-editor.org/rfc/rfc7162.html#section-3.1.6].
|
23
23
|
attr_reader :modseq
|
24
24
|
|
25
|
-
# Returns a
|
25
|
+
# Returns a SearchResult populated with the given +seq_nums+.
|
26
26
|
#
|
27
27
|
# Net::IMAP::SearchResult.new([1, 3, 5], modseq: 9)
|
28
28
|
# # => Net::IMAP::SearchResult[1, 3, 5, modseq: 9]
|
29
29
|
def initialize(seq_nums, modseq: nil)
|
30
30
|
super(seq_nums.to_ary.map { Integer _1 })
|
31
31
|
@modseq = Integer modseq if modseq
|
32
|
-
freeze
|
33
32
|
end
|
34
33
|
|
35
|
-
# Returns a frozen copy of +other+.
|
36
|
-
def initialize_copy(other); super; freeze end
|
37
|
-
|
38
34
|
# Returns whether +other+ is a SearchResult with the same values and the
|
39
35
|
# same #modseq. The order of numbers is irrelevant.
|
40
36
|
#
|
@@ -907,7 +907,7 @@ module Net
|
|
907
907
|
# normalized form, this will yield the same values as #each_element.
|
908
908
|
#
|
909
909
|
# Related: #entries, #each_element
|
910
|
-
def each_entry(&block)
|
910
|
+
def each_entry(&block) # :yields: integer or range or :*
|
911
911
|
return to_enum(__method__) unless block_given?
|
912
912
|
return each_element(&block) unless @string
|
913
913
|
@string.split(",").each do yield tuple_to_entry str_to_tuple _1 end
|
@@ -927,7 +927,9 @@ module Net
|
|
927
927
|
self
|
928
928
|
end
|
929
929
|
|
930
|
-
private
|
930
|
+
private
|
931
|
+
|
932
|
+
def tuple_to_entry((min, max))
|
931
933
|
if min == STAR_INT then :*
|
932
934
|
elsif max == STAR_INT then min..
|
933
935
|
elsif min == max then min
|
@@ -935,6 +937,8 @@ module Net
|
|
935
937
|
end
|
936
938
|
end
|
937
939
|
|
940
|
+
public
|
941
|
+
|
938
942
|
# Yields each range in #ranges to the block and returns self.
|
939
943
|
# Returns an enumerator when called without a block.
|
940
944
|
#
|
@@ -1002,7 +1006,9 @@ module Net
|
|
1002
1006
|
nil
|
1003
1007
|
end
|
1004
1008
|
|
1005
|
-
private
|
1009
|
+
private
|
1010
|
+
|
1011
|
+
def each_tuple_with_index
|
1006
1012
|
idx_min = 0
|
1007
1013
|
@tuples.each do |min, max|
|
1008
1014
|
yield min, max, idx_min, (idx_max = idx_min + (max - min))
|
@@ -1011,7 +1017,7 @@ module Net
|
|
1011
1017
|
idx_min
|
1012
1018
|
end
|
1013
1019
|
|
1014
|
-
|
1020
|
+
def reverse_each_tuple_with_index
|
1015
1021
|
idx_max = -1
|
1016
1022
|
@tuples.reverse_each do |min, max|
|
1017
1023
|
yield min, max, (idx_min = idx_max - (max - min)), idx_max
|
@@ -1020,6 +1026,8 @@ module Net
|
|
1020
1026
|
idx_max
|
1021
1027
|
end
|
1022
1028
|
|
1029
|
+
public
|
1030
|
+
|
1023
1031
|
# :call-seq: at(index) -> integer or nil
|
1024
1032
|
#
|
1025
1033
|
# Returns a number from +self+, without modifying the set. Behaves the
|
@@ -1086,7 +1094,9 @@ module Net
|
|
1086
1094
|
|
1087
1095
|
alias slice :[]
|
1088
1096
|
|
1089
|
-
private
|
1097
|
+
private
|
1098
|
+
|
1099
|
+
def slice_length(start, length)
|
1090
1100
|
start = Integer(start.to_int)
|
1091
1101
|
length = Integer(length.to_int)
|
1092
1102
|
raise ArgumentError, "length must be positive" unless length.positive?
|
@@ -1094,7 +1104,7 @@ module Net
|
|
1094
1104
|
slice_range(start..last)
|
1095
1105
|
end
|
1096
1106
|
|
1097
|
-
|
1107
|
+
def slice_range(range)
|
1098
1108
|
first = range.begin || 0
|
1099
1109
|
last = range.end || -1
|
1100
1110
|
last -= 1 if range.exclude_end? && range.end && last != STAR_INT
|
@@ -1109,6 +1119,8 @@ module Net
|
|
1109
1119
|
end
|
1110
1120
|
end
|
1111
1121
|
|
1122
|
+
public
|
1123
|
+
|
1112
1124
|
# Returns a frozen SequenceSet with <tt>*</tt> converted to +max+, numbers
|
1113
1125
|
# and ranges over +max+ removed, and ranges containing +max+ converted to
|
1114
1126
|
# end at +max+.
|
data/lib/net/imap.rb
CHANGED
@@ -717,7 +717,7 @@ module Net
|
|
717
717
|
# * {IMAP URLAUTH Authorization Mechanism Registry}[https://www.iana.org/assignments/urlauth-authorization-mechanism-registry/urlauth-authorization-mechanism-registry.xhtml]
|
718
718
|
#
|
719
719
|
class IMAP < Protocol
|
720
|
-
VERSION = "0.4.
|
720
|
+
VERSION = "0.4.10"
|
721
721
|
|
722
722
|
# Aliases for supported capabilities, to be used with the #enable command.
|
723
723
|
ENABLE_ALIASES = {
|
data/net-imap.gemspec
CHANGED
data/sample/net-imap.rb
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'net/imap'
|
2
|
+
require "getoptlong"
|
3
|
+
|
4
|
+
$stdout.sync = true
|
5
|
+
$port = nil
|
6
|
+
$user = ENV["USER"] || ENV["LOGNAME"]
|
7
|
+
$auth = "login"
|
8
|
+
$ssl = false
|
9
|
+
$starttls = false
|
10
|
+
|
11
|
+
def usage
|
12
|
+
<<EOF
|
13
|
+
usage: #{$0} [options] <host>
|
14
|
+
|
15
|
+
--help print this message
|
16
|
+
--port=PORT specifies port
|
17
|
+
--user=USER specifies user
|
18
|
+
--auth=AUTH specifies auth type
|
19
|
+
--starttls use starttls
|
20
|
+
--ssl use ssl
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
|
24
|
+
begin
|
25
|
+
require 'io/console'
|
26
|
+
rescue LoadError
|
27
|
+
def _noecho(&block)
|
28
|
+
system("stty", "-echo")
|
29
|
+
begin
|
30
|
+
yield STDIN
|
31
|
+
ensure
|
32
|
+
system("stty", "echo")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
else
|
36
|
+
def _noecho(&block)
|
37
|
+
STDIN.noecho(&block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_password
|
42
|
+
print "password: "
|
43
|
+
begin
|
44
|
+
return _noecho(&:gets).chomp
|
45
|
+
ensure
|
46
|
+
puts
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_command
|
51
|
+
printf("%s@%s> ", $user, $host)
|
52
|
+
if line = gets
|
53
|
+
return line.strip.split(/\s+/)
|
54
|
+
else
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
parser = GetoptLong.new
|
60
|
+
parser.set_options(['--debug', GetoptLong::NO_ARGUMENT],
|
61
|
+
['--help', GetoptLong::NO_ARGUMENT],
|
62
|
+
['--port', GetoptLong::REQUIRED_ARGUMENT],
|
63
|
+
['--user', GetoptLong::REQUIRED_ARGUMENT],
|
64
|
+
['--auth', GetoptLong::REQUIRED_ARGUMENT],
|
65
|
+
['--starttls', GetoptLong::NO_ARGUMENT],
|
66
|
+
['--ssl', GetoptLong::NO_ARGUMENT])
|
67
|
+
begin
|
68
|
+
parser.each_option do |name, arg|
|
69
|
+
case name
|
70
|
+
when "--port"
|
71
|
+
$port = arg
|
72
|
+
when "--user"
|
73
|
+
$user = arg
|
74
|
+
when "--auth"
|
75
|
+
$auth = arg
|
76
|
+
when "--ssl"
|
77
|
+
$ssl = true
|
78
|
+
when "--starttls"
|
79
|
+
$starttls = true
|
80
|
+
when "--debug"
|
81
|
+
Net::IMAP.debug = true
|
82
|
+
when "--help"
|
83
|
+
usage
|
84
|
+
exit
|
85
|
+
end
|
86
|
+
end
|
87
|
+
rescue
|
88
|
+
abort usage
|
89
|
+
end
|
90
|
+
|
91
|
+
$host = ARGV.shift
|
92
|
+
unless $host
|
93
|
+
abort usage
|
94
|
+
end
|
95
|
+
|
96
|
+
imap = Net::IMAP.new($host, :port => $port, :ssl => $ssl)
|
97
|
+
begin
|
98
|
+
imap.starttls if $starttls
|
99
|
+
class << password = method(:get_password)
|
100
|
+
alias to_str call
|
101
|
+
end
|
102
|
+
imap.authenticate($auth, $user, password)
|
103
|
+
while true
|
104
|
+
cmd, *args = get_command
|
105
|
+
break unless cmd
|
106
|
+
begin
|
107
|
+
case cmd
|
108
|
+
when "list"
|
109
|
+
for mbox in imap.list("", args[0] || "*")
|
110
|
+
if mbox.attr.include?(Net::IMAP::NOSELECT)
|
111
|
+
prefix = "!"
|
112
|
+
elsif mbox.attr.include?(Net::IMAP::MARKED)
|
113
|
+
prefix = "*"
|
114
|
+
else
|
115
|
+
prefix = " "
|
116
|
+
end
|
117
|
+
print prefix, mbox.name, "\n"
|
118
|
+
end
|
119
|
+
when "select"
|
120
|
+
imap.select(args[0] || "inbox")
|
121
|
+
print "ok\n"
|
122
|
+
when "close"
|
123
|
+
imap.close
|
124
|
+
print "ok\n"
|
125
|
+
when "summary"
|
126
|
+
unless messages = imap.responses["EXISTS"][-1]
|
127
|
+
puts "not selected"
|
128
|
+
next
|
129
|
+
end
|
130
|
+
if messages > 0
|
131
|
+
for data in imap.fetch(1..-1, ["ENVELOPE"])
|
132
|
+
print data.seqno, ": ", data.attr["ENVELOPE"].subject, "\n"
|
133
|
+
end
|
134
|
+
else
|
135
|
+
puts "no message"
|
136
|
+
end
|
137
|
+
when "fetch"
|
138
|
+
if args[0]
|
139
|
+
data = imap.fetch(args[0].to_i, ["RFC822.HEADER", "RFC822.TEXT"])[0]
|
140
|
+
puts data.attr["RFC822.HEADER"]
|
141
|
+
puts data.attr["RFC822.TEXT"]
|
142
|
+
else
|
143
|
+
puts "missing argument"
|
144
|
+
end
|
145
|
+
when "logout", "exit", "quit"
|
146
|
+
break
|
147
|
+
when "help", "?"
|
148
|
+
print <<EOF
|
149
|
+
list [pattern] list mailboxes
|
150
|
+
select [mailbox] select mailbox
|
151
|
+
close close mailbox
|
152
|
+
summary display summary
|
153
|
+
fetch [msgno] display message
|
154
|
+
logout logout
|
155
|
+
help, ? display help message
|
156
|
+
EOF
|
157
|
+
else
|
158
|
+
print "unknown command: ", cmd, "\n"
|
159
|
+
end
|
160
|
+
rescue Net::IMAP::Error
|
161
|
+
puts $!
|
162
|
+
end
|
163
|
+
end
|
164
|
+
ensure
|
165
|
+
imap.logout
|
166
|
+
imap.disconnect
|
167
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-imap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shugo Maeda
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-02-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: net-protocol
|
@@ -39,34 +39,6 @@ dependencies:
|
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: digest
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
49
|
-
type: :development
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '0'
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: strscan
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
63
|
-
type: :development
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
42
|
description: Ruby client api for Internet Message Access Protocol
|
71
43
|
email:
|
72
44
|
- shugo@ruby-lang.org
|
@@ -127,6 +99,7 @@ files:
|
|
127
99
|
- rakelib/rfcs.rake
|
128
100
|
- rakelib/saslprep.rake
|
129
101
|
- rakelib/string_prep_tables_generator.rb
|
102
|
+
- sample/net-imap.rb
|
130
103
|
homepage: https://github.com/ruby/net-imap
|
131
104
|
licenses:
|
132
105
|
- Ruby
|
@@ -150,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
123
|
- !ruby/object:Gem::Version
|
151
124
|
version: '0'
|
152
125
|
requirements: []
|
153
|
-
rubygems_version: 3.4.
|
126
|
+
rubygems_version: 3.4.22
|
154
127
|
signing_key:
|
155
128
|
specification_version: 4
|
156
129
|
summary: Ruby client api for Internet Message Access Protocol
|