Flask-mail发送邮件遇到的错误总结,以及成功后源码

来源:互联网 发布:类似wearaday的软件 编辑:程序博客网 时间:2024/05/16 11:45

首先放上成功发送邮件后源码,遇到的六种错误以及可能成功的解决办法在文章后半文

写的很乱….莫怪…..

from flask import Flask, render_template, session, redirect, url_forfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom flask_wtf import Formfrom flask_script import Managerfrom wtforms import StringField, SubmitFieldfrom wtforms.validators import DataRequiredfrom flask_sqlalchemy import SQLAlchemyfrom flask_migrate import  Migrate,MigrateCommandfrom flask_mail import Mailfrom flask_mail import Messagefrom threading import Threadimport osbasedir = 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_COMMIT_ON_TEARDOWN'] = Truedb = SQLAlchemy(app)Bootstrap(app)Moment(app)manager = Manager(app)migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)app.config['DEBUG'] = Trueapp.config['MAIL_SERVER'] = 'smtp.163.com'app.config['MAIL_PORT'] = 25app.config['MAIL_USE_TLS'] = Falseapp.config['MAIL_USE_SSL'] = Falseapp.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'app.config['FLASKY_MAIL_SENDER'] = '15518997683@163.com'mail = Mail(app)def send_async_email(app, msg):    with app.app_context():        mail.send(msg)def 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)    thr = Thread(target=send_async_email, args=[app, msg])    thr.start()    return thrclass 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.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 %r>' % self.usernameclass NameForm(Form):    name = StringField('What is your name?', validators=[DataRequired()])    submit = SubmitField('Submit')@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:            user = User(username=form.name.data)            db.session.add(user)            session['known'] = False            if app.config['FLASKY_ADMIN']:                send_email(app.config['FLASKY_ADMIN'], 'New User','mail/new_user', user=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.errorhandler(404)def page_not_found(e):    return render_template('404.html'), 404if __name__ == '__main__':    app.run()

一、
错误一

这种错误我把MAIL_PORT从25改成587出现了。所以发生这种错误后可以检查一下MAIL_PORT是否正确。

二、
错误二

这种错误应该是环境变量中MAIL_USERNAME和MAIL_PASSWORD没有设置好。如果遇到这种错误可以尝试着不在环境中导入,直接在程序中写入账户密码。看看是否能成功

三、
错误三
这种错误应该是163邮箱中stmp功能没有打开。
遇到这种错误可以尝试着在163的网页里面,把stmp的功能打开,
这里写图片描述
同时用客户端授权码代替用户密码,这个也要在163页面设置
这里写图片描述

四、
错误四
这种错误应该是mail = Mail(app)代码位置放错了。
正确时候,这句代码在程序中出现的位置应该是在这个地方

app.config['DEBUG'] = Trueapp.config['MAIL_SERVER'] = 'smtp.163.com'app.config['MAIL_PORT'] = 25app.config['MAIL_USE_TLS'] = Falseapp.config['MAIL_USE_SSL'] = Falseapp.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')mail = Mail(app)

当我把这句代码放到这个位置

mail = Mail(app)app.config['DEBUG'] = Trueapp.config['MAIL_SERVER'] = 'smtp.163.com'app.config['MAIL_PORT'] = 25app.config['MAIL_USE_TLS'] = Falseapp.config['MAIL_USE_SSL'] = Falseapp.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')

就会出现第四种错误

五、
这里写图片描述
这种535错误,应该是你的邮箱账户和密码不匹配

六、
这里写图片描述
这种10060错误,应该是服务器错误,有些外国书上会设置服务器为smtp.gmail.com,但我们在国内,所以可以根据自身情况设置为smtp.163.com或者smtp.qq.com等等

附加一个知识点:
所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改。也就是说当关闭此cmd命令行窗口后,将不再起作用。永久性修改环境变量的方法有两种:一种是直接修改注册表,另一种是通过我的电脑-〉属性-〉高级,来设置系统的环境变量

OK!end!

所谓的光辉岁月
并不是波澜闪耀的日子
而是无人问津时
你对梦想的偏执
你是否有勇气对自己忠诚到底?

0 0
原创粉丝点击