Python对接Gmail发信 无需SMTP普通密码的实现方案
无需OAuth的Python发Gmail实现方案
自5月30日起,Gmail关闭了普通账号密码直接通过SMTP登录发信的入口,但并未完全停用SMTP服务,个人小工具场景不需要集成完整的Google OAuth登录流程,仅需调整账号配置即可复用原有smtplib代码。
问题复现
原有居家锻炼提醒工具通过Gmail向vtext短信网关发信实现推送,核心代码如下:
import time import smtplib import random gmail_user = 'usernameImNotSharing@gmail.com' gmail_password = 'TheCorrectPassword' sent_from = gmail_user to = ['myphonenumber@vtext.com'] exercises = ['push ups', 'jumps in place', '20lb curls', 'tricep extensions', 'quarter mile runs'] levels = [1, 2, 3] level1 = ['10', '15', '16', '20', '1'] level2 = ['15', '30', '30', '40', '2'] level3 = ['20', '50', '48', '70', '4'] while True: if int(time.strftime('%H')) > 9: if int(time.strftime('%H')) < 23: abc = random.uniform(0, 1) picker = random.randint(0, 4) if abc < 0.3: level = level1 if 0.3 < abc and abc < 0.8: level = level2 if abc > 0.8: level = level3 exersize = exercises[picker] amount = level[picker] try: subject = f'Test' body = f'Do {amount} {exersize}' server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.ehlo() server.login(gmail_user, gmail_password) server.sendmail(sent_from, to, body) server.close() print('Email sent!') except Exception as error: print(error) time.sleep(random.randint(1500, 4800)) time.sleep(100)
使用普通账号密码运行时会抛出如下认证失败报错:
(535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials jj1-20020a170903048100b00163247b64bfsm7655137plb.115 - gsmtp')
操作步骤
- 进入谷歌账号安全设置页面,为账号开启双因素认证
- 双因素认证生效后,在同一安全设置页面生成应用专用密码
- 将原代码中
gmail_password变量对应的账号普通密码,替换为生成的16位应用专用密码,其余业务逻辑无需改动,即可正常通过SMTP协议发信。
内容的提问来源于stack exchange,提问作者AlbinoRhino
相关产品推荐
相关产品推荐

