flask_mail用法实例
代碼來自<Flask Web開發 基于Python的Web應用開發實戰>書上的第六章中的示例,github版本是6b,代碼獲取方式如下:
終端輸入:
git clone https://github.com/miguelgrinberg/flasky.git
git checkout 6b
?
測試場景:
發送方是163郵箱
接收方是qq郵箱
?
為了方便運行,hello.py修改如下:
#-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import os from threading import Thread from flask import Flask, render_template, session, redirect, url_for from flask_bootstrap import Bootstrap from flask_moment import Moment from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_mail import Mail, Message from flask_script import Manager basedir = 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_TRACK_MODIFICATIONS'] = False app.config['MAIL_SERVER'] = 'smtp.163.com' app.config['MAIL_PORT'] = 25 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')#整的意思就是從.bashrc中獲取變量的具體賦值 app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]' app.config['FLASKY_MAIL_SENDER'] = os.environ.get('FLASKY_MAIL_SENDER') app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN') app.config['DEBUG'] = Truebootstrap = Bootstrap(app) moment = Moment(app) db = SQLAlchemy(app) migrate = Migrate(app, db) mail = Mail(app)manager = Manager(app) 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 %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.usernamedef 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=['XXXXXXX@qq.com'])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 NameForm(FlaskForm):name = StringField('What is your name?', validators=[DataRequired()])submit = SubmitField('Submit')@app.shell_context_processor def make_shell_context():return dict(db=db, User=User, Role=Role)@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'), 500@app.route('/', methods=['GET', 'POST']) def index():form = NameForm()if form.validate_on_submit():user = User.query.filter_by(username=form.name.data).first()print "user=",userif user is None:user = User(username=form.name.data)db.session.add(user)db.session.commit()session['known'] = Falseprint"app.config['FLASKY_ADMIN']",app.config['FLASKY_ADMIN']if app.config['FLASKY_ADMIN']:send_email(app.config['FLASKY_ADMIN'], 'New User','mail/new_user', user=user)else:session['known'] = Truesession['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html', form=form, name=session.get('name'),known=session.get('known', False)) def killport(port):command='''kill -9 $(netstat -nlp | grep :'''+str(port)+''' | awk '{print $7}' | awk -F"/" '{ print $1 }')'''os.system(command) if __name__ == '__main__':killport(5000)db.create_all()manager.run()#運行配置如下:#設置.bashrc如下:# export MAIL_USERNAME=appleyuchi@163.com# export MAIL_PASSWORD=XXXXXXX# export FLASKY_MAIL_SENDER='Flasky Admin <appleyuchi@163.com>'# export FLASKY_ADMIN=appleyuchi@163.com#163郵箱開啟SMTP#qq郵箱開啟pop#刪除sqlite3文件,否則代碼邏輯走不到發送郵件那里的#app.config['MAIL_PORT']=25#app.config['MAIL_SERVER'] = 'smtp.163.com'修改此處#app.config['MAIL_USE_TLS'] = True#app.config['DEBUG'] = True# from flask_script import Manager# manager = Manager(app)以上的注釋中標注了所有需要修改,以及相對于github上面的代碼而言,需要增加的部分
kilport函數是根據上次運行代碼時的端口關閉進程,這樣運行代碼時就不用手動在終端關閉進程來釋放端口了,方便調試使用。
注意必須是view plain中才能復制以上代碼,因為博客顯示中會把三個引號'''顯示成5個引號'''''
請記得.bashrc中增加上面注釋中提到的四行,然后運行方法是(注意上面的flask_script相關的不能刪除,否則下面的shell上下文環境就沒有了):
?
運行方法如下:
python hello.py shell
>>> from flask.ext.mail import Message
>>> msg = Message('test subject', sender='appleyuchi@163.com', recipients=['XXXXXXx@qq.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b>'
>>> with app.app_context():
...? ? ?mail.send(msg)
?
文件結構是:
(python2.7) appleyuchi@ubuntu16:~/桌面/flask_learn/書本的git/flasky$ tree
.
├── hello.py
├── hello.pyc
├── LICENSE
├── migrations
│? ?├── alembic.ini
│? ?├── env.py
│? ?├── README
│? ?├── script.py.mako
│? ?└── versions
│? ? ? ?└── 38c4e85512a9_initial_migration.py
├── README.md
├── static
│? ?└── favicon.ico
├── templates
│? ?├── 404.html
│? ?├── 500.html
│? ?├── base.html
│? ?├── index.html
│? ?└── mail
│? ? ? ?├── new_user.html
│? ? ? ?└── new_user.txt
└── test.txt
總結:如果使用的發送和接收郵箱類型不變的話,那么只要修改:
.bashrc中的三處163郵箱+一處qq郵箱+一處163郵箱密碼+
開啟發送端的SMTP+接收端郵箱的POP即可
最終實驗成功的標志是在接收端的qq郵箱里面收到郵件.
總結
以上是生活随笔為你收集整理的flask_mail用法实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Error encountered wh
- 下一篇: sublime的Fatal pylint