This library provides functionality for retrieving email via POP3
, the Post Office Protocol version 3. For details of POP3
, see [RFC1939] (www.ietf.org/rfc/rfc1939.txt).
This example retrieves messages from the server and deletes them on the server.
Messages are written to files named ‘inbox/1’, ‘inbox/2’, .… Replace ‘pop.example.com’ with your POP3
server address, and ‘YourAccount’ and ‘YourPassword’ with the appropriate account details.
require 'net/pop' pop = Net::POP3.new('pop.example.com') pop.start('YourAccount', 'YourPassword') # (1) if pop.mails.empty? puts 'No mail.' else i = 0 pop.each_mail do |m| # or "pop.mails.each ..." # (2) File.open("inbox/#{i}", 'w') do |f| f.write m.pop end m.delete i += 1 end puts "#{pop.mails.size} mails popped." end pop.finish # (3)
Call Net::POP3#start
and start POP session.
Access messages by using POP3#each_mail
and/or POP3#mails
.
Close POP session by calling POP3#finish
or use the block form of start
.
The example above is very verbose. You can shorten the code by using some utility methods. First, the block form of Net::POP3.start
can be used instead of POP3.new
, POP3#start
and POP3#finish
.
require 'net/pop' Net::POP3.start('pop.example.com', 110, 'YourAccount', 'YourPassword') do |pop| if pop.mails.empty? puts 'No mail.' else i = 0 pop.each_mail do |m| # or "pop.mails.each ..." File.open("inbox/#{i}", 'w') do |f| f.write m.pop end m.delete i += 1 end puts "#{pop.mails.size} mails popped." end end
POP3#delete_all
is an alternative for each_mail
and delete.
require 'net/pop' Net::POP3.start('pop.example.com', 110, 'YourAccount', 'YourPassword') do |pop| if pop.mails.empty? puts 'No mail.' else i = 1 pop.delete_all do |m| File.open("inbox/#{i}", 'w') do |f| f.write m.pop end i += 1 end end end
And here is an even shorter example.
require 'net/pop' i = 0 Net::POP3.delete_all('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| File.open("inbox/#{i}", 'w') do |f| f.write m.pop end i += 1 end
All the examples above get each message as one big string. This example avoids this.
require 'net/pop' i = 1 Net::POP3.delete_all('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| File.open("inbox/#{i}", 'w') do |f| m.pop do |chunk| # get a message little by little. f.write chunk end i += 1 end end
APOP
The net/pop library supports APOP
authentication. To use APOP
, use the Net::APOP
class instead of the Net::POP3
class. You can use the utility method, Net::POP3.APOP()
. For example:
require 'net/pop' # Use APOP authentication if $isapop == true pop = Net::POP3.APOP($isapop).new('apop.example.com', 110) pop.start('YourAccount', 'YourPassword') do |pop| # Rest of the code is the same. end
If your POP server provides UIDL functionality, you can grab only selected mails from the POP server. e.g.
def need_pop?( id ) # determine if we need pop this mail... end Net::POP3.start('pop.example.com', 110, 'Your account', 'Your password') do |pop| pop.mails.select { |m| need_pop?(m.unique_id) }.each do |m| do_something(m.pop) end end
The POPMail#unique_id()
method returns the unique-id of the message as a String
. Normally the unique-id is a hash of the message.
This class represents a message which exists on the POP server. Instances of this class are created by the POP3
class; they should not be directly created by the user.
ReadTimeout
, a subclass of Timeout::Error
, is raised if a chunk of the response cannot be read within the read_timeout.
WriteTimeout
, a subclass of Timeout::Error
, is raised if a chunk of the response cannot be written within the write_timeout. Not raised on Windows.
Represents an SMTP
command syntax error (error code 500)
Represents a fatal SMTP
error (error code 5xx, except for 500)
Unexpected reply code returned from server.
Generates all integers which are greater than 2 and are not divisible by either 2 or 3.
This is a pseudo-prime generator, suitable on checking primality of an integer by brute force method.
Internal use. An implementation of Eratosthenes’ sieve
The error type thrown by all PStore
methods.