Нужна помощь с обработкой вложений с помощью GAE InboundMailHandler - PullRequest
3 голосов
/ 05 августа 2011

Я правильно реализовал InboundMailHandler и могу обрабатывать все остальные поля mail_message, кроме mail_message.attachments.Имя файла вложения читается правильно, но содержимое не сохраняется в правильном mime_type

        if not hasattr(mail_message, 'attachments'):
            raise ProcessingFailedError('Email had no attached documents')

        else:
            logging.info("Email has %i attachment(s) " % len(mail_message.attachments))

        for attach in mail_message.attachments:
            filename = attach[0]
            contents = attach[1]


        # Create the file
        file_name = files.blobstore.create(mime_type = "application/pdf")

        # Open the file and write to it
        with files.open(file_name, 'a') as f:
            f.write(contents)

        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)

        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)
        return blob_key

        blob_info = blobstore.BlobInfo.get(blob_key)

`

Когда я пытаюсь отобразить импортированный файл PDF, перейдя по ссылке: '/serve /% s '% blob_info.key () Я получаю страницу с чем-то вроде закодированных данных вместо реального файла PDF.

Похоже на это:

From nobody Thu Aug 4 23:45:06 2011 content-transfer-encoding: base64 JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G bGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtXVuXHLdxfu9fgSef2RxxOX2by6NMbSLalOyQK+ucyHpQ eDE3IkWKF0vJj81vyVf3Qu9Mdy+Z40TswqKAalThqwJQjfm1/Hv5tWzxv13blf2xK++el+/LL+X+ g/dtefq

Есть идеи?Спасибо

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Вложения электронной почты EncodedPayload объекты; чтобы получить данные, вы должны вызвать метод decode().

Попробуйте с:

# Open the file and write to it
with files.open(file_name, 'a') as f:
    f.write(contents.decode())
1 голос
/ 16 августа 2011

Если вы хотите, чтобы вложения размером более 1 МБ обрабатывались успешно, декодируйте и преобразуйте в str:

#decode and convert to string
datastr = str(contents.decode())
with files.open(file_name, 'a') as f:
  f.write(datastr[0:65536])
  datastr=datastr[65536:]
  while len(datastr) > 0:
    f.write(datastr[0:65536])
    datastr=datastr[65536:]
0 голосов
/ 05 августа 2011

Нашел ответ в этом замечательном посте: http://john -smith.appspot.com / app-engine - что-то-docs-dont-рассказать-вам-о-обработке-входящей-почте

Это способ декодирования вложения электронной почты для входящей почты GAE:

        for attach in mail_message.attachments:
            filename, encoded_data = attach
            data = encoded_data.payload
            if encoded_data.encoding:
                data = data.decode(encoded_data.encoding)
...