我目前正在按照教程尝试使用 smtplib 从 Gmail 发送电子邮件。我不断收到错误:
TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机未能响应而建立的连接失败
我担心这可能与 Gmail 更新其安全性有关,以防止人们在 Google 帐户上使用应用程序密码。
非常感谢任何帮助。
这是我遵循的代码,密码是使用 Gmail 上的应用程序密码功能生成的:
import smtplib
from email.mime.text import MIMEText
password = "XXXXXXXXX"
subject = "Email Subject"
body = "This is the body of the text message"
sender = "[email protected]"
recipients = sender
def send_email(subject, body, sender, recipients, password):
msg = MIMEText(body)
msg\["subject"\] = subject
msg\["From"\] = sender
msg\["To"\] = ",".join(recipients)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp_server:
smtp_server.login(sender, password)
smtp_server.sendmail(sender, recipients,msg.as_string())
print("Message Sent!")
send_email(subject, body, sender, recipients, password)
如上所述,每次我尝试运行它时,都会收到错误:
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
这不一定是由于安全设置造成的。 我只能使用应用程序密码登录我的 Gmail 帐户。
错误消息表明您可能遇到网络问题。 因为它没有收到服务器错误响应。即E
535,b'5.7.8 用户名和密码不被接受。欲了解更多信息,请访问 5.7.8 https://support.google.com/mail/?p=BadCredentials 41be03b00d2f7-7274907454esm1305271a12.61 - gsmtp
我建议您尝试在 python 环境中使用终端进行测试。
例如,
使用openssl:
openssl s_client -ign_eof -connect smtp.gmail.com:465
...
220 smtp.gmail.com
使用远程登录:
telnet smtp.gmail.com 465
...
Connected to smtp.gmail.com
这应该显示您的客户端是否能够与服务器建立连接。
根据 Google 文档,安全性较低的应用程序的弃用日期为 2024 年 9 月。 https://support.google.com/accounts/answer/6010255?hl=en
尽管您也可以领先一步并切换到 OAuth 身份验证。
https://developers.google.com/gmail/imap/xoauth2-protocol#smtp_protocol_exchange
这需要首先生成访问令牌。为此,您应该能够使用 python 客户端库,Google 建议您也熟悉该协议。如果您已经在创建用户令牌,您不妨切换到使用 gmail api,因为您已经完成了一半,这将完全放弃 SMTP。
使用OAuth 2.0访问Google API https://developers.google.com/identity/protocols/oauth2
Gmail API Python 快速入门 https://developers.google.com/gmail/api/quickstart/python
如果您确实遇到网络问题,并且您打算使用带有访问令牌的 SMTP,则仍然需要解决该问题。网上有大量关于解决网络问题的资源。
您可以从上面的测试开始,看看是否仍然出现超时。然后检查端口是否对您的客户端开放,并检查防火墙设置并执行跟踪路由。
关于这方面的一些额外参考。
https://linux.die.net/man/8/traceroute https://www.ionos.com/digitalguide/server/security/checking-open-ports/
希望这有帮助!