首頁  >  問答  >  主體

python - Flask Web开发,用户注册完需要邮箱确认问题

我在自学Flask,在看《FlaskWeb开发:基于Python的Web应用开发实战》这本书,目前已经做到了用户注册这一块,卡在了用户注册完需要邮箱确认才可以更完整的编辑信息,是不是用Venv模拟环境下是不能发送邮件的?这一点很迷惑,希望有前辈能指点一下。


界面图片如下:

代码是从官方github克隆的。

from ..email import send_email
@auth.route('/register', methods = ['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
# ...
db.session.add(user)
db.session.commit()
token = user.generate_confirmation_token()
send_email(user.email, 'Confirm Your Account',
'auth/email/confirm', user=user, token=token)
flash('A confirmation email has been sent to you by email.')
return redirect(url_for('main.index'))
return render_template('auth/register.html', form=form)

报错

send: 'ehlo [192.168.0.66]\r\n'
reply: '250-smtp.googlemail.com at your service, [119.130.184.228]\r\n'
reply: '250-SIZE 35882577\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-CHUNKING\r\n'
reply: '250 SMTPUTF8\r\n'
reply: retcode (250); Msg: smtp.googlemail.com at your service, [119.130.184.228
]
SIZE 35882577
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
CHUNKING
SMTPUTF8
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo [192.168.0.66]\r\n'
reply: '250-smtp.googlemail.com at your service, [119.130.184.228]\r\n'
reply: '250-SIZE 35882577\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-CHUNKING\r\n'
reply: '250 SMTPUTF8\r\n'
reply: retcode (250); Msg: smtp.googlemail.com at your service, [119.130.184.228
]
SIZE 35882577
8BITMIME
AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
ENHANCEDSTATUSCODES
PIPELINING
CHUNKING
SMTPUTF8
send: 'mail FROM:<flasky@example.com> size=1748\r\n'
reply: '530-5.5.1 Authentication Required. Learn more at\r\n'
reply: '530 5.5.1  https://support.google.com/mail/answer/14257 eh9sm8453423pad.
47 - gsmtp\r\n'
reply: retcode (530); Msg: 5.5.1 Authentication Required. Learn more at
5.5.1  https://support.google.com/mail/answer/14257 eh9sm8453423pad.47 - gsmtp
send: 'rset\r\n'
reply: '250 2.1.5 Flushed eh9sm8453423pad.47 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.5 Flushed eh9sm8453423pad.47 - gsmtp
send: 'quit\r\n'
reply: '221 2.0.0 closing connection eh9sm8453423pad.47 - gsmtp\r\n'
reply: retcode (221); Msg: 2.0.0 closing connection eh9sm8453423pad.47 - gsmtp
Exception in thread Thread-3:
Traceback (most recent call last):
  File "c:\python27\Lib\threading.py", line 801, in __bootstrap_inner
    self.run()
  File "c:\python27\Lib\threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Users\Administrator\myproject\flasky\app\email.py", line 9, in send_a
sync_email
    mail.send(msg)
  File "C:\Users\Administrator\myproject\venv\lib\site-packages\flask_mail.py",
line 416, in send
    message.send(connection)
  File "C:\Users\Administrator\myproject\venv\lib\site-packages\flask_mail.py",
line 351, in send
    connection.send(self)
  File "C:\Users\Administrator\myproject\venv\lib\site-packages\flask_mail.py",
line 168, in send
    message.as_string())
  File "c:\python27\Lib\smtplib.py", line 731, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)
SMTPSenderRefused: (530, '5.5.1 Authentication Required. Learn more at\n5.5.1  h
ttps://support.google.com/mail/answer/14257 eh9sm8453423pad.47 - gsmtp', 'Flasky
 Admin <flasky@example.com>')
PHP中文网PHP中文网2742 天前864

全部回覆(5)我來回復

  • PHPz

    PHPz2017-04-17 18:03:18

    題主,這個問題我解決了。我也是使用的gmail信箱,遇到的報錯跟你貼出來的一樣。我猜題主應該用的也是PyCharm吧?

    對,鍋子就是PyCharm的! 在flask中配置從venv的環境變數中讀入MAIL_USERNAMEMAIL_PASSWORD這兩個配置項,同時在PyCharm中使用venv作為解釋器運行程序,就會出現這樣的情況。

    原因是,PyCharm中沒有讀到環境變量,也就是說上面提到的兩個配置項在程式運行的時候值為None(這個你在config.py裡下個斷點就能看到),所以就會報這個530的錯誤了,因為你根本沒有登入信箱= =

    我使用venv是把環境變數的export寫到了venv的activate文件中(就是啟動venv時用到的那個文件),我想PyCharm並沒有讀這個文件的內容。要解決這個問題,可以有兩種方法:

    1. 使用終端來運行程序,已親測發送成功;

    2. PyCharm中有個對當前項目解釋器的配置菜單,裡面有一項環境變量的配置,在此處添加環境變量的話,就能用PyCharm運行程序,並愉快的發確認郵件了;

    順便感謝這個問題———flask-mail 用環境變數提取帳號密碼發送郵件出錯給我帶來的靈感。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 18:03:18

    看你的錯誤日誌最後面,http 530,並沒有登入郵箱,檢查帳號密碼,或是你本地壓根訪問不了你的郵箱

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 18:03:18

    官方是Google的信箱,你換qq或163吧。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 18:03:18

    530, '5.5.1 Authentication Required.

    出現這個提示表示你需要認證才可以發送郵件,不可以發送匿名郵件。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 18:03:18

    看了一圈錯誤日誌,我想問題是你沒有修改郵箱的信息,使用的是原來代碼的:flasky@example.com 這個郵箱,那你明顯不可能有它的密碼的。

    所以你需要做的是找到代碼中的郵箱和密碼配置,修改成你自己的。至於說你連不上 gmail ,列印內容顯示你是可以連上的,所以不需要擔心這個問題。

    如果要再具體一點的話,你就打開 config.py 文件,找到 13 行,然後修改這兩個變數

    MAIL_USERNAME = '你的邮箱'
    MAIL_PASSWORD = '你的邮箱密码'

    跑一遍試試,應該可以了。

    回覆
    0
  • 取消回覆