使用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"})
问题原因及解决办法
核心原因
- HTML标签被转义:你代码里用了
<和>代替真实的<和>,邮件客户端会把这些转义字符当作普通文本显示,导致顶部出现标签内容。 - 邮件格式处理逻辑:当只设置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
相关产品推荐
相关产品推荐

