从blobstore发送数据作为GAE中的电子邮件附件

时间:2013-02-20 11:48:32

标签: python google-app-engine blobstore

为什么下面的代码不起作用?收到电子邮件,文件通过正确的文件名(它是一个.png文件)。但是当我尝试打开文件时,它无法正确打开(Win​​dows图库报告它can't open this photo or videothe file may be unsupported, damaged or corrupted)。

当我使用blobstore_handlers.BlobstoreDownloadHandler的子类(基本上是GAE文档中的确切处理程序)和相同的blob键下载文件时,一切正常,Windows会读取图像。

还有一点信息 - 来自下载和电子邮件的二进制文件看起来非常相似,但长度略有不同。

任何人都对如何从GAE blobstore发送电子邮件附件有任何想法?关于S / O也存在类似的问题,表明其他人已经遇到过这个问题,但似乎没有任何结论。

from google.appengine.api import mail
from google.appengine.ext import blobstore

def send_forum_post_notification():
blob_reader = blobstore.BlobReader('my_blobstore_key')
blob_info = blobstore.BlobInfo.get('my_blobstore_key')
value = blob_reader.read()
mail.send_mail(
    sender='my.email@address.com',
    to='my.email@address.com',
    subject='this is the subject',
    body='hi',
    reply_to='my.email@address.com',
    attachments=[(blob_info.filename, value)]
)

send_forum_post_notification()

3 个答案:

答案 0 :(得分:1)

我不明白为什么你使用元组作为附件。我用:

message = mail.EmailMessage(sender = ......
message.attachments = [blob_info.filename,blob_reader.read()]

答案 1 :(得分:1)

我发现此代码在dev_appserver上不起作用,但在推送到生产时确实有效。

答案 2 :(得分:1)

我在Python Google App Engine应用程序上使用blobstore遇到了类似的问题。我的应用程序处理PDF文件而不是图像,但我也看到了#34;该文件可能不受支持,损坏或损坏"使用与上面显示的代码类似的代码时出错。

尝试以这种方式解决问题:在读取二进制流之前,在BlobInfo对象上调用open()。替换此行:

value = blob_reader.read()

......有这两行:

bstream = blob_info.open()
value = bstream.read()

然后你也可以删除这一行:

blob_reader = blobstore.BlobReader('my_blobstore_key')

...因为上面的bstream将是BlobReader类型。

Google提供的相关文档位于: https://cloud.google.com/appengine/docs/python/blobstore/blobinfoclass#BlobInfo_filename