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

2022-10-10 17:05:52 +08:00
 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')                              

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

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

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

这样试试呢
kaiger
2022-10-10 17:30:33 +08:00
@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 17:33:29 +08:00
@kaiger 什么数字邮箱,按理说 SMTP 服务打开了就可以使用 QQ 邮箱发送
kaiger
2022-10-10 17:36:15 +08:00
@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 17:36:54 +08:00
大意了
westoy
2022-10-10 17:39:28 +08:00
用 SES 啊, 几个平台一天都有几十封到百来封的免费额度的, 你这种程序发送业务其实用消费级邮件不太好, 他们提供 SMTP 也只是为了让你接入本地邮件软件的, 卡的很死的
Wongz
2022-10-10 19:35:16 +08:00
测试了一下 Flask-Mail ,QQ 邮箱可以正常发送,没有问题,也是使用了英文域名。看看是不是授权码弄错了吧,重新生成一个试试。
Wongz
2022-10-10 19:39:06 +08:00
配置只用了这些
```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 19:43:15 +08:00
按腾讯的说明,如果近期改了 QQ 密码,之前的授权码就会失效,要重新生成,可以看看是不是这个原因导致的。我也关闭了数字账号,测试可以正常发送
lonelinsky
2022-10-11 10:23:00 +08:00
生成号授权码之后先用一个邮箱客户端测试保证是好的,然后再在代码里面测试看看。(话说,腾讯的授权码不会显示登录的客户端个数吧?)
julyclyde
2022-10-11 13:18:49 +08:00
@lonelinsky SMTP 客户端“没有自我”,无法互相区分的
kaiger
2022-10-11 14:47:45 +08:00
@Wongz #8



就很难受,无论代理开着还是关闭,都加载不出来。
elboble
2022-10-11 15:14:37 +08:00
这个可以用
```
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 17:42:42 +08:00
惡魔狗在女孩的腿上是亂七八糟的,直到女孩拉它,狗很愚蠢: 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