FastAPI使用模板发送邮件遇TypeError问题求助
问题分析与解决方案
错误原因
出现TypeError: 'posixpath' object is not iterable的核心原因是代码存在多处参数传递错误,导致FastMail处理模板或收件人时触发类型异常:
- 收件人参数类型错误:
EmailSchema是自定义Pydantic模型,直接将其放入recipients列表会导致FastMail无法正确解析为邮箱地址,进而触发路径相关异常。 - 模板上下文格式错误:使用模板时,
MessageSchema的body需传递模板渲染所需的上下文字典(而非纯字符串),否则模板引擎无法识别{{body.data}}这类变量。 - 未定义变量引用:
endpoint_send_email中直接使用未定义的email_to变量,造成参数传递混乱。 - 函数返回值缺失:
send_email声明返回JSONResponse但未返回任何内容。
修复后的完整代码
1. 修正配置与邮件发送逻辑
from fastapi import FastAPI from pydantic import BaseModel, EmailStr from fastapi_mail import ConnectionConfig, FastMail, MessageSchema from fastapi.responses import JSONResponse # 假设config是已加载的配置对象 class EmailSchema(BaseModel): email: EmailStr conf = ConnectionConfig( USERNAME=config.mail_username, PASSWORD=config.mail_password, # 修复原代码拼写错误:mail_pasword → mail_password FROM=config.mail_from, PORT=config.mail_port, SERVER=config.mail_server, USE_CREDENTIALS=True, VALIDATE_CERTS=True, TEMPLATE_FOLDER='./templates' # 确保该文件夹存在,且email.html在其中 ) async def send_email(email_to: EmailSchema, body_data: dict) -> JSONResponse: # 构建邮件消息,收件人取EmailSchema的email字段 message = MessageSchema( subject="fastapi", recipients=[email_to.email], body=body_data, # 传递模板上下文字典 subtype="html" ) fm = FastMail(conf) await fm.send_message(message, template_name='email.html') return JSONResponse(status_code=200, content={"message": "邮件发送成功"}) app = FastAPI() @app.get("/email") async def endpoint_send_email(email_to: EmailStr): # 构造模板需要的上下文数据 body_data = { "date": "2024-05-20", # 替换为实际日期 "data": "xyz" } # 将邮箱地址封装为EmailSchema对象 await send_email( email_to=EmailSchema(email=email_to), body_data=body_data ) return JSONResponse(status_code=200, content={"message": "触发邮件发送"})
2. 修正模板文件(./templates/email.html)
确保模板变量与上下文匹配:
<!DOCTYPE html> <html> <head> <title>email</title> </head> <body> <h4>Hi Team</h4> <p>get the data of date {{date}}</p><br /> {{data}} <!-- 原代码{{body.data}}改为{{data}},匹配传入的上下文字段 --> <br /><br /> <h4>thanks,</h4> <h4>Team</h4> </body> </html>
关键修复点说明
- 修正收件人传递:从
EmailSchema中提取email字段作为收件人地址,确保recipients列表中是合法的邮箱字符串。 - 调整模板上下文:将原字符串
data="xyz"改为字典格式,包含模板所需的date和data字段,让模板引擎能正确渲染变量。 - 修复拼写错误:修正原代码中
mail_pasword的拼写错误,避免配置加载失败。 - 补充变量定义:在接口中通过查询参数接收
email_to,并封装为EmailSchema对象传入发送函数。
内容的提问来源于stack exchange,提问作者putta
相关产品推荐
相关产品推荐

