Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Получение почты с gmail используя python  (Прочитано 5338 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 4030230

  • Автор темы
  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Получение почты с gmail используя python
« : 27 Февраля 2009, 13:26:08 »
Добрый день! Подскажите, никак не могу понять что делаю не так!
import poplib, email, imaplib
in_server = 'pop.gmail.com'

class cb_import:
    def receive_imap(self):
print "connecting"
m = imaplib.IMAP4_SSL(in_server)
print m.login(username, userpass)
print m.select()
typ, data = m.search(None, 'ALL')
print data
for num in data[0].split():
    typ, data = m.fetch(num, '(RFC822)')
    print 'Message %s\n%s\n' % (num, data[0][1])
    msg = email.message_from_string(data[0][1])
    print "Date:",msg.get("Date")
    print "Message-ID:",msg.get("Message-ID")
    print "Subject:",msg.get("Subject")
    attachments = msg.get_payload()
    for part in attachments:
filename = part.get_filename()
if filename:
   print filename
   f = open(filename, "wb")
   f.write(part.get_payload(decode=1))
   f.close
m.close()
m.logout()

  def receive_mail(self):
        con = poplib.POP3_SSL(in_server,995)
print "Connecting to",username
        print con.user(username)
        print con.pass_(userpass)
print con.stat()
        response, lst, octets = con.list()
        for msgnum, msgsize in [i.split() for i in lst]:
            (resp, lines, octets) = con.retr(msgnum)
            msgtxt = "\n".join(lines)+"\n\n"
            msg = email.message_from_string(msgtxt)
            msg_from = msg['from']
            msg_to = msg['to']
            msg_date = msg['date']
            msg_subj = "".join([text for text,enc in dkh(msg['subject'])])
            print "* От: %s\n* Кому: %s\n* Дата: %s\n* Тема: %s\n" % (msg_from,msg_to,msg_date,msg_subj)
            msg_parts = [(part.get_filename(), part.get_payload(decode=True))
                         for part in msg.walk() if part.get_content_type() == 'text/plain']
            for name,data in msg_parts:
                if name != None: # вложенный текстовый файл
                    print "Вложенный файл: "+name
                    f = file(name,'wb')
                    f.write(data)
                    f.close()
                else: # текст письма
                    print "Текст письма: "+str(data)
        con.quit()

cb = cb_import()
print "---------------POP3"
cb.receive_mail()
print "---------------IMAP"
cb.receive_imap()

На выходе получаю:

---------------POP3
Connecting to zzz@gmail.com
+OK send PASS
+OK Welcome.
(0, 0)
---------------IMAP
connecting
('OK', ['zzz@gmail.com authenticated (Success)'])
('OK', ['8'])
['1 2 3 4 5 6 7 8']

Первый вопрос: почему через pop3 показывает, что писем в ящике 0, хотя их там 8?
Второй вопрос: что не так с получением почты через imap? Вчера оно на linux'e работало и распаковывало вложения, сегодня на винде стопорится непонятно почему ((((

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Получение почты с gmail используя python
« Ответ #1 : 27 Февраля 2009, 17:27:35 »
По первому вопросу могут помочь дебажные сообщения. В http-сервере и клиенте их точно можно включить, в почтовом, думаю, тоже.

По второму - может, версии питона различаются?
Например, в линуксе уже исправленный баг, а в винде еще нет...
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 4030230

  • Автор темы
  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Re: Получение почты с gmail используя python
« Ответ #2 : 27 Февраля 2009, 21:14:56 »
По первому вопросу могут помочь дебажные сообщения. В http-сервере и клиенте их точно можно включить, в почтовом, думаю, тоже.

По второму - может, версии питона различаются?
Например, в линуксе уже исправленный баг, а в винде еще нет...

Для первого случая поставил debug_level в 2, получил
Connecting to zzz@gmail.com
*cmd* 'USER zzz@gmail.com'
*put* 'USER zzz@gmail.com'
*get* '+OK send PASS\r\n'
*resp* '+OK send PASS'
+OK send PASS
*cmd* 'PASS xxx'
*put* 'PASS xxx'
*get* '+OK Welcome.\r\n'
*resp* '+OK Welcome.'
+OK Welcome.
*cmd* 'STAT'
*put* 'STAT'
*get* '+OK 0 0\r\n'
*resp* '+OK 0 0'
*stat* ['+OK', '0', '0']
0
*cmd* 'LIST'
*put* 'LIST'
*get* '+OK 0 messages (0 bytes)\r\n'
*resp* '+OK 0 messages (0 bytes)'
*get* '.\r\n'
*cmd* 'QUIT'
*put* 'QUIT'
*get* '+OK Farewell.\r\n'
*resp* '+OK Farewell.'
К сожалению мне оно не помогло понять, почему poplib не хочет получать почту.

Для второго - да, у меня на линуксе стоит 2.5.2, а на машине с Windows 2.6.1. Попробую завтра там поставить другую версию, но все равно как-то они подозрительно баги фиксят :/

Оффлайн 4030230

  • Автор темы
  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Re: Получение почты с gmail используя python
« Ответ #3 : 28 Февраля 2009, 12:53:34 »
poplib стал показывать правильное количество писем, если к логину добавить recent:, но больше он ничего не хочет делать!
И это при том, что на перле через поп все работает.

imap под Windowsом никак не хочет работать.
_______________
жизнь гавно! ((((((((((

Оффлайн 4030230

  • Автор темы
  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Re: Получение почты с gmail используя python
« Ответ #4 : 28 Февраля 2009, 20:29:08 »
Я все понял, в том месте просто неправильный интернет. Код там и в линуксе отказывается работать, почтовые клиенты тоже не могут скачать почту. Пойдем в обход! =)

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Получение почты с gmail используя python
« Ответ #5 : 02 Марта 2009, 10:37:25 »
:))
У меня была мысль предложить попробовать обычный почтовый клинет и посмотреть его трафик wireshark-ом.

"Аппаздаал, аппаздал!" (Пушкин из мультика "Буревестник")
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Bers

  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
    • Домашняя страничка
Re: Получение почты с gmail используя python
« Ответ #6 : 03 Марта 2009, 21:20:58 »
есть же python-libgmail, зачем всё это? или я что-то путаю?

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.