Проблема с получением HTML из электронной почты: я получаю только строку символов - PullRequest
0 голосов
/ 04 мая 2019

Мне нужно получить html из моих писем, написанный мною код отлично работал для других писем, но для письма от одного отправителя вместо HTML возвращалась большая строка символов.

обновление: полученная строка находится в base64, у меня все еще есть проблема, так как мой код получает только часть base64 электронной почты, но не HTML.

Вот как выглядит мой код:

m = imaplib.IMAP4_SSL('imap.mail.yahoo.com')
m.login('xxxxxx', 'xxxxxxxx')

rv, mailboxes = m.list()
if rv == 'OK':
    print ("Mailboxes:")
    print (mailboxes)


def process_mailbox(m):
  rv, data = m.search(None, "ALL")
  if rv != 'OK':
      print ("No messages found!")
      return

  for num in data[0].split():
      rv, data = m.fetch(num, '(RFC822)')
      if rv != 'OK':
          print ("ERROR getting message"), num
          return

      msg = email.message_from_string(data[0][1])
      print ('Message %s: %s' % (num, msg['Subject']))
      print ('Raw Date:', msg['Date'])
      date_tuple = email.utils.parsedate_tz(msg['Date'])
      if date_tuple:
          local_date = datetime.datetime.fromtimestamp(
              email.utils.mktime_tz(date_tuple))
          print ("Local Date:"), \
              local_date.strftime("%a, %d %b %Y %H:%M:%S")



m.select('MAILBOX', readonly=True)

resp, items = m.search(None, "ALL")
items = items[0].split() # getting the mails id



for emailid in items:
  resp, data = m.fetch(emailid, "(RFC822)") 
  raw_email = data[0][1]
  print (raw_email)

Обычно в этот момент я получаю сырое письмо, но на этот раз все, что я получил, было большой строкой символов и никогда не доходило до реального HTML:

Content-Length: 9617 X-Antivirus: Avast (VPS 190503-4, 05/03/2019), входящее сообщение X-Antivirus-Status: Clean PHRhYmxlIHN0eWxlPSJmb250LWZhbWlseTogVGFob21hLCBHZW5ldmEsIHNhbnMtc2Vy aWY7IiB3aWR0aD0iNjMwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEwIj4g PHRib2R5PgogPHRyPgogPHRkPgogPHRhYmxlIHN0eWxlPSJmb250LWZhbWlseTogVGFo b21hLCBHZW5ldmEsIHNhbnMtc2VyaWY7IiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9 IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPiA8dGJvZHk + CiA8dHI + CiA8dGQg d2lkdGg9IjEwMCUiPjxjZW50ZXI + PGEgaHJlZj0iaHR0cHM6Ly9zaG9wLm1lcmNvbGEu Y29tIj48aW1nIHNyYz0iaHR0cHM6Ly9tZWRpYS5tZXJjb2xhLmNvbS9hc3NldHMvaW1h Z2VzL3Nob3Bsb2dvL01lcmNvbGFfTG9nb3YyLnBuZyIgd2lkdGg9IjMxNCIgaGVpZ2h0 PSIzOSIgYm9yZGVyPSIwIiAvPjwvYT48L2NlbnRlcj48L3RkPgogPC90cj4KIDx0cj4K IDx0ZD4KPGhyIHN0eWxlPSJjb2xvcjogI2VjZWNlYzsgd2lkdGg6IDEwMCU7IiAvPjwv DGQ + CiA8L3RyPgogPC90Ym9keT4KIDwvdGFibGU + CiA8L3RkPgogPC90cj4KIDx0cj4K IDx0ZCBzdHlsZT0icGFkZGluZzogMTBweCAzMHB4IDMwcHggMzBweDsiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6IDE1cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBj b2xvcjogIzEy NmFhYTsiPlNoaXBwaW5nIENvbmZpcm1hdGlvbjwvc3Bhbj48YnIgLz48YnIgLz48Yj48 c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyI + RGVhciBQYXRyaWNpYSBTY2hsZXVz bmVyLDwvc3Bhbj48L2I + PGJyIC8 + PGJyIC8 + PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTog MTJwdDsiPlRoYW5rIHlvdSBmb3IgeW91ciByZWNlbnQgb3JkZXIgZnJvbSA8YSBocmVm PSJodHRwczovL3Nob3AubWVyY29sYS5jb20iPk1lcmNvbGE8L2E + LiBXZSBhcmUgcGxl YXNlZCB0byBpbmZvcm0geW91IHRoYXQgeW91IGFyZSBub3cgb25lIHN0ZXAgY2xvc2Vy IHRvIHRha2luZyBjb250cm9sIG9mIHlvdXIgaGVhbHRoISBZb3VyIG9yZGVyIG51bWJl ciBPMTUwOTMxMDkgaGFzIGJlZW4gc2hpcHBlZCBhbmQgaXMgb24gaXRzIHdheSB0byB5 b3UuPGJyIC8 + PGJyIC8 + VGhlIHNoaXBtZW50IGRldGFpbHMgYXJlIGFzIGJlbG93Ojwv c3Bhbj48YnIgLz48YnIgLz4gPHRhYmxlIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZv bnQtZmFtaWx5OiBUYWhvbWEsIEdlbmV2YSwgc2Fucy1zZXJpZjsgdGV4dC1hbGlnbjog bGVmdDsiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9Ijci

1 Ответ

1 голос
/ 04 мая 2019

Поскольку вы можете создать объект сообщения из необработанных данных, вы можете использовать его возможности для извлечения необходимой вам информации.

from email import policy

# Set the policy to create an EmailMessage instance. 
msg = email.message_from_string(data[0][1], policy=policy.default)
# Get the part most likely to be the preferred body.
body = msg.get_body()
# get_content() will automatically decode from base64 or quoted-printable. 
print(body.get_content())

Установка политики на policy.default при создании объекта сообщения обеспечивает возврат экземпляра EmailMessage - этот объект предоставляет методы get_body и get_content.

EmailMessage.get_body () будет

Вернуть часть MIME, которая является лучшим кандидатом в качестве «тела» сообщения.

Вы можете предоставить список подтипов, чтобы управлять его поведением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...