# 問題1 (v) ###### tags: `Flask` ## socket.gaierror 資料能夠正常的輸入到資料庫裡,但是沒有辦法發送email * https://hackmd.io/@litchiMIAU/r1xr0WKKP * `MAIL_USERNAME` `MAIL_PASSWORD` `SECRET_KEY` 設置在 `.env` 裡 * `.env` 沒有上傳 :::warning **已解決** --- `config.py` 內的 `MAIL_SERVER` 是 `smpt` ::: ``` Exception in thread Thread-5: Traceback (most recent call last): File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\threading.py", line 932, in _bootstrap_inner self.run() File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "C:\Users\d0509\Documents\GitHub\FlaskImply_Login\member\sendemail.py", line 25, in send_async_email mail.send(msg) File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\site-packages\flask_mail.py", line 491, in send with self.connect() as connection: File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\site-packages\flask_mail.py", line 144, in __enter__ self.host = self.configure_host() File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\site-packages\flask_mail.py", line 158, in configure_host host = smtplib.SMTP(self.mail.server, self.mail.port) File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\smtplib.py", line 253, in __init__ (code, msg) = self.connect(host, port) File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\smtplib.py", line 339, in connect self.sock = self._get_socket(host, port, self.timeout) File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\smtplib.py", line 308, in _get_socket return socket.create_connection((host, port), timeout, File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\socket.py", line 787, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): File "c:\users\d0509\appdata\local\programs\python\python38-32\lib\socket.py", line 918, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed ``` :::success **已嘗試的方法** 執行方式更改為 `flask run --host=127.0.0.2 --port=8888` 更改 `MAIL_USERNAME` 和 `MAIL_PASSWORD` ::: ## Code ![](https://i.imgur.com/dqHcJn9.png) ### config ```python= import os class Config: path = os.path.abspath(os.path.dirname(__file__)) DEBUG = True SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(path, 'member/static/data/register.sqlite') SECRET_KEY = os.environ.get('SECRET_KEY') MAIL_SERVER = 'stmp.gmail.com' MAIL_PORT = 587 MAIL_USE_TLS = True MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') ``` ### view ```python= from member import app, db from flask import render_template, flash from member.setting.model import UserRegister from member.setting.form import FormRegister from member.sendemail import send_mail @app.route('/', methods=['GET', 'POST']) def register(): form = FormRegister() if form.validate_on_submit(): user = UserRegister( username = form.username.data, email = form.email.data, password = form.password.data ) db.session.add(user) db.session.commit() token = user.create_confirm_token() send_mail( sender='陌上花開', recipients=[user.email,], #有嘗試直接輸入信箱但沒有用 subject='啟用你的帳號', template='mail/welcome', mailtype='html', user=user, token=token ) return render_template('register/successR.html') return render_template('register/register.html', form=form) @app.route('/user_confirm/<token>') def user_confirm(token): user = UserRegister() data = user.validate_confirm_token(token) if data: user = UserRegister.query.filter_by(id=data.get('userID')).first() user.confirm = True db.session.add(user) db.session.commit() return render_template('register/successT.html') else: return render_template('register/failT.html') ```