Python Flask下使用Gmail API发送表单上传文件为邮件附件求助
问题解决说明
报错根因
os.path.realpath(request.files['attfile'])用法错误:request.files['attfile']拿到的是Flask封装的FileStorage文件对象,不是本地文件的路径字符串,不能直接传入路径处理函数执行解析。
你不需要额外获取本地路径,可直接读取该文件对象的内容作为邮件附件,无需提前存储到本地。
修正后可运行代码
if request.method == "POST": # 先获取上传的文件对象 upload_file = request.files['attfile'] emailMsg = request.form['body'] mimeMessage= MIMEMultipart() mimeMessage['to']=request.form['email'] mimeMessage['subject']=request.form['subject'] mimeMessage.attach(MIMEText(emailMsg,'plain')) # 直接处理上传文件,不需要读取本地路径 file_name = upload_file.filename content_type, encoding= mimetypes.guess_type(file_name) main_type,sub_type = content_type.split('/',1) # 直接读取文件对象内容,无需open本地文件 myFile = MIMEBase(main_type, sub_type) myFile.set_payload(upload_file.read()) myFile.add_header('Content-Disposition', 'attachment', filename=file_name) encoders.encode_base64(myFile) mimeMessage.attach(myFile) raw_string = base64.urlsafe_b64encode(mimeMessage.as_bytes()).decode() message = service.users().messages().send( userId='me', body = {'raw':raw_string}).execute() return render_template('email.html')
配套配置要求
- 前端提交文件的表单必须添加
enctype="multipart/form-data"属性,否则后端无法获取上传文件,示例表单代码:
<form method="post" enctype="multipart/form-data"> <input type="file" name="attfile" required> <input type="email" name="email" required> <input type="text" name="subject" required> <textarea name="body" required></textarea> <button type="submit">发送邮件</button> </form>
- 如果需要支持多附件上传,给文件输入框添加
multiple属性,后端用request.files.getlist('attfile')遍历所有上传文件即可。 - 若有业务要求必须先存储文件到本地再发送,添加以下保存逻辑即可拿到本地路径:
# 提前在项目根目录创建upload文件夹用于存储上传文件 import os save_dir = 'upload' os.makedirs(save_dir, exist_ok=True) local_file_path = os.path.join(save_dir, upload_file.filename) upload_file.save(local_file_path) # 后续可直接用local_file_path作为本地路径读取文件
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

