flask実装メール送信

4910 ワード

Flask-Mailの紹介
私たちにとってラッキーなことに、今では多くの外部プラグインがメールを処理しています.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="      ")