分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

记踩坑--Flask Web开发:第六章的电子邮件 ----[Errno 11004] getaddrinfo failed

发布时间:2023-09-06 02:27责任编辑:胡小海关键词:Web邮件

必须要记录下踩过的坑,一来,为后来者铺路,二来,实在摔得疼,提醒自己写代码要谨小慎微。

[Errno 11004] getaddrinfo failed

1.先排除邮箱账号和授权码的错误

测试如下代码:(注:邮箱号和授权码换成你自己的)

# -*- coding: utf-8 -*-from flask import Flaskfrom flask_mail import Mail, Messageapp = Flask(__name__)app.config[‘MAIL_SERVER‘] = ‘smtp.qq.com‘ ?# 邮件服务器地址app.config[‘MAIL_PORT‘] = 25 ?# 邮件服务器端口app.config[‘MAIL_USE_TLS‘] = True ?# 启用 TLSapp.config[‘MAIL_USERNAME‘] = ‘987654321@qq.com‘ ?app.config[‘MAIL_PASSWORD‘] = ‘nxvxvzbbbbbbbcec‘mail = Mail(app)@app.route(‘/‘)def index(): ???msg = Message(‘恭喜!排除授权码和账号的问题!‘, sender=‘987654321@qq.com‘, recipients=[‘987654321@qq.com‘]) ???msg.html = ‘<b>Hello Web</b>‘ ???mail.send(msg) ???return ‘<h1>OK!</h1>‘if __name__ == ‘__main__‘: ???app.run(host=‘127.0.0.1‘, debug=True)

 

2.再排查环境变量是否设置正确

打开你当前文件的虚拟环境,设置如下代码

(venv) $ set MAIL_USERNAME = my_email@qq.com(venv) $ set MAIL_PASSWORD = password

 注意::环境变量配置中不加引号!!不加引号!!不加引号!!

程序中看是否成功get到

print(os.environ.get(‘MAIL_USERNAME‘))print(os.environ.get(‘MAIL_PASSWORD‘))

能get到后,就可以在程序中获取环境变量的配置啦!

app.config[‘MAIL_USERNAME‘] = os.environ.get(‘MAIL_USERNAME‘) app.config[‘MAIL_PASSWORD‘] = os.environ.get(‘MAIL_PASSWORD‘) 

3.在程序中集成发送电子邮件功能

import osfrom flask import Flask, render_template, session, url_for, redirectfrom flask_bootstrap import Bootstrapfrom flask_wtf import FlaskFormfrom wtforms import StringField, SubmitFieldfrom wtforms.validators import DataRequiredfrom flask_sqlalchemy import SQLAlchemyfrom flask_script import Managerfrom flask_script import Shellfrom flask_migrate import Migrate, MigrateCommandfrom flask_mail import Mail, Messagebasedir = os.path.abspath(os.path.dirname(__file__))app = Flask(__name__)app.config[‘SECRET_KEY‘] = ‘hard to guess string‘app.config[‘SQLALCHEMY_DATABASE_URI‘] = ????‘sqlite:///‘ + os.path.join(basedir, ‘data.sqlite‘)app.config[‘SQLALCHEMY_COMMMIT_ON_TEARDOWN‘] = Trueapp.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = Trueapp.config[‘MAIL_SERVER‘] = ‘smtp.qq.com‘app.config[‘MAIL_PORT‘] = 25app.config[‘MAIL_USE_TLS‘] = Trueapp.config[‘MAIL_USERNAME‘] = os.environ.get(‘MAIL_USERNAME‘)print(os.environ.get(‘MAIL_USERNAME‘))app.config[‘MAIL_PASSWORD‘] = os.environ.get(‘MAIL_PASSWORD‘)print(os.environ.get(‘MAIL_PASSWORD‘))app.config[‘FLASKY_MAIL_SUBJECT_PREFIX‘] = ‘[Flasky]‘app.config[‘FLASKY_MAIL_SENDER‘] = ‘123456789@qq.com‘ ?# 发送者邮箱app.config[‘FLASKY_ADMIN‘] = os.environ.get(‘FLASKY_ADMIN‘) ?# 接收者邮箱print(os.environ.get(‘FLASKY_ADMIN‘))bootstrap = Bootstrap(app)db = SQLAlchemy(app)manager = Manager(app)migrate = Migrate(app, db)mail = Mail(app)class NameForm(FlaskForm): ???name = StringField(‘What is your name?‘, validators=[DataRequired()]) ???submit = SubmitField(‘Submit‘)class Role(db.Model): ???__tablename__ = ‘roles‘ ???id = db.Column(db.Integer, primary_key=True) ???name = db.Column(db.String(64), unique=True) ???users = db.relationship(‘User‘, backref=‘role‘, lazy=‘dynamic‘) ???def __repr__(self): ???????return ‘<Role: %s>‘ % self.nameclass User(db.Model): ???__tablename__ = ‘users‘ ???id = db.Column(db.Integer, primary_key=True) ???username = db.Column(db.String(64), unique=True, index=True) ???role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘)) ???def __repr__(self): ???????return ‘<User: %s>‘ % self.usernamedef send_email(to, subject, template, **kwargs): ???msg = Message(app.config[‘FLASKY_MAIL_SUBJECT_PREFIX‘] + ‘ ‘ + subject, ?????????????????sender=app.config[‘FLASKY_MAIL_SENDER‘], recipients=[to]) ???msg.body = render_template(template + ‘.txt‘, **kwargs) ???msg.html = render_template(template + ‘.html‘, **kwargs) ???mail.send(msg)def make_shell_context(): ???return dict(app=app, db=db, User=User, Role=Role)manager.add_command(‘shell‘, Shell(make_context=make_shell_context)) ?# 集成python shellmanager.add_command(‘db‘, MigrateCommand) ?# 创建数据库迁移@app.route(‘/‘, methods=[‘GET‘, ‘POST‘])def index(): ???form = NameForm() ???if form.validate_on_submit(): ???????user = User.query.filter_by(username=form.name.data).first() ???????if user is None: ???????????new_user = User(username=form.name.data) ???????????db.session.add(new_user) ???????????db.session.commit() ???????????session[‘known‘] = False ?# 新用户(数据库中没查到你) ???????????if app.config[‘FLASKY_ADMIN‘]: ???????????????send_email(app.config[‘FLASKY_ADMIN‘], ‘New User‘, ??????????????????????????‘mail/new_user‘, user=new_user) ???????else: ???????????session[‘known‘] = True ?# 老用户 ???????session[‘name‘] = form.name.data ???????form.name.data = ‘‘ ???????return redirect(url_for(‘index‘)) ???return render_template(‘index.html‘, form=form, name=session.get(‘name‘), ??????????????????????????known=session.get(‘known‘, False))@app.route(‘/user/<name>‘)def user(name): ???return render_template(‘user.html‘, name=name)@app.errorhandler(404)def page_not_found(e): ???return render_template(‘404.html‘), 404@app.errorhandler(500)def internal_server_error(e): ???return render_template(‘500.html‘), 500if __name__ == ‘__main__‘: ???# manager.run() ???app.run(host=‘127.0.0.1‘, port=5200, debug=True)

4. 创建模板

 new_user.html:

User {{ user.username }} has joined.

new_user.txt:

User <b>{{ user.username }}</b> has joined.

  

 5. 跑起来

(env) C:\Users\Administrator\PycharmProjects\lagou\jokertion_blog>python hello.py shell

注意:记得先在虚拟环境(venv)中设置好三个环境变量:

set MAIL_USERNAME=123456789@qq.comset MAIL_PASSWORD=xxxxxxxxxxxxxxset FLASKY_ADMIN=123456789@qq.com

  

 6.大功告成!新增功能:新添用户,自动发送邮件提醒管理员。

记踩坑--Flask Web开发:第六章的电子邮件 ----[Errno 11004] getaddrinfo failed

原文地址:https://www.cnblogs.com/liangmingshen/p/10162153.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved