Найти - Пользователи
Полная версия: модуль email и кодировки
Начало » Python для новичков » модуль email и кодировки
1
ikos2123
Доброе утро. Нужно из сохраненных писем вытаскивать аттачи, примеров масса, и решение для разных кодировок тоже есть:
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 -*- вверху есть, но по идее она не должна влиять…

ЗЫ. С питоном всего полторы недели, и до изучения классов еще не дошел, так что в исходники читаются пока тяжко.
ikos2123
Если кому интересно, вышел из положения обернув в 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
Но подозреваю, что это костыль, а хотелось бы “правильное” решение…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB