如何用FlaskMailMessage发送Base64编码图片附件?
正确实现Flask-Mail发送Base64图片作为附件的方式
你遇到的问题本质是Flask-Mail的Message.attachments需要的是FileStorage类型对象,直接传BytesIO会因为缺少FileStorage特有的data属性报错。下面是完整的正确实现步骤:
核心思路
- 把Base64编码的字符串解码成二进制图片数据
- 用
werkzeug.datastructures.FileStorage包装二进制数据(这是Flask-Mail附件要求的类型) - 将包装好的对象添加到邮件的附件列表中
完整代码示例
from flask import Flask from flask_mail import Mail, Message import base64 from io import BytesIO from werkzeug.datastructures import FileStorage app = Flask(__name__) # 配置Flask-Mail参数,根据你的实际邮箱服务填写 app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = 'your_email@example.com' app.config['MAIL_PASSWORD'] = 'your_email_password' mail = Mail(app) def send_base64_image_email(): # 示例Base64编码的图片字符串(实际中替换为你的Base64数据) base64_image_str = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==" # 1. 处理Base64数据:去掉前缀,解码二进制 if 'base64,' in base64_image_str: base64_data = base64_image_str.split('base64,')[1] else: base64_data = base64_image_str image_bytes = base64.b64decode(base64_data) # 2. 用BytesIO存储二进制数据,并用FileStorage包装 img_io = BytesIO(image_bytes) img_io.seek(0) # 重置文件指针到开头 # 创建FileStorage对象,指定文件名、MIME类型 file_storage = FileStorage( stream=img_io, filename='attachment_image.png', content_type='image/png' ) # 3. 创建邮件并添加附件 msg = Message( subject='带Base64图片附件的邮件', sender='your_email@example.com', recipients=['recipient@example.com'] ) msg.body = '这是一封包含Base64图片附件的测试邮件' # 将FileStorage对象添加到附件列表 msg.attachments.append(file_storage) # 发送邮件 with app.app_context(): mail.send(msg) if __name__ == '__main__': send_base64_image_email()
关键说明
FileStorage是Werkzeug提供的类,专门用于处理文件上传/存储,Flask-Mail的附件系统依赖它的接口(比如data属性、filename属性等)- 处理Base64时要注意是否带有
data:image/png;base64,这类前缀,需要先剥离再解码 - 创建
FileStorage时要指定正确的content_type(比如图片是image/png、image/jpeg等),否则收件方可能无法正确识别附件类型
内容的提问来源于stack exchange,提问作者AChichi
相关产品推荐
相关产品推荐

