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

使用FastAPI-mail发送邮件时内容重复显示的问题求助

使用FastAPI-Mail发送邮件时内容重复显示的问题

我用FastAPI-Mail发送邮件,发送成功了,但在Gmail和Outlook里打开时,邮件内容会显示两次。检查代码没发现重复添加内容的操作,而且顶部的内容会显示HTML标签,下方的内容则正常(见截图)。

邮件内容重复显示截图

相关代码(main.py)

from fastapi import FastAPI
from fastapi_mail import FastMail, MessageSchema, ConnectionConfig
from starlette.requests import Request
from starlette.responses import JSONResponse
from pydantic import EmailStr, BaseModel
from typing import List
app = FastAPI()


class EmailSchema(BaseModel):
   email: List[EmailStr]


conf = ConnectionConfig(
   MAIL_USERNAME='myGmailAddress',
   MAIL_PASSWORD="myPassword",
   MAIL_FROM='myGmailAddress',
   MAIL_PORT=587,
   MAIL_SERVER="smtp.gmail.com",
   MAIL_TLS=True,
   MAIL_SSL=False
)


@app.post("/send_mail")
async def send_mail(email: EmailSchema):

    template = """
        <html>
        <body>
        

<p>Hi !!!
        <br>Thanks for using <b>fastapi mail</b>!!!</p>


        </body>
        </html>
        """

    message = MessageSchema(
        subject="Fastapi-Mail module",
        recipients=email.dict().get("email"), # List of recipients, as many as you can pass
        body=template,
        subtype="html"
        )

    template = """
<p>Hi !!!
<br>Thanks for using <b>fastapi mail</b>!!!
</p>"""

    '''
    template = """
<p>Hi !!!
<br>Thanks for using <b>fastapi mail</b>!!!
</p>"""
    '''

    fm = FastMail(conf)
    await fm.send_message(message)

    return JSONResponse(status_code=200, content={"message": "email has been sent"})

问题原因及解决办法

核心原因

  1. HTML标签被转义:你代码里用了&lt;和&gt;代替真实的<和>,邮件客户端会把这些转义字符当作普通文本显示,导致顶部出现标签内容。
  2. 邮件格式处理逻辑:当只设置HTML内容但未提供对应的纯文本版本时,部分客户端会自动将HTML解析为纯文本并额外显示,造成内容重复。

修复方案

方案1:正确发送HTML内容

把模板里的转义字符还原为真实HTML标签,确保客户端能正确渲染:

@app.post("/send_mail")
async def send_mail(email: EmailSchema):
    # 还原HTML标签,去掉转义字符
    html_template = """
<html>
<body>
<p>Hi !!!
<br>Thanks for using <b>fastapi mail</b>!!!</p>
</body>
</html>
"""

    message = MessageSchema(
        subject="Fastapi-Mail module",
        recipients=email.dict().get("email"),
        body=html_template,
        subtype="html"
    )

    fm = FastMail(conf)
    await fm.send_message(message)

    return JSONResponse(status_code=200, content={"message": "email has been sent"})

方案2:同时提供纯文本和HTML版本(推荐)

给邮件同时设置纯文本和HTML内容,避免客户端自动解析造成重复:

@app.post("/send_mail")
async def send_mail(email: EmailSchema):
    # 纯文本内容,兼容不支持HTML的客户端
    plain_text_content = """
Hi !!!
Thanks for using fastapi mail!!!
"""
    # 正常HTML内容
    html_template = """
<html>
<body>
<p>Hi !!!
<br>Thanks for using <b>fastapi mail</b>!!!</p>
</body>
</html>
"""

    message = MessageSchema(
        subject="Fastapi-Mail module",
        recipients=email.dict().get("email"),
        body=plain_text_content,  # 纯文本版本
        html=html_template,       # HTML版本
        subtype="alternative"     # 指定同时支持两种格式
    )

    fm = FastMail(conf)
    await fm.send_message(message)

    return JSONResponse(status_code=200, content={"message": "email has been sent"})

内容的提问来源于stack exchange,提问作者DAgu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:45:34