You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:20:24