代码是从官方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: 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 ')
题主,这个问题我解决了。我也是使用的gmail邮箱,遇到的报错跟你贴出来的一样。我猜题主应该用的也是PyCharm吧?
对,锅就是PyCharm的!在flask中配置从venv的环境变量中读入
MAIL_USERNAME
和MAIL_PASSWORD
这两个配置项,同时在PyCharm中使用venv作为解释器运行程序,就会出现这样的情况。原因是,PyCharm中没有读到环境变量,也就是说上面提到的两个配置项在程序运行的时候值为None(这个你在
config.py
里下个断点就能看到),所以就会报这个530的错误了,因为你根本没有登录邮箱= =我使用venv是把环境变量的export写到了venv的
activate
文件中(就是启动venv时用到的那个文件),我想PyCharm并没有读这个文件的内容。要解决这个问题,可以有两种方法:使用终端来运行程序,已亲测发送成功;
PyCharm中有个对当前项目解释器的配置菜单,里面有一项环境变量的配置,在此处添加环境变量的话,就能用PyCharm运行程序,并愉快的发确认邮件了;
顺便感谢这个问题———flask-mail 用环境变量提取账号密码发送邮件出错给我带来的灵感。
看你的错误日志最后面,http 530,并没有登录到邮箱,检查一下帐号密码,或者你本地压根访问不了你的邮箱
官方是谷歌的邮箱,你换qq或者163吧。
出现这个提示说明你需要认证才可以发送邮件,不可以发送匿名邮件。
看了一圈错误日志,我想问题是你没有修改邮箱的信息,使用的是原来代码的:flasky@example.com 这个邮箱,那你明显不可能有它的密码的。
所以你需要做的是找到代码中的邮箱和密码配置,修改成你自己的。至于说你连不上 gmail ,打印内容显示你是可以连上的,所以不需要担心这个问题。
如果要再具体一点的话,你就打开 config.py 文件,找到 13 行,然后修改这两个变量
跑一遍试试,应该可以了。