Как стать автором
Обновить

Ruby проверка почты imap/pop

Может кому-то нравится проверять почту через браузер, Evolution или Outlook, но я люблю консоль (=
И так, начнем-с…

подключаем модули — тут все просто…
require 'rubygems'
require 'activesupport'
require 'net/imap'
require 'tmail'
require 'net/pop'


смотрим что там у нас за параметры: 1ый — сервер, например gmail.com; 2ой — логин к почте; 3ий — пароль к ней же
puts "ARGV[0]="+ARGV[0].to_s+" ARGV[1]="+ARGV[1].to_s+" ARGV[2]="+ARGV[2].to_s


если проверяется почта на гугле.
if ARGV[0]=='gmail.com'

можно добавить и другие сервисы, просто добавив || ARGV[0]=='yahoo.com' например, но мне хватает гугла, да и на яху доступ по имап платный(

порт для соединения по имап
port=993


адрес сервера, логин и пасс
server = 'imap.'+ARGV[0].to_s
login = ARGV[1].to_s
password = ARGV[2].to_s


устанавливаем соединение с сервером и логинимся
imap = Net::IMAP::new(server, port, true)
imap.login(login,password)


просматриваем папку входящие
imap.examine('INBOX')

кстати, чтобы просмотреть папку спам, напрмер, нужно написать вот так (крэйзи русский язык):
imap.examine('[Gmail]/&BCEEPwQwBDw-')


цикл по всем сообщениям
imap.search(["NOT", "DELETED"]).each do |message_id|


выбираем заголовок и тело письма
envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
mail = TMail::Mail.parse(imap.fetch(message_id, "BODY[]")[0].attr["BODY[]"])


создаем файлик и записываем в него тело письма…
idata=envelope.date.to_date
File.open(ARGV[1].to_s+"_"+ARGV[0].to_s+"_"+idata.to_s+"_"+message_id.to_s+".html","w").write(mail.body)


ставим флаги для писем как удаленные, обновляем инфо на сервере о флагах и отключаемся…
imap.store(message_id, "+FLAGS", [:Deleted])
end
imap.expunge()
imap.disconnect


иначе, т.е. у нас нет возможности подконнектиться к серверу по имап, то подключаемся по ПОПу
else
pop = Net::POP3.new("pop."+ARGV[0], nil)
pop.start(ARGV[1], ARGV[2])


если есть письма, то для каждого письма:
в хедере ищем дату…
и опять же как и по имап создаем файлик и записываем в него тело письма
if !pop.mails.empty?
i=0
pop.each_mail do |m|
m.header=~/Date:(.*)/
mdata=$1
File.open(ARGV[1].to_s+"_"+ARGV[0].to_s+"_"+mdata.to_s+"_"+i.to_s+".html","w").write(m.mail)


удаляем письмо с сервера и закрываем соединение…
i+=1
m.delete
end
end
pop.finish
end


вот так вот немного коряво конечно получилось, но главное основные принципы работы, а там уже можно чуть дальше копнуть и сделать свой почтовый клиент… дерзаем (=
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.