# 問題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

### 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')
```