求助,关于 Flask-Mail 的大坑。

2022 年 10 月 10 日
 kaiger

初始化代码:

app = create_app()
# mail client
mail = Mail(app)

配置文件:

# flask_mail
MAIL_DEBUG = False
MAIL_SUPPRESS_SEND = False
MAIL_SERVER = 'smtp.qq.com'
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USE_TLS = False
MAIL_USERNAME = os.getenv("MAIL_USERNAME") or "xxxx@qq.com"
MAIL_PASSWORD = os.getenv("MAIL_PASSWORD") or "xxxxxxxxxxx"	# QQ 邮箱授权码

发送邮件代码:

@celery.task
def send(mail_from, mail_to, subject="", content="", html=""):
    try:
        msg = Message(
            subject=subject,
            sender=mail_from,
            recipients=[mail_to]
        )
        msg.body = content
        msg.html = html

        mail.send(msg)
    except Exception as e:
        return e.__str__()

    return "ok"

send.delay("xxxx@qq.com", "xxxxx@qq.com", "test", "content")

错误信息:

(535, b'Login Fail. Please enter your authorization code to login. More information in              
                    http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')                              

不知道哪里出了问题,到网上搜了一圈,这个配置没错,就是账户验证失败,就很难受。

4469 次点击
所在节点    Flask
15 条回复
elboble
2022 年 10 月 10 日
没仔细看,一般这种登录不是用户名密码的,而是生成一个 key ,返回有链接可以看下。
Courstick
2022 年 10 月 10 日
@elboble 注释是写的 QQ 邮箱授权码

smtp = smtplib.SMTP_SSL('SMTP_SERVER', 465)
smtp.login(username, passwd)
smtp.sendmail(username, receiver, msg)
smtp.quit()

这样试试呢
kaiger
2022 年 10 月 10 日
@Courstick #2

smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

还是报错,我之前把 QQ 的数字邮箱关掉了,不知道和这个有没有关系。
Courstick
2022 年 10 月 10 日
@kaiger 什么数字邮箱,按理说 SMTP 服务打开了就可以使用 QQ 邮箱发送
kaiger
2022 年 10 月 10 日
@Courstick #4




这个,SMTP 服务开了,还是发送不了

```
def send(mail_from, mail_to, subject="", content="", html=""):
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp.login("wdkany@qq.com", "tlkcxpzurpoxdjhe")
smtp.sendmail(mail_from, mail_to, "hhh")
smtp.quit()
return "ok"


send("xxxx@qq.com", "xxxx@qq.com")

```
kaiger
2022 年 10 月 10 日
大意了
westoy
2022 年 10 月 10 日
用 SES 啊, 几个平台一天都有几十封到百来封的免费额度的, 你这种程序发送业务其实用消费级邮件不太好, 他们提供 SMTP 也只是为了让你接入本地邮件软件的, 卡的很死的
Wongz
2022 年 10 月 10 日
测试了一下 Flask-Mail ,QQ 邮箱可以正常发送,没有问题,也是使用了英文域名。看看是不是授权码弄错了吧,重新生成一个试试。
Wongz
2022 年 10 月 10 日
配置只用了这些
```python
app.config['MAIL_SERVER']='smtp.qq.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = '邮箱地址'
app.config['MAIL_PASSWORD'] = '16 位授权码'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
```
Wongz
2022 年 10 月 10 日
按腾讯的说明,如果近期改了 QQ 密码,之前的授权码就会失效,要重新生成,可以看看是不是这个原因导致的。我也关闭了数字账号,测试可以正常发送
lonelinsky
2022 年 10 月 11 日
生成号授权码之后先用一个邮箱客户端测试保证是好的,然后再在代码里面测试看看。(话说,腾讯的授权码不会显示登录的客户端个数吧?)
julyclyde
2022 年 10 月 11 日
@lonelinsky SMTP 客户端“没有自我”,无法互相区分的
kaiger
2022 年 10 月 11 日
@Wongz #8



就很难受,无论代理开着还是关闭,都加载不出来。
elboble
2022 年 10 月 11 日
这个可以用
```
import smtplib
_user = "号码 @qq.com"
_pwd = "那啥 key"
_to = ""
def XEmail(fromAdd, pwd, toAdd ,subject ,attachfile ,msg):
try:
s = smtplib.SMTP_SSL("smtp.qq.com")
s.login(fromAdd,pwd)
s.sendmail(fromAdd,toAdd,msg.as_string())
s.quit()
print "Done!"
except smtplib.SMTPException,e:
print "Fail at %s"%e
```
zhuzhipeng
2022 年 10 月 17 日
惡魔狗在女孩的腿上是亂七八糟的,直到女孩拉它,狗很愚蠢: https://anymud.com

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX