解决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
相关产品推荐
相关产品推荐

