flask実装メール送信
4910 ワード
Flask-Mailの紹介
私たちにとってラッキーなことに、今では多くの外部プラグインがメールを処理しています.100%私たちの考え通りに処理することはできませんが、かなり近づいています.本来これはユーザ登録を実現する際にメールを送信するものであるが,パスワードを忘れるにはメール認証が必要であるため,メール認証を書き,認証コードはバックグラウンドPythonによって生成されRedis,come onにキャッシュされる.
config構成
メールボックスはfrom flask_に基づいて送信されます.Mail import Mailこのモジュールのinit.pyの中の配置
メールボックス送信認証コード
メールを送信
email.py
メールボックス検証コードの検証
私たちにとってラッキーなことに、今では多くの外部プラグインがメールを処理しています.100%私たちの考え通りに処理することはできませんが、かなり近づいています.本来これはユーザ登録を実現する際にメールを送信するものであるが,パスワードを忘れるにはメール認証が必要であるため,メール認証を書き,認証コードはバックグラウンドPythonによって生成されRedis,come onにキャッシュされる.
config構成
# redis
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# REDIS_pwd = 123456
# password = REDIS_pwd
SESSION_TYPE = "redis"
SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT)
SESSION_USE_SIGNER = True
PERMANENT_SESSION_LIFETIME = 84600
#QQ
MAIL_DEBUG = True # debug,
MAIL_SUPPRESS_SEND = False # , True
MAIL_SERVER = 'smtp.qq.com' #
MAIL_PORT = 465 #
MAIL_USE_SSL = True # ,qq SSL
MAIL_USE_TLS = False # TLS
MAIL_USERNAME = '[email protected]' #
MAIL_PASSWORD = 'xxxx' #
FLASK_MAIL_SENDER = ' ! !' #
FLASK_MAIL_SUBJECT_PREFIX = '[ ! ]' #
#MAIL_DEFAULT_SENDER = '[email protected]' # , ** **
メールボックスはfrom flask_に基づいて送信されます.Mail import Mailこのモジュールのinit.pyの中の配置
from config import config_map
mail = Mail()
#
config_class = config_map.get(config_name)
mail.init_app(app)
# password = config_class.REDIS_pwd
# redis
global redis_store
redis_store = redis.StrictRedis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)
メールボックス送信認証コード
@api.route('/teacher/send/mail', methods=['POST'])
def teacher_send_mail():
''' '''
email = request.json.get('email')
# if not all([email, nickname]):
if email is None:
return jsonify(re_code=RET.PARAMERR, msg=' ')
#
# ^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$
#
# ^0\d{2,3}\d{7,8}$|^1[358]\d{9}$|^147\d{8}$
if not re.match(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$', email):
return jsonify(RET.PARAMERR, msg=' ')
#
email_code = '%06d' % random.randint(0, 99999)
current_app.logger.debug(' : ' + email_code)
try:
redis_store.set('EMAILCODE:' + email, email_code, 1800) # half-hour = 1800
except Exception as e:
current_app.logger.debug(e)
return jsonify(re_code=RET.DBERR, msg=' ')
#
send_mail(
to=email,
mailcode=email_code
)
return jsonify(re_code=RET.OK, msg=' ')
メールを送信
email.py
from threading import Thread
from flask import current_app
from flask_mail import Message
from datetime import datetime
from attendance import mail
def send_async_email(app, msg):
with app.app_context(): #
mail.send(msg)
def send_mail(to, mailcode):
'''
:param to ->
:param nickname ->
:param mailcode ->
:return
'''
app = current_app._get_current_object()
msg = Message(app.config['FLASK_MAIL_SUBJECT_PREFIX'] + " ",
sender=app.config['FLASK_MAIL_SENDER'],
recipients=[to])
# html , 。
msg.body = 'sended by flask-email'
msg.html = '''
,
Flask-Test-Project!
{mailcode} !!!
:Flask-Test-Project
{time}
'''.format(mailcode=mailcode, time=datetime.utcnow)
thread = Thread(target=send_async_email, args=[app, msg])
thread.start()
return thread
メールボックス検証コードの検証
@api.route('/teacher/mail/verification', methods=['POST'])
def verification():
email = request.json.get('email')
mailcode = request.json.get('mailcode')
password = request.json.get('password')
try:
mailcode_server = redis_store.get('EMAILCODE:'+ email).decode()
except Exception as e:
current_app.logger.debug(e)
return jsonify(re_code=RET.DBERR, msg=' ')
if mailcode_server != mailcode:
current_app.logger.debug(mailcode_server)
return jsonify(re_code=RET.PARAMERR, msg=' ')
teacher = Teacher.query.filter_by(email=email).first()
user = Users.query.filter_by(username=teacher.sno).first()
user.password_hash = password
db.session.add(user)
db.session.commit()
return jsonify(errno=RET.OK, errmsg=" ")