ISO-кодированные имена вложений и python - PullRequest
1 голос
/ 22 января 2009

Прежде всего, у меня нет примера кода на этом компьютере, но у меня есть пример, который очень похож.

(http://docs.python.org/library/email-examples.html)

4-й.

Моя проблема заключается в этом куске кода

counter = 1
for part in msg.walk():
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()
    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())
        if not ext:
            # Use a generic bag-of-bits extension
            ext = '.bin'
        filename = 'part-%03d%s' % (counter, ext)
    counter += 1
    fp = open(os.path.join(opts.directory, filename), 'wb')
    fp.write(part.get_payload(decode=True))
    fp.close()

Когда я получаю электронные письма, которые не имеют имен файлов в кодировке iso или utf, этот код работает нормально. Но когда имя вложения закодировано в iso, имя файла находится не внутри get_filename, а имя файла находится в закодированной форме внутри part ["Content-type"] (я верю)

Приведенный выше пример пытается угадать расширение и, если он не может найти имя файла, он просто дает ему имя файла части. Что бы я хотел, это имя файла.

Кто-нибудь имел дело с такими проблемами, и что вы делали, чтобы исправить это?

1 Ответ

0 голосов
/ 26 января 2009

Я нашел проблему, это было с

mimetypes.guess_extension(part.get_content_type())

И изображения с "image / pjpeg" в качестве типа контента

@S.Lott Я изменил код, чтобы он напоминал приведенный выше пример, но я добавил это, чтобы исправить проблему с pjpeg.

if not filename:
    ext = mimetypes.guess_extension(part.get_content_type())

if not ext:
    guess = part["Content-Type"].split(";")

    if guess[0] == "image/pjpeg":
        guess[0] = "image/jpeg"

    ext = mimetypes.guess_extension(guess[0])

if not ext:
    ext = ".bin"
...