在实现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)群,帮你解决问题: