mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/net/imap.rb: add document and example code.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c32024a3b5
commit
8de229963c
2 changed files with 596 additions and 7 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Sat Mar 31 04:47:55 2001 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/net/imap.rb: add document and example code.
|
||||||
|
|
||||||
Fri Mar 30 22:56:56 2001 Shugo Maeda <shugo@ruby-lang.org>
|
Fri Mar 30 22:56:56 2001 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
* lib/net/imap.rb: rename ContinueRequest to ContinuationRequest.
|
* lib/net/imap.rb: rename ContinueRequest to ContinuationRequest.
|
||||||
|
|
599
lib/net/imap.rb
599
lib/net/imap.rb
|
@ -7,9 +7,10 @@ Copyright (C) 2000 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
This library is distributed under the terms of the Ruby license.
|
This library is distributed under the terms of the Ruby license.
|
||||||
You can freely distribute/modify this library.
|
You can freely distribute/modify this library.
|
||||||
|
|
||||||
== class Net::IMAP
|
== Net::IMAP
|
||||||
|
|
||||||
Net::IMAP implements Internet Message Access Protocol (IMAP) clients.
|
Net::IMAP implements Internet Message Access Protocol (IMAP) clients.
|
||||||
|
(The protocol is described in ((<[IMAP]>)).)
|
||||||
|
|
||||||
Net::IMAP supports multiple commands. For example,
|
Net::IMAP supports multiple commands. For example,
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ This script invokes the FETCH command and the SEARCH command concurrently.
|
||||||
|
|
||||||
Object
|
Object
|
||||||
|
|
||||||
=== Class Methods
|
=== Methods
|
||||||
|
|
||||||
: new(host, port = 143)
|
: new(host, port = 143)
|
||||||
Creates a new Net::IMAP object and connects it to the specified
|
Creates a new Net::IMAP object and connects it to the specified
|
||||||
|
@ -116,6 +117,7 @@ Object
|
||||||
: list(refname, mailbox)
|
: list(refname, mailbox)
|
||||||
Sends a LIST command, and returns a subset of names from
|
Sends a LIST command, and returns a subset of names from
|
||||||
the complete set of all names available to the client.
|
the complete set of all names available to the client.
|
||||||
|
The return value is an array of ((<Net::IMAP::MailboxList>)).
|
||||||
|
|
||||||
ex).
|
ex).
|
||||||
imap.create("foo/bar")
|
imap.create("foo/bar")
|
||||||
|
@ -127,10 +129,12 @@ Object
|
||||||
Sends a LSUB command, and returns a subset of names from the set
|
Sends a LSUB command, and returns a subset of names from the set
|
||||||
of names that the user has declared as being "active" or
|
of names that the user has declared as being "active" or
|
||||||
"subscribed".
|
"subscribed".
|
||||||
|
The return value is an array of ((<Net::IMAP::MailboxList>)).
|
||||||
|
|
||||||
: status(mailbox, attr)
|
: status(mailbox, attr)
|
||||||
Sends a STATUS command, and returns the status of the indicated
|
Sends a STATUS command, and returns the status of the indicated
|
||||||
mailbox.
|
mailbox.
|
||||||
|
The return value is a hash of attributes.
|
||||||
|
|
||||||
ex).
|
ex).
|
||||||
p imap.status("inbox", ["MESSAGES", "RECENT"])
|
p imap.status("inbox", ["MESSAGES", "RECENT"])
|
||||||
|
@ -180,6 +184,7 @@ Object
|
||||||
in the mailbox. the set parameter is a number or an array of
|
in the mailbox. the set parameter is a number or an array of
|
||||||
numbers or a Range object. the number is a message sequence
|
numbers or a Range object. the number is a message sequence
|
||||||
number (fetch) or a unique identifier (uid_fetch).
|
number (fetch) or a unique identifier (uid_fetch).
|
||||||
|
The return value is an array of ((<Net::IMAP::FetchData>)).
|
||||||
|
|
||||||
ex).
|
ex).
|
||||||
p imap.fetch(6..8, "UID")
|
p imap.fetch(6..8, "UID")
|
||||||
|
@ -202,6 +207,7 @@ Object
|
||||||
in the mailbox. the set parameter is a number or an array of
|
in the mailbox. the set parameter is a number or an array of
|
||||||
numbers or a Range object. the number is a message sequence
|
numbers or a Range object. the number is a message sequence
|
||||||
number (store) or a unique identifier (uid_store).
|
number (store) or a unique identifier (uid_store).
|
||||||
|
The return value is an array of ((<Net::IMAP::FetchData>)).
|
||||||
|
|
||||||
ex).
|
ex).
|
||||||
p imap.store(6..8, "+FLAGS", [:Deleted])
|
p imap.store(6..8, "+FLAGS", [:Deleted])
|
||||||
|
@ -238,6 +244,441 @@ Object
|
||||||
: response_handlers
|
: response_handlers
|
||||||
Returns all response handlers.
|
Returns all response handlers.
|
||||||
|
|
||||||
|
== Net::IMAP::ContinuationRequest
|
||||||
|
|
||||||
|
Net::IMAP::ContinuationRequest represents command continuation requests.
|
||||||
|
|
||||||
|
The command continuation request response is indicated by a "+" token
|
||||||
|
instead of a tag. This form of response indicates that the server is
|
||||||
|
ready to accept the continuation of a command from the client. The
|
||||||
|
remainder of this response is a line of text.
|
||||||
|
|
||||||
|
continue_req ::= "+" SPACE (resp_text / base64)
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: data
|
||||||
|
Returns the data (Net::IMAP::ResponseText).
|
||||||
|
|
||||||
|
: raw_data
|
||||||
|
Returns the raw data string.
|
||||||
|
|
||||||
|
== Net::IMAP::UntaggedResponse
|
||||||
|
|
||||||
|
Net::IMAP::UntaggedResponse represents untagged responses.
|
||||||
|
|
||||||
|
Data transmitted by the server to the client and status responses
|
||||||
|
that do not indicate command completion are prefixed with the token
|
||||||
|
"*", and are called untagged responses.
|
||||||
|
|
||||||
|
response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye /
|
||||||
|
mailbox_data / message_data / capability_data)
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: name
|
||||||
|
Returns the name such as "FLAGS", "LIST", "FETCH"....
|
||||||
|
|
||||||
|
: data
|
||||||
|
Returns the data such as an array of flag symbols,
|
||||||
|
a ((<Net::IMAP::MailboxList>)) object....
|
||||||
|
|
||||||
|
: raw_data
|
||||||
|
Returns the raw data string.
|
||||||
|
|
||||||
|
== Net::IMAP::TaggedResponse
|
||||||
|
|
||||||
|
Net::IMAP::TaggedResponse represents tagged responses.
|
||||||
|
|
||||||
|
The server completion result response indicates the success or
|
||||||
|
failure of the operation. It is tagged with the same tag as the
|
||||||
|
client command which began the operation.
|
||||||
|
|
||||||
|
response_tagged ::= tag SPACE resp_cond_state CRLF
|
||||||
|
|
||||||
|
tag ::= 1*<any ATOM_CHAR except "+">
|
||||||
|
|
||||||
|
resp_cond_state ::= ("OK" / "NO" / "BAD") SPACE resp_text
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: tag
|
||||||
|
Returns the tag.
|
||||||
|
|
||||||
|
: name
|
||||||
|
Returns the name. the name is one of "OK", "NO", "BAD".
|
||||||
|
|
||||||
|
: data
|
||||||
|
Returns the data. See ((<Net::IMAP::ResponseText>)).
|
||||||
|
|
||||||
|
: raw_data
|
||||||
|
Returns the raw data string.
|
||||||
|
|
||||||
|
== Net::IMAP::ResponseText
|
||||||
|
|
||||||
|
Net::IMAP::ResponseText represents texts of responses.
|
||||||
|
The text may be prefixed by the response code.
|
||||||
|
|
||||||
|
resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text)
|
||||||
|
;; text SHOULD NOT begin with "[" or "="
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: code
|
||||||
|
Returns the response code. See ((<Net::IMAP::ResponseCode>)).
|
||||||
|
|
||||||
|
: text
|
||||||
|
Returns the text.
|
||||||
|
|
||||||
|
== Net::IMAP::ResponseCode
|
||||||
|
|
||||||
|
Net::IMAP::ResponseCode represents response codes.
|
||||||
|
|
||||||
|
resp_text_code ::= "ALERT" / "PARSE" /
|
||||||
|
"PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" /
|
||||||
|
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
|
||||||
|
"UIDVALIDITY" SPACE nz_number /
|
||||||
|
"UNSEEN" SPACE nz_number /
|
||||||
|
atom [SPACE 1*<any TEXT_CHAR except "]">]
|
||||||
|
|
||||||
|
=== SuperClass
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: name
|
||||||
|
Returns the name such as "ALERT", "PERMANENTFLAGS", "UIDVALIDITY"....
|
||||||
|
|
||||||
|
: data
|
||||||
|
Returns the data if it exists.
|
||||||
|
|
||||||
|
== Net::IMAP::MailboxList
|
||||||
|
|
||||||
|
Net::IMAP::MailboxList represents contents of the LIST response.
|
||||||
|
|
||||||
|
mailbox_list ::= "(" #("\Marked" / "\Noinferiors" /
|
||||||
|
"\Noselect" / "\Unmarked" / flag_extension) ")"
|
||||||
|
SPACE (<"> QUOTED_CHAR <"> / nil) SPACE mailbox
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: attr
|
||||||
|
Returns the name attributes.
|
||||||
|
|
||||||
|
: delim
|
||||||
|
Returns the hierarchy delimiter
|
||||||
|
|
||||||
|
: name
|
||||||
|
Returns the mailbox name.
|
||||||
|
|
||||||
|
== Net::IMAP::StatusData
|
||||||
|
|
||||||
|
Net::IMAP::StatusData represents contents of the STATUS response.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Object
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: mailbox
|
||||||
|
Returns the mailbox name.
|
||||||
|
|
||||||
|
: attr
|
||||||
|
Returns a hash. Each key is one of "MESSAGES", "RECENT", "UIDNEXT",
|
||||||
|
"UIDVALIDITY", "UNSEEN". Each value is a number.
|
||||||
|
|
||||||
|
== Net::IMAP::FetchData
|
||||||
|
|
||||||
|
Net::IMAP::FetchData represents contents of the FETCH response.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Object
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: seqno
|
||||||
|
Returns the message sequence number.
|
||||||
|
(Note: not the unique identifier, even for the UID command response.)
|
||||||
|
|
||||||
|
: attr
|
||||||
|
Returns a hash. Each key is a data item name, and each value is
|
||||||
|
its value.
|
||||||
|
|
||||||
|
The current data items are:
|
||||||
|
|
||||||
|
: BODY
|
||||||
|
A form of BODYSTRUCTURE without extension data.
|
||||||
|
: BODY[<section>]<<origin_octet>>
|
||||||
|
A string expressing the body contents of the specified section.
|
||||||
|
: BODYSTRUCTURE
|
||||||
|
An object that describes the ((<[MIME-IMB]>)) body structure of a message.
|
||||||
|
See ((<Net::IMAP::BodyTypeBasic>)), ((<Net::IMAP::BodyTypeText>)),
|
||||||
|
((<Net::IMAP::BodyTypeMessage>)), ((<Net::IMAP::BodyTypeMultipart>)).
|
||||||
|
: ENVELOPE
|
||||||
|
A ((<Net::IMAP::Envelope>)) object that describes the envelope
|
||||||
|
structure of a message.
|
||||||
|
: FLAGS
|
||||||
|
A array of flag symbols that are set for this message.
|
||||||
|
: INTERNALDATE
|
||||||
|
A string representing the internal date of the message.
|
||||||
|
: RFC822
|
||||||
|
Equivalent to BODY[].
|
||||||
|
: RFC822.HEADER
|
||||||
|
Equivalent to BODY.PEEK[HEADER].
|
||||||
|
: RFC822.SIZE
|
||||||
|
A number expressing the ((<[RFC-822]>)) size of the message.
|
||||||
|
: RFC822.TEXT
|
||||||
|
Equivalent to BODY[TEXT].
|
||||||
|
: UID
|
||||||
|
A number expressing the unique identifier of the message.
|
||||||
|
|
||||||
|
== Net::IMAP::Envelope
|
||||||
|
|
||||||
|
Net::IMAP::Envelope represents envelope structures of messages.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: date
|
||||||
|
Retunns a string that represents the date.
|
||||||
|
|
||||||
|
: subject
|
||||||
|
Retunns a string that represents the subject.
|
||||||
|
|
||||||
|
: from
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the from.
|
||||||
|
|
||||||
|
: sender
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the sender.
|
||||||
|
|
||||||
|
: reply_to
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the reply-to.
|
||||||
|
|
||||||
|
: to
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the to.
|
||||||
|
|
||||||
|
: cc
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the cc.
|
||||||
|
|
||||||
|
: bcc
|
||||||
|
Retunns an array of ((<Net::IMAP::Address>)) that represents the bcc.
|
||||||
|
|
||||||
|
: in_reply_to
|
||||||
|
Retunns a string that represents the in-reply-to.
|
||||||
|
|
||||||
|
: message_id
|
||||||
|
Retunns a string that represents the message-id.
|
||||||
|
|
||||||
|
== Net::IMAP::Address
|
||||||
|
|
||||||
|
((<Net::IMAP::Address>)) represents electronic mail addresses.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: name
|
||||||
|
Returns the phrase from ((<[RFC-822]>)) mailbox.
|
||||||
|
|
||||||
|
: route
|
||||||
|
Returns the route from ((<[RFC-822]>)) route-addr.
|
||||||
|
|
||||||
|
: mailbox
|
||||||
|
nil indicates end of ((<[RFC-822]>)) group.
|
||||||
|
If non-nil and host is nil, returns ((<[RFC-822]>)) group name.
|
||||||
|
Otherwise, returns ((<[RFC-822]>)) local-part
|
||||||
|
|
||||||
|
: host
|
||||||
|
nil indicates ((<[RFC-822]>)) group syntax.
|
||||||
|
Otherwise, returns ((<[RFC-822]>)) domain name.
|
||||||
|
|
||||||
|
== Net::IMAP::ContentDisposition
|
||||||
|
|
||||||
|
Net::IMAP::ContentDisposition represents Content-Disposition fields.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: dsp_type
|
||||||
|
Returns the disposition type.
|
||||||
|
|
||||||
|
: param
|
||||||
|
Returns a hash that represents parameters of the Content-Disposition
|
||||||
|
field.
|
||||||
|
|
||||||
|
== Net::IMAP::BodyTypeBasic
|
||||||
|
|
||||||
|
Net::IMAP::BodyTypeBasic represents basic body structures of messages.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: media_type
|
||||||
|
Returns the content media type name as defined in ((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: subtype
|
||||||
|
Returns the content subtype name as defined in ((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: param
|
||||||
|
Returns a hash that represents parameters as defined in
|
||||||
|
((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: content_id
|
||||||
|
Returns a string giving the content id as defined in ((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: description
|
||||||
|
Returns a string giving the content description as defined in
|
||||||
|
((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: encoding
|
||||||
|
Returns a string giving the content transfer encoding as defined in
|
||||||
|
((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: size
|
||||||
|
Returns a number giving the size of the body in octets.
|
||||||
|
|
||||||
|
: md5
|
||||||
|
Returns a string giving the body MD5 value as defined in ((<[MD5]>)).
|
||||||
|
|
||||||
|
: disposition
|
||||||
|
Returns a ((<Net::IMAP::ContentDisposition>)) object giving
|
||||||
|
the content disposition.
|
||||||
|
|
||||||
|
: language
|
||||||
|
Returns a string or an array of strings giving the body
|
||||||
|
language value as defined in [LANGUAGE-TAGS].
|
||||||
|
|
||||||
|
: extension
|
||||||
|
Returns extension data.
|
||||||
|
|
||||||
|
: multipart?
|
||||||
|
Returns false.
|
||||||
|
|
||||||
|
== Net::IMAP::BodyTypeText
|
||||||
|
|
||||||
|
Net::IMAP::BodyTypeText represents TEXT body structures of messages.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: lines
|
||||||
|
Returns the size of the body in text lines.
|
||||||
|
|
||||||
|
And Net::IMAP::BodyTypeText has all methods of ((<Net::IMAP::BodyTypeBasic>)).
|
||||||
|
|
||||||
|
== Net::IMAP::BodyTypeMessage
|
||||||
|
|
||||||
|
Net::IMAP::BodyTypeMessage represents MESSAGE/RFC822 body structures of messages.
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: envelope
|
||||||
|
Returns a ((<Net::IMAP::Envelope>)) giving the envelope structure.
|
||||||
|
|
||||||
|
: body
|
||||||
|
Returns an object giving the body structure.
|
||||||
|
|
||||||
|
And Net::IMAP::BodyTypeMessage has all methods of ((<Net::IMAP::BodyTypeText>)).
|
||||||
|
|
||||||
|
== Net::IMAP::BodyTypeText
|
||||||
|
|
||||||
|
=== Super Class
|
||||||
|
|
||||||
|
Struct
|
||||||
|
|
||||||
|
=== Methods
|
||||||
|
|
||||||
|
: media_type
|
||||||
|
Returns the content media type name as defined in ((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: subtype
|
||||||
|
Returns the content subtype name as defined in ((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: parts
|
||||||
|
Returns multiple parts.
|
||||||
|
|
||||||
|
: param
|
||||||
|
Returns a hash that represents parameters as defined in
|
||||||
|
((<[MIME-IMB]>)).
|
||||||
|
|
||||||
|
: disposition
|
||||||
|
Returns a ((<Net::IMAP::ContentDisposition>)) object giving
|
||||||
|
the content disposition.
|
||||||
|
|
||||||
|
: language
|
||||||
|
Returns a string or an array of strings giving the body
|
||||||
|
language value as defined in [LANGUAGE-TAGS].
|
||||||
|
|
||||||
|
: extension
|
||||||
|
Returns extension data.
|
||||||
|
|
||||||
|
: multipart?
|
||||||
|
Returns true.
|
||||||
|
|
||||||
|
== References
|
||||||
|
|
||||||
|
: [IMAP]
|
||||||
|
M. Crispin, "INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1",
|
||||||
|
RFC 2060, December 1996.
|
||||||
|
|
||||||
|
: [LANGUAGE-TAGS]
|
||||||
|
Alvestrand, H., "Tags for the Identification of
|
||||||
|
Languages", RFC 1766, March 1995.
|
||||||
|
|
||||||
|
: [MD5]
|
||||||
|
Myers, J., and M. Rose, "The Content-MD5 Header Field", RFC
|
||||||
|
1864, October 1995.
|
||||||
|
|
||||||
|
: [MIME-IMB]
|
||||||
|
Freed, N., and N. Borenstein, "MIME (Multipurpose Internet
|
||||||
|
Mail Extensions) Part One: Format of Internet Message Bodies", RFC
|
||||||
|
2045, November 1996.
|
||||||
|
|
||||||
|
: [RFC-822]
|
||||||
|
Crocker, D., "Standard for the Format of ARPA Internet Text
|
||||||
|
Messages", STD 11, RFC 822, University of Delaware, August 1982.
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
require "socket"
|
require "socket"
|
||||||
|
@ -353,7 +794,7 @@ module Net
|
||||||
def status(mailbox, attr)
|
def status(mailbox, attr)
|
||||||
synchronize do
|
synchronize do
|
||||||
send_command("STATUS", mailbox, attr)
|
send_command("STATUS", mailbox, attr)
|
||||||
return @responses.delete("STATUS")[-1][1]
|
return @responses.delete("STATUS")[-1].attr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -791,7 +1232,7 @@ module Net
|
||||||
Address = Struct.new(:name, :route, :mailbox, :host)
|
Address = Struct.new(:name, :route, :mailbox, :host)
|
||||||
ContentDisposition = Struct.new(:dsp_type, :param)
|
ContentDisposition = Struct.new(:dsp_type, :param)
|
||||||
|
|
||||||
class BodyTypeBasic < Struct.new(:media_type, :media_subtype,
|
class BodyTypeBasic < Struct.new(:media_type, :subtype,
|
||||||
:param, :content_id,
|
:param, :content_id,
|
||||||
:description, :encoding, :size,
|
:description, :encoding, :size,
|
||||||
:md5, :disposition, :language,
|
:md5, :disposition, :language,
|
||||||
|
@ -799,9 +1240,14 @@ module Net
|
||||||
def multipart?
|
def multipart?
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def media_subtype
|
||||||
|
$stderr.printf("warning: media_subtype is obsolete.\n")
|
||||||
|
$stderr.printf(" use subtype instead.\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class BodyTypeText < Struct.new(:media_type, :media_subtype,
|
class BodyTypeText < Struct.new(:media_type, :subtype,
|
||||||
:param, :content_id,
|
:param, :content_id,
|
||||||
:description, :encoding, :size,
|
:description, :encoding, :size,
|
||||||
:lines,
|
:lines,
|
||||||
|
@ -810,9 +1256,14 @@ module Net
|
||||||
def multipart?
|
def multipart?
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def media_subtype
|
||||||
|
$stderr.printf("warning: media_subtype is obsolete.\n")
|
||||||
|
$stderr.printf(" use subtype instead.\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class BodyTypeMessage < Struct.new(:media_type, :media_subtype,
|
class BodyTypeMessage < Struct.new(:media_type, :subtype,
|
||||||
:param, :content_id,
|
:param, :content_id,
|
||||||
:description, :encoding, :size,
|
:description, :encoding, :size,
|
||||||
:envelope, :body, :lines,
|
:envelope, :body, :lines,
|
||||||
|
@ -821,15 +1272,25 @@ module Net
|
||||||
def multipart?
|
def multipart?
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def media_subtype
|
||||||
|
$stderr.printf("warning: media_subtype is obsolete.\n")
|
||||||
|
$stderr.printf(" use subtype instead.\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class BodyTypeMultipart < Struct.new(:media_type, :media_subtype,
|
class BodyTypeMultipart < Struct.new(:media_type, :subtype,
|
||||||
:parts,
|
:parts,
|
||||||
:param, :disposition, :language,
|
:param, :disposition, :language,
|
||||||
:extension)
|
:extension)
|
||||||
def multipart?
|
def multipart?
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def media_subtype
|
||||||
|
$stderr.printf("warning: media_subtype is obsolete.\n")
|
||||||
|
$stderr.printf(" use subtype instead.\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class ResponseParser
|
class ResponseParser
|
||||||
|
@ -1991,3 +2452,127 @@ module Net
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if __FILE__ == $0
|
||||||
|
require "getoptlong"
|
||||||
|
|
||||||
|
$stdout.sync = true
|
||||||
|
$port = "imap2"
|
||||||
|
$user = ENV["USER"] || ENV["LOGNAME"]
|
||||||
|
$auth = "cram-md5"
|
||||||
|
|
||||||
|
def usage
|
||||||
|
$stderr.print <<EOF
|
||||||
|
usage: #{$0} [options] <host>
|
||||||
|
|
||||||
|
--help print this message
|
||||||
|
--port=PORT specifies port
|
||||||
|
--user=USER specifies user
|
||||||
|
--auth=AUTH specifies auth type
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_password
|
||||||
|
print "password: "
|
||||||
|
system("stty", "-echo")
|
||||||
|
begin
|
||||||
|
return gets.chop
|
||||||
|
ensure
|
||||||
|
system("stty", "echo")
|
||||||
|
print "\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_command
|
||||||
|
printf("%s@%s> ", $user, $host)
|
||||||
|
if line = gets
|
||||||
|
return line.strip.split(/\s+/)
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
parser = GetoptLong.new
|
||||||
|
parser.set_options(['--help', GetoptLong::NO_ARGUMENT],
|
||||||
|
['--port', GetoptLong::REQUIRED_ARGUMENT],
|
||||||
|
['--user', GetoptLong::REQUIRED_ARGUMENT],
|
||||||
|
['--auth', GetoptLong::REQUIRED_ARGUMENT])
|
||||||
|
begin
|
||||||
|
parser.each_option do |name, arg|
|
||||||
|
case name
|
||||||
|
when "--port"
|
||||||
|
$port = arg
|
||||||
|
when "--user"
|
||||||
|
$user = arg
|
||||||
|
when "--auth"
|
||||||
|
$auth = arg
|
||||||
|
when "--help"
|
||||||
|
usage
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
usage
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
$host = ARGV.shift
|
||||||
|
unless $host
|
||||||
|
usage
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
imap = Net::IMAP.new($host, $port)
|
||||||
|
begin
|
||||||
|
password = get_password
|
||||||
|
imap.authenticate($auth, $user, password)
|
||||||
|
while true
|
||||||
|
cmd, *args = get_command
|
||||||
|
break unless cmd
|
||||||
|
begin
|
||||||
|
case cmd
|
||||||
|
when "list", "ls"
|
||||||
|
for mbox in imap.list("", args[0] || "*")
|
||||||
|
puts mbox.name
|
||||||
|
end
|
||||||
|
when "select", "cd"
|
||||||
|
imap.select(args[0] || "inbox")
|
||||||
|
print "ok\n"
|
||||||
|
when "summary"
|
||||||
|
if imap.responses["EXISTS"][-1] > 0
|
||||||
|
for data in imap.fetch(1..-1, ["ENVELOPE"])
|
||||||
|
print data.seqno, " ", data.attr["ENVELOPE"].subject, "\n"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
puts "no message"
|
||||||
|
end
|
||||||
|
when "show", "cat"
|
||||||
|
if args[0]
|
||||||
|
data = imap.fetch(args[0].to_i, ["RFC822.HEADER", "RFC822.TEXT"])[0]
|
||||||
|
puts data.attr["RFC822.HEADER"]
|
||||||
|
puts data.attr["RFC822.TEXT"]
|
||||||
|
else
|
||||||
|
puts "missing argument"
|
||||||
|
end
|
||||||
|
when "exit", "quit", "logout"
|
||||||
|
break
|
||||||
|
when "help", "?"
|
||||||
|
print <<EOF
|
||||||
|
list [pattern], ls [pattern] list mailboxes
|
||||||
|
select [mailbox], cd [mailbox] select mailbox
|
||||||
|
summary display summary
|
||||||
|
show [msgno], cat [msgno] display message
|
||||||
|
help, ? display help message
|
||||||
|
EOF
|
||||||
|
else
|
||||||
|
print "unknown command: ", cmd, "\n"
|
||||||
|
end
|
||||||
|
rescue Net::IMAP::Error
|
||||||
|
puts $!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
imap.logout
|
||||||
|
imap.disconnect
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue