在GAE中将Blobstore数据作为邮件附件发送

4 投票
3 回答
560 浏览
提问于 2025-04-17 16:29

为什么下面的代码不工作呢?我能收到邮件,文件的名字也对(是个 .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

我发现这段代码在开发服务器上不管用,但在正式环境中却能正常运行。

撰写回答