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

解决Flask应用发送SMTP邮件时的“发件人域名不被允许”错误

问题分析与解决方案

核心问题:邮件头格式非法

单独运行smtplib代码能正常发件,但嵌入Flask后触发550 Sender domain not allowed错误,根源是Flask函数内手动拼接的邮件头存在前导缩进,违反了SMTP协议的格式规范。

对比两段代码:

  • 独立运行的代码中,message的From/To/Subject等字段均顶格书写;
  • Flask函数里的message因缩进排版,导致关键邮件头字段前带有空格,SMTP服务器解析时会判定格式无效,进而触发域名验证失败的拦截。

修复步骤

1. 修正邮件头缩进

将Flask代码中的message内容改为顶格,移除前导空格:

message = """From: Ray Drost <ray@raydrost.com>
To: Raymon Drost <raydrost15@gmail.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

2. 推荐用标准邮件库构建邮件

手动拼接字符串极易引发格式问题,建议使用Python内置email模块生成合规邮件:

from email.mime.text import MIMEText
from email.header import Header

# 构建标准格式邮件
msg = MIMEText('This is a test e-mail message.', 'plain', 'utf-8')
msg['From'] = Header('Ray Drost <ray@raydrost.com>', 'utf-8')
msg['To'] = Header('Raymon Drost <raydrost15@gmail.com>', 'utf-8')
msg['Subject'] = Header('SMTP e-mail test', 'utf-8')

# 发送时传入msg.as_string()替代手动拼接的内容
smtpObj.sendmail(sender, receivers, msg.as_string())

3. 完善SMTP连接管理

发送完成后添加smtpObj.quit()关闭连接,避免资源泄漏:

smtpObj.sendmail(sender, receivers, msg.as_string())
print("Successfully sent email")
smtpObj.quit()

4. Brevo服务额外检查

换用Brevo后邮件未送达,除确保格式正确外,还需:

  • 在Brevo后台验证发件人域名/邮箱;
  • 确认SMTP配置(推荐用587端口+STARTTLS模式);
  • 查看Brevo邮件日志,排查是否被拦截或标记为垃圾邮件。

完整修复后的Flask代码示例

from flask import Flask, request, jsonify
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.header import Header

api = Flask(__name__)

@api.route('/hourlogging', methods=['POST'])
def hourlogging():
    data = request.json
    try:
        testString = data["test"]
    except:
        print("Error getting data from json")

    sender = "ray@raydrost.com"
    receivers = ["raydrost15@gmail.com"]

    # 用email模块构建合规邮件
    msg = MIMEText('This is a test e-mail message.', 'plain', 'utf-8')
    msg['From'] = Header('Ray Drost <ray@raydrost.com>', 'utf-8')
    msg['To'] = Header('Raymon Drost <raydrost15@gmail.com>', 'utf-8')
    msg['Subject'] = Header('SMTP e-mail test', 'utf-8')

    smtpObj = SMTP_SSL(host="smtp.dreamhost.com", port=465)
    smtpObj.login("ray@raydrost.com", "your_password_here")
    smtpObj.sendmail(sender, receivers, msg.as_string())
    print("Successfully sent email")
    smtpObj.quit()

    responseData = {"response": "Email Sent!"}
    return jsonify(responseData)

if __name__ == '__main__':
    api.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:56:04