Flask-Mail身份验证错误抛出异常的捕获处理方案咨询
解决方案
问题根源
你现有代码的逻辑错误在于:mail.connect()方法在连接失败(比如账号密码错误、服务器无法连通)时会直接抛出SMTP相关异常,不会返回None,因此你写的判断分支永远无法触发,异常会直接向上抛出打断程序运行。同时你代码中存在重复初始化Mail实例的冗余代码,可以删除。
优化后代码
from flask import Flask, request from flask_mail import Mail, Message import smtplib # 引入smtplib用于捕获对应异常 import os, sys app = Flask(__name__) # 先配置参数再初始化Mail实例,删除重复初始化的冗余代码 app.config['MAIL_SERVER']='smtp.gmail.com' app.config['MAIL_PORT'] = 465 app.config['MAIL_DEBUG'] = True app.config['MAIL_USERNAME'] = 'xyz@gmail.com' app.config['MAIL_PASSWORD'] = 'njhkjkjj' app.config['MAIL_USE_TLS'] = False app.config['MAIL_USE_SSL'] = True mail = Mail(app) @app.route('/email') def get_email(): try: # 把连接、发送邮件的逻辑全部放入try块中 conn = mail.connect() msg = Message('visitor blocked', sender = 'abc@gmail.com', recipients = ['xyz@gmail.com']) msg.body = "Hello, this is email test." mail.send(msg) print("Email setup is ready. Email is sent..") return "邮件发送成功" except smtplib.SMTPAuthenticationError: # 捕获认证错误,对应你测试的密码错误场景 print("Email setup/password is incorrect. Input your email creadentials in python app..") return "邮件账号或密码错误" except smtplib.SMTPConnectError: # 捕获服务器连接错误 print("无法连接到邮件服务器,请检查服务器地址和端口配置") return "邮件服务器连接失败" except Exception as e: # 兜底捕获其他所有未知错误 print(f"邮件发送出现未知错误:{str(e)}") return f"邮件发送失败:{str(e)}"
改动说明
- 新增
smtplib模块引入,用于精准捕获SMTP相关的各类异常 - 调整了Mail实例初始化的顺序,先配置参数再初始化,删除了重复初始化的冗余代码
- 用
try-except结构包裹所有邮件相关操作逻辑,针对不同错误场景返回不同提示,覆盖认证错误、连接错误以及其他未知异常 - 给接口新增了返回值,方便调用方直接看到错误提示,你也可以根据自己的需求调整输出逻辑
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

