Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2013 06:23:42

ikos2123
Зарегистрирован: 2013-03-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль email и кодировки

Доброе утро. Нужно из сохраненных писем вытаскивать аттачи, примеров масса, и решение для разных кодировок тоже есть:

def extract(msg,savedir,marker=''):
  if marker:
    marker=marker+'-'
  fp = open(msg)
  msg = email.message_from_file(fp)
  fp.close()
  for part in msg.walk():
    if part.get_content_maintype() == 'multipart': continue
    if part.get('Content-Disposition') is None: continue
    filename = part.get_filename()
    if not(filename): continue
    print '   '+filename
    print part.get_content_charset()
    filename,enc=decode_header(filename)[0]
    if enc:
      filename=filename.decode(enc)
    filename=marker+filename
    fp = open(os.path.join(savedir, filename), 'wb')
    fp.write(part.get_payload(decode=1))
    fp.close
все работает отлично, до тех пор пока не попадется письмо в UTF-8, модуль email автоматом его обрабатывает и тогда в "filename,enc=decode_header(filename)" вылетает ошибка, потому что там не =?UTF8?B…. а уже нормальное имя файла.
Собственно вопрос можно как-то определить что имя уже преобразовано или кодировку вложения? part.get_charset() - ничего не возвращает. Нужно направление куда рыть.
Строчка # -*- coding: utf-8 -*- вверху есть, но по идее она не должна влиять…

ЗЫ. С питоном всего полторы недели, и до изучения классов еще не дошел, так что в исходники читаются пока тяжко.

Офлайн

#2 Март 18, 2013 08:25:45

ikos2123
Зарегистрирован: 2013-03-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

модуль email и кодировки

Если кому интересно, вышел из положения обернув в try “опасную” часть. Получается что когда кодировка UTF-8 имя вложение уже готовое к использованию:

def extract(msg,savedir,marker=''):
  if marker:
    marker=marker+'-'
  fp = open(msg)
  msg = email.message_from_file(fp)
  fp.close()
  for part in msg.walk():
    if part.get_content_maintype() == 'multipart': continue
    if part.get('Content-Disposition') is None: continue
    filename = part.get_filename()
    if not(filename): continue
    try:
      filename,enc=decode_header(filename)[0]
      if enc:
        filename=filename.decode(enc)
    except:
      print "Error filename:%s"%filename
    filename=marker+filename
    fp = open(os.path.join(savedir, filename), 'wb')
    fp.write(part.get_payload(decode=1))
    fp.close
Но подозреваю, что это костыль, а хотелось бы “правильное” решение…

Отредактировано ikos2123 (Март 18, 2013 08:27:09)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version