在GAE中将Blobstore数据作为邮件附件发送
为什么下面的代码不工作呢?我能收到邮件,文件的名字也对(是个 .png 文件)。但是当我尝试打开这个文件时,它打不开(Windows 图片库提示说 无法打开这个照片或视频
,并且 文件可能不被支持,损坏或已损坏
)。
当我使用 blobstore_handlers.BlobstoreDownloadHandler
的一个子类下载文件(基本上就是 GAE 文档里的那个处理器),并且用同样的 blob 键,一切都正常,Windows 能够读取这个图片。
还有一点信息 - 从下载和邮件中得到的二进制文件看起来非常相似,但长度稍微有点不同。
有没有人知道我该如何从 GAE blobstore 发送邮件附件?在 Stack Overflow 上有类似的问题,说明其他人也遇到过这个问题,但似乎没有找到解决办法。
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 个回答
1
我在使用Python的Google App Engine应用程序时也遇到了类似的问题,主要是处理PDF文件,而不是图片。不过我也碰到了“文件可能不被支持、损坏或已损坏”的错误,使用的代码和你上面展示的类似。
你可以试试这样解决问题:在读取二进制流之前,先对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
1
我不太明白你为什么要用元组来处理附件。我用的是:
message = mail.EmailMessage(sender = ......
message.attachments = [blob_info.filename,blob_reader.read()]
1
我发现这段代码在开发服务器上不管用,但在正式环境中却能正常运行。