Windows下flask发送邮件完美解决in create_connection raise err error: [Errno 10061]等错误问题

在实现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)群,帮你解决问题:在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值