Windows下flask发送邮件完美解决in create

xiaoxiao2021-02-28  74

在实现flask-mail发送邮件的时候遇到以下错误: Traceback (most recent call last): File "C:\Python27\Lib\threading.py", line 801, in __bootstrap_inner self.run() File "C:\Python27\Lib\threading.py", line 754, in run self.__target(*self.__args, **self.__kwargs) File "E:/Python编程/Flask基础/Flask__最基本的应用/22__使用Flask-Mail提供电子邮件支持.py", line 68, in asyncSendMail m.send(msg) File "F:\myvenv\lib\site-packages\flask_mail-0.9.1-py2.7.egg\flask_mail.py", line 491, in send with self.connect() as connection: File "F:\myvenv\lib\site-packages\flask_mail-0.9.1-py2.7.egg\flask_mail.py", line 144, in __enter__ self.host = self.configure_host() File "F:\myvenv\lib\site-packages\flask_mail-0.9.1-py2.7.egg\flask_mail.py", line 158, in configure_host host = smtplib.SMTP(self.mail.server, self.mail.port) File "C:\Python27\Lib\smtplib.py", line 256, in __init__ (code, msg) = self.connect(host, port) File "C:\Python27\Lib\smtplib.py", line 316, in connect self.sock = self._get_socket(host, port, self.timeout) File "C:\Python27\Lib\smtplib.py", line 291, in _get_socket return socket.create_connection((host, port), timeout) File "C:\Python27\Lib\socket.py", line 575, in create_connection raise err error: [Errno 10061]

我的错误原因在于: m = Mail(app)进行绑定的时候,这行代码放在了app.config()配置的下面,让我找了好久。对于这种出错方式完全是逻辑上的错误,希望大家不要像我这样。 对此我也在网上搜寻答案,然而并没有得到解决。 下面贴上错误代码,

错误代码:

#coding:utf-8 from flask import Flask,render_template,session,redirect,url_for from flask_moment import Moment from flask_bootstrap import Bootstrap from flask_wtf import FlaskForm from wtforms import StringField,SubmitField from wtforms.validators import DataRequired,length from flask_mail import Mail,Message#导入flask包装的邮箱框架 from threading import Thread#导入线程类 from flask_sqlalchemy import SQLAlchemy #导入SQLAlchemy用于产生数据库对象db import os app =Flask(__name__) m =Mail(app) moment =Moment(app) bootstrap =Bootstrap(app) app.config["SECRET_KEY"]="hard this key" app.config['MAIL_SERVER'] = 'smtp.163.com' app.config['MAIL_PORT'] = 25 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = "xxx@163.com" app.config['MAIL_PASSWORD'] = "xxx" base_path =os.path.abspath(os.path.dirname("f:")) app.config['SQLALCHEMY_DATABASE_URI'] ="sqlite:///"+os.path.join(base_path,"data.sqlite") #配置路径 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True #执行结束自动提交数据库的变动 app.config['SQLALCHEMY_TRACK_ODIFICATIONS']=True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True #解决警告问题 db = SQLAlchemy(app) #创建一个SQLAlchemy实例 print 'sqlite:///'+os.path.join(base_path,'data.sqlite') 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') # 定义一个关系,注意第一个参数是类名,第二个参数是反向引用 def __repr__(self): return '<Role %r>' % self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(64),unique=True,index=True) password = db.Column(db.String(64)) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) # 外键的参数不是类名,而是表名 def __repr__(self): return '<User %r>' % self.username db.drop_all() db.create_all() class NameForm(FlaskForm): name =StringField("input your name",validators=[DataRequired(),length(1,20)]) submit=SubmitField("submit") def asyncSendMail(app,msg): # 使用app.app_context()人工创建程序上下文 with app.app_context(): # 使用Mail发送消息 m.send(msg) def sendMail(to,subject,template,**kwargs): ''' 发送邮件 :param to: 收信人地址 :param subject: 主题 :param template: 邮件内容的模板 :param kwargs: 邮件内容的模板的参数 :return: ''' msg = Message( subject=subject, sender="xxx@163.com", recipients=[to] ) # 下面两个都是邮件正文 msg.body = render_template(template + '.txt', **kwargs) msg.html = render_template(template + '.html', **kwargs) thr = Thread(target=asyncSendMail, args=(app, msg)) thr.start() return thr @app.route("/") def index(): return "Hello" @app.route('/mail/',methods=['GET','POST']) def mail(): form = NameForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.name.data).first() if user is None: user = User(username=form.name.data) db.session.add(user) session['know'] = False print user sendMail("xxx@163.com",'New User','mail/new_user',user=user) else: session['know']= True session['name']=form.name.data return redirect(url_for('index')) return render_template('sql.html',form=form, name=session.get('name'), know=session.get('know',False)) if __name__=="__main__": app.run()

在这两行: app =Flask(name) m =Mail(app) 大家可以看到刚创建完app对象就立即和Mail类进行绑定,这样的话,下面app.config()配置就完全不会起到作用。

改正方法: 就是把m =Mail(app)写在所有app.config()的下面就行了 所以在写代码的时候请注意逻辑。

当然还有别的一些不注意也会引起类似错误: 例如: 1)把Mail(app)放在配置文件app.config()之前的逻辑错误

2)错误把app.config[‘MAIL_SERVER’] = ‘smtp.163.com’ 写成app.config[‘MAIL_SERVER’] = ‘stmp.163.com’ 错误在于把smtp写成了stmp

3)指定端口的时候要根据邮箱类别进行指定,比如网易163的端口是25。 就指定app.config[‘MAIL_PORT’] = 25

4)应用传输层安全协议的指定(默认为False) 但是对于不同邮箱要进行更改(比如163邮箱要设置为True) app.config[‘MAIL_USE_TLS’] = True

5)应用安全套阶层的指定(默认为False) 根据不同邮箱服务商进行设置 app.config[“MAIL_USE_SSL”] = True 本163邮箱用不到所以没有这一项代码。

欢迎进(Q)群,帮你解决问题:

转载请注明原文地址: https://www.6miu.com/read-85589.html

最新回复(0)