SMTP.starttls() Windows 10 上的超时错误

SMTP.starttls() TimeoutError on Windows 10

今天我尝试发送电子邮件 python:

import smtplib

EMAIL_HOST = 'smtp.google.com'
EMAIL_PORT = 587

EMAIL_FROM_LOGIN = 'sender@gmail.com'
EMAIL_FROM_PASSWORD = 'password'

MESSAGE = 'Hi!'

EMAIL_TO_LOGIN = 'recipient@gmail.com'

print('starting...')
server = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
server.starttls()

print('logging...')
server.login(EMAIL_FROM_LOGIN, EMAIL_FROM_PASSWORD)

print('sending message...')
server.sendmail(EMAIL_FROM_LOGIN, EMAIL_TO_LOGIN, MESSAGE)

此脚本不会比 starting... 打印更进一步。我整天都在搜索这个问题,但只找到类似的东西:

"check that port isn't blocked..."

至少我得到了关于 blocked/disabled/etc 的信息。端口,我没有,是问题的细节。


附加信息:根据我之前发现的一些建议,我检查了 telnet smtp.google.com 587 的输出。 输出是静态的 Connecting to smtp.google.com...。它会保留 2 分钟,然后打印:

Could not open a connection to this host, on port 587: Connection failed


UPD 1

我尝试手动打开端口,其中 python 脚本已 运行,但没有任何变化...


所以,我的问题是:我该怎么办?我在哪里可以找到那些被阻止的端口,如何 unblock/enable 它们?

在您的 gmail 帐户中启用较低的安全性并修复您的 smtp 地址:'smtp.gmail.com':

我的样本:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

mail_content = 'Sample text'

sender_address = 'xxx@xxx'
sender_pass = 'xxxx'
receiver_address = 'xxx@xxx'

message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'Test mail'
message.attach(MIMEText(mail_content, 'plain'))

session = smtplib.SMTP('smtp.gmail.com', 587)
session.starttls()
session.login(sender_address, sender_pass)
session.sendmail(sender_address, receiver_address, message.as_string())
session.quit()

print('Mail Sent')

你检查过你的代码了吗?有 smtp.google.com 而不是 smtp.gmail.com.

执行脚本前


  1. 首先,确保您已通过将要用于在脚本中发送邮件的邮件登录。
  2. 第二件重要的事情你必须在你的Less Security App or 2-Step Verification.

现在你可以使用下面的Python3代码


import smtplib as s
obj = s.SMTP("smtp.gmail.com", 587) #smtp server host and port no. 587
obj.starttls() #tls is a way of encryption

obj.login("sender@gmail.com","password")# login credential email and password by which you want to send mail.

subject = "Write your subject" #Subject of mail
message_body = " Hello Dear...\n Write your message here... "

msg = "Subject:{}\n\n{}".format(subject,message_body) #  complete mail subject + message body

list_of_address = ["mail1@gmail.com", "mail2@gmail.com", "mail3@yahoo.com", "mail4@outlook.in"]# list of email address
obj.sendmail("sender@gmail.com", list_of_address, msg)

print("Send Successfully...")
obj.quit()


现在来回答你的第二个问题 我该怎么办?我在哪里可以找到那些被阻止的端口,如何 unblock/enable 它们?

取消阻止端口


警告! 打开或取消阻止端口非常危险,就像破坏防火墙一样。 就看你小心了。


您可以尝试解封以下端口 80、433、443、3478、3479、5060、5062、5222、6250 和 12000-65000。


  1. 转到控制面板->单击系统和安全->单击Windows防火墙->Select高级设置,然后在左侧面板中select入站规则->右侧-点击入站规则然后select新建规则->Select端口->单击下一步
  2. Select TCP 作为应用规则的协议。
  3. Select 特定本地端口,添加以上所有端口,然后单击下一步
  4. Select 允许连接.
  5. 保留 DomainPrivatePublic 选中以应用规则适用于所有类型的网络。
  6. 为规则命名点击完成

希望你的问题得到解决