Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2017 12:43:24

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

Добрый день. Прошу помощи, поскольку не понимаю причины.
Есть простой код

 import os 
import imaplib
import email
import base64
imaplib.IMAP4.debug = imaplib.IMAP4_SSL.debug = 1
con = imaplib.IMAP4_SSL('imap.yandex.ru',993)
con.login('user@yandex.ru','pass')
con.select()
typ, data = con.search(None, 'ALL')
for num in data[0].split():
    typ, data = con.fetch(num, '(RFC822)')
    msg = email.message_from_string(data[0][1])
con.close()
con.logout()
при его выполнении получаю ошибку

Traceback (most recent call last):
File “mail1.py”, line 24, in <module>
msg = email.message_from_string(data)
File “C:\Python\Python35-32\lib\email\__init__.py”, line 38, in message_from_string
return Parser(*args, **kws).parsestr(s)
File “C:\Python\Python35-32\lib\email\parser.py”, line 68, in parsestr
return self.parse(StringIO(text), headersonly=headersonly)
TypeError: initial_value must be str or None, not bytes

Что не так в коде?

Офлайн

#2 Март 9, 2017 13:47:59

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

не так то что email.message_from_string должна получить строку или None, а вы ей передаете ХЗ что.
Пперед тем как вызывать

  msg = email.message_from_string(data[0][1])
впишите банальное
 print(data[0][1])
и посмотрите что у вас получиться.
Если у вас емейл в byte string то используйте функцию email.message_from_bytes вместо email.message_from_string



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 9, 2017 13:51:52)

Офлайн

#3 Март 9, 2017 14:49:37

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

PEHDOM
не так то что email.message_from_string должна получить строку или None, а вы ей передаете ХЗ что.Пперед тем как вызывать
спасибо. это помогло.
Остались правда два вопроса
1 - почему все-же в документации по разбору письма приводится код с email.message_from_string. и вроде он у них работает ?
2 - как “на глаз” определить что емейл в byte string?
вывод print такой

Received: from mxfront9g.mail.yandex.net ()
by mxfront9g.mail.yandex.net with LMTP id NOqTPqdb
for <…@yandex.ru>; Thu, 9 Mar 2017 15:27:54 +0300
Received: from f377.i.mail.ru (f377.i.mail.ru )
by mxfront9g.mail.yandex.net (nwsmtp/Yandex) with ESMTPS id 7fnfeo2kb6-RsKS1Zoi;
Thu, 09 Mar 2017 15:27:54 +0300
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
(Client certificate not present)
X-Yandex-Front: mxfront9g.mail.yandex.net
X-Yandex-TimeMark: 1489062474
Authentication-Results: mxfront9g.mail.yandex.net; spf=pass (mxfront9g.mail.yandex.net: domain of mail.ru designates 185.5.136.48 as permitted sender, rule smtp.mail=…….@mail.ru; dkim=pass header.i=@mail.ru
X-Yandex-Spam: 1
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2;
h=Content-Type:Message-ID:Reply-Toate:MIME-Version:Subject:To:From; bh=bYaCUHdyc8RnRRpjP9L5Zsc1LKGguw2rtmmiN9YzEwI=;
b=iCMj7oGCBx9/3YNI3VGOCH4ips4FKB+67m+ofUirAhNJMkOrgXac8WBMbpn0x1bzWdImXh+cvPl2q/TyqPJruw5qxj3YXOOBCLk/933QW/M40e0VxvYx1+zochXC74cxNO/ReazdG7KGiztUZv0kHxMha060E4RI4SNCrZ+oA3g=;
Received: by f377.i.mail.ru with local (envelope-from <…….@mail.ru>)
id 1clxAf-0003BH-Pv
for …….@yandex.ru; Thu, 09 Mar 2017 15:27:54 +0300
Received: by e.mail.ru with HTTP;
Thu, 09 Mar 2017 15:27:53 +0300
From: =?UTF-8?B?0JDQu9C10LrRgdC10Lk=?= <……@mail.ru>
To: ……@yandex.ru
Subject:
MIME-Version: 1.0
X-Mailer: Mail.Ru Mailer 1.0
Date: Thu, 09 Mar 2017 15:27:53 +0300
Reply-To: <…..@mail.ru>
X-Priority: 3 (Normal)
Message-ID: <1489062473.849043777@f377.i.mail.ru>
Content-Type: multipart/mixed;
boundary=“—-qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx-dPAdGhifo6YlDT0I-1489062473”
X-7FA49CB5: 0D63561A33F958A5B4A68A2F44B874789AC90D49A473DFC0FCC010F37BEFACFE9F18ECD7E95F35E929AFE063DF4C541CB5A4343D008B17D4EC727113A6DDA67A0BF2EBBBDD9D6B0F356F5FD5A3F18D9B
X-Mailru-Sender: DE5DDA8008B9F00295C28C396916243605EED43E75AFFA7D51AEA9E2D8CE0C5C3C51E4AC95BC2635358BD5945ACDE1E5E46B03FA7919E1F553490C98D2EC34A0577F194272E681429ADF3259A305784C61AB7FC983AAE23EAE208404248635DF
X-Mras: OK
X-Spam: undefined
Return-Path: ……@mail.ru
X-Yandex-Forward: 869e8845ec16d3c0ecbb3e9953908f3e


——qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx-dPAdGhifo6YlDT0I-1489062473
Content-Type: multipart/alternative;
boundary=“–ALT–qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx1489062473”


—-ALT–qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx1489062473
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

CgoKLS0tLS0tLS0g0J/QtdGA0LXRgdGL0LvQsNC10LzQvtC1INGB0L7QvtCx0YnQtdC90LjQtSAt
LS0tLS0tLQrQntGCINC60L7Qs9C+OiBhb3JiZ3JvdXBAeWFuZGV4LnJ1CtCa0L7QvNGDOiBGZWRp
blZFQGVzYy5ydXNoeWRyby5ydSwgYWlpc0B2bGFkcmR1LnNvLXVwcy5ydSwgODAwMjBAZXNjLXJ1
c2h5ZHJvLnJ1CtCa0L7Qv9C40Y86IHR1cmluQG9yZW0uc3UsIHhtbEBvcmVtLnN1LCBteW1haWxu
ZXRAbWFpbC5ydQrQlNCw0YLQsDog0KfQtdGC0LLQtdGA0LMsICA5INC80LDRgNGC0LAgMjAxNywg
ODowMCArMDM6MDAK0KLQtdC80LA6IFhNTDgwMDIwX9CQ0JjQmNChX9Ct0KHQmiDQoNGD0YHQk9C4
0LTRgNC+X9Cg0JEg0LPRgNGD0L/QvwoKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCg==

—-ALT–qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx1489062473
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64

CjxIVE1MPjxCT0RZPjxicj48YnI+PGJyPi0tLS0tLS0tINCf0LXRgNC10YHRi9C70LDQtdC80L7Q
tSDRgdC+0L7QsdGJ0LXQvdC40LUgLS0tLS0tLS08YnI+CtCe0YIg0LrQvtCz0L46IGFvcmJncm91
cEB5YW5kZXgucnU8YnI+CtCa0L7QvNGDOiBGZWRpblZFQGVzYy5ydXNoeWRyby5ydSwgYWlpc0B2
bGFkcmR1LnNvLXVwcy5ydSwgODAwMjBAZXNjLXJ1c2h5ZHJvLnJ1PGJyPgrQmtC+0L/QuNGPOiB0
dXJpbkBvcmVtLnN1LCB4bWxAb3JlbS5zdSwgbXltYWlsbmV0QG1haWwucnU8YnI+CtCU0LDRgtCw
OiDQp9C10YLQstC10YDQsywgIDkg0LzQsNGA0YLQsCAyMDE3LCA4OjAwICswMzowMDxicj4K0KLQ
tdC80LA6IFhNTDgwMDIwX9CQ0JjQmNChX9Ct0KHQmiDQoNGD0YHQk9C40LTRgNC+X9Cg0JEg0LPR
gNGD0L/Qvzxicj4KPGJyPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgkKCgoKCgoKCgoKCgoKPGRp
diBjbGFzcz0ianMtaGVscGVyIGpzLXJlYWRtc2ctbXNnIj4KCTxzdHlsZSB0eXBlPSJ0ZXh0L2Nz
cyI+PC9zdHlsZT4KIAk8ZGl2PgoJCTxiYXNlIHRhcmdldD0iX3NlbGYiIGhyZWY9Imh0dHBzOi8v
ZS5tYWlsLnJ1LyI+CgkJCiAgICAgICAgICAgIDxkaXYgaWQ9InN0eWxlXzE0ODkwMzU2MDcwMDAw
MDAwNTk0X0JPRFkiPjxicj4KPC9kaXY+CiAgICAgICAgICAgIAogICAgICAgIAoJCTxiYXNlIHRh
cmdldD0iX3NlbGYiIGhyZWY9Imh0dHBzOi8vZS5tYWlsLnJ1LyI+Cgk8L2Rpdj4KCgkKPC9kaXY+
CgoKCjxicj48aHI+PC9CT0RZPjwvSFRNTD4K

—-ALT–qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx1489062473–

——qvtaTBpzsz3G5zMvBiKJN0B5o35Kmzsx-dPAdGhifo6YlDT0I-1489062473
Content-Type: application/octet-stream; name=“=?UTF-8?B?ODAwMjBfNzgwNDQwMzk3Ml8yMDE3MDMwOF80MzlfMzMwMDAwNzEwMC54bWw=?=”
Content-Disposition: attachment; filename=“=?UTF-8?B?ODAwMjBfNzgwNDQwMzk3Ml8yMDE3MDMwOF80MzlfMzMwMDAwNzEwMC54bWw=?=”
Content-Transfer-Encoding: base64

Отредактировано alexey_gh (Март 10, 2017 08:37:54)

Офлайн

#4 Март 9, 2017 16:28:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

alexey_gh
 TypeError: initial_value must be str or None, not bytes
Что не так в коде?
Раз байты подаются, используй email.message_from_bytes() .

alexey_gh
вывод print такой
Там почтовые адреса есть в закодированном виде. Что ты постирал, этого не достаточно.



Отредактировано py.user.next (Март 9, 2017 16:31:05)

Офлайн

#5 Март 9, 2017 16:46:34

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

1. про документацию не скажу, не я ее писал.. но скоре всего у вас в теле письма(или еще где) кирилица, а у авторов документации сугубо латиница.
чтоб не заморачиваться можете сделать так

 try:
    msg = email.message_from_string(data[0][1])
except TypeError:
   msg = email.message_from_bytes(data[0][1]) 

2. Байтовая строка выглядит примерно так
b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd1\x8b'
но может и не отличаться от обычной стоки на первый взгляд, смотри пример ниже.
тип можете проверить с помошбю функции type()
 >>> a='Байты'.encode('utf-8')
>>> a
b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd1\x8b'
>>> type(a)
<class 'bytes'>
>>> b='Bytes'.encode('utf-8')
>>> b
b'Bytes'
>>> type(b)
<class 'bytes'>
>>> c='Строка'
>>> c
'Строка'
>>> type(c)
<class 'str'>





==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 9, 2017 16:57:37)

Офлайн

#6 Март 10, 2017 08:36:09

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.5.2 обработка писем email.message_from_string

PEHDOM
1. про документацию не скажу, не я ее писал.. но скоре всего у вас в теле письма(или еще где) кирилица, а у авторов документации сугубо латиница.чтоб не заморачиваться можете сделать так
Спасибо. Появилось хоть небольшое просветление в этом вопросе.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version