Flask-Mail发送Gmail邮件时mail.send()卡住无响应问题排查
Flask集成flask_mail调用Gmail发信时send方法阻塞无报错问题
问题表现
集成flask_mail实现邮件发送功能时,表单校验、消息对象创建、正文赋值步骤均可正常执行并打印对应日志,执行到mail.send(msg)语句时程序直接挂起,无任何错误抛出,请求无法返回,页面永久处于加载状态。
控制台最终输出如下:
Form received msg created Body created
后续无任何日志输出,请求持续阻塞。
关联代码
路由代码片段(Blueprint)
... from flask_mail import Message from app import mail from os import environ ... @index_bp.route('/contact', methods=['POST']) def contact(): form = ContactForm() if form.validate_on_submit(): print('Form received') msg = Message('Test', recipients=environ.get('TARGET_MAIL')) print('msg created') msg.body = 'Test mail' print('Body created') mail.send(msg) print('Mail sent') return redirect(url_for('.index'))
服务配置
class Config: STATIC_FOLDER = 'static' TEMPLATES_FOLDER = 'templates' SECRET_KEY = environ.get('SECRET_KEY') MAIL_SERVER = 'smtp.google.com' MAIL_PORT = 465 MAIL_USERNAME = environ.get('MAIL_USERNAME') MAIL_PASSWORD = environ.get('MAIL_PASSWORD') MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_DEFAULT_SENDER = environ.get('MAIL_USERNAME')
应用初始化代码
from flask import Flask from flask_mail import Mail mail = Mail() def init_app(): app = Flask(__name__) app.config.from_object('config.Config') mail.init_app(app) with app.app_context(): from .index import routes app.register_blueprint(routes.index_bp) return app
复现验证
编写最小可运行测试用例,剥离业务逻辑单独验证flask_mail对接Gmail的发信能力,相同阻塞问题稳定复现:
from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) app.config['MAIL_SERVER']='smtp.google.com' app.config['MAIL_PORT'] = 465 app.config['MAIL_USERNAME'] = '<new gmail account>@gmail.com' app.config['MAIL_PASSWORD'] = '<app password>' app.config['MAIL_USE_TLS'] = False app.config['MAIL_USE_SSL'] = True mail = Mail(app) @app.route("/") def index(): msg = Message('Hello from the other side!', sender = '<new gmail account>@gmail.com', recipients = ['<my gmail address>@gmail.com']) msg.body = "This is a test email" mail.send(msg) return "Message sent!"
问题根因与修复
配置中Gmail SMTP服务器地址填写错误:
- 错误值:
smtp.google.com - 正确Gmail SMTP服务地址:
smtp.gmail.com
将MAIL_SERVER配置项修正为正确地址后,邮件发送功能恢复正常,阻塞问题消失。
补充说明:使用Gmail SMTP服务发信,需提前开启账号两步验证,使用生成的应用专用密码作为MAIL_PASSWORD配置值,直接使用账号登录密码会触发鉴权失败。
内容的提问来源于stack exchange,提问作者Fernando Velasco Borea
相关产品推荐
相关产品推荐

