使用 Python 示例发送电子邮件失败
Posted
技术标签:
【中文标题】使用 Python 示例发送电子邮件失败【英文标题】:Failing to send email with the Python example 【发布时间】:2010-09-28 18:52:46 【问题描述】:我一直在尝试(但失败了)弄清楚如何通过 Python 发送电子邮件。
从这里尝试示例: http://docs.python.org/library/smtplib.html#smtplib.SMTP
但在我收到关于没有 SSL 连接的反弹后添加了 server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
行。
现在我得到了这个:
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in <module>
server = smtplib.SMTP('smtp.gmail.com', 65)
File "C:\Python26\lib\smtplib.py", line 239, in __init__
(code, msg) = self.connect(host, port)
File "C:\Python26\lib\smtplib.py", line 295, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "C:\Python26\lib\smtplib.py", line 273, in _get_socket
return socket.create_connection((port, host), timeout)
File "C:\Python26\lib\socket.py", line 512, in create_connection
raise error, msg
error: [Errno 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
>>>
想法?
server = smtplib.SMTP("smtp.google.com", 495) 给我一个超时错误。只是 smtplib.smtp("smtp.google.com", 495) 给了我“SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol”(见下文)。
我正在尝试不同的端口,但现在我遇到了一个全新的错误。我只是发布整个代码,我可能会犯一些菜鸟错误。
"
import smtplib
mailuser = 'MYEMAIL@gmail.com'
mailpasswd = 'MYPASSWORD'
fromaddr = 'MYEMAIL@gmail.com'
toaddrs = 'MYEMAIL2@gmail.com'
msg = 'Hooooorah!'
print msg
server = smtplib.SMTP_SSL('smtp.google.com')
server = smtplib.SMTP_SSL_PORT=587
server.user(mailuser)
server.pass_(mailpasswd)
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
"
然后我收到以下错误消息:“
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in <module>
server = smtplib.SMTP_SSL('smtp.google.com')
File "C:\Python26\lib\smtplib.py", line 749, in __init__
SMTP.__init__(self, host, port, local_hostname, timeout)
File "C:\Python26\lib\smtplib.py", line 239, in __init__
(code, msg) = self.connect(host, port)
File "C:\Python26\lib\smtplib.py", line 295, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "C:\Python26\lib\smtplib.py", line 755, in _get_socket
self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
File "C:\Python26\lib\ssl.py", line 350, in wrap_socket
suppress_ragged_eofs=suppress_ragged_eofs)
File "C:\Python26\lib\ssl.py", line 118, in __init__
self.do_handshake()
File "C:\Python26\lib\ssl.py", line 293, in do_handshake
self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
"
请注意,实际上看起来像“server = smtplib.SMTPSSLPORT=587”实际上是“server = smtplib.SMTP underscore SSL underscore PORT=587”,有这里正在进行某种格式设置。
【问题讨论】:
注意:请不要假设这里的答案是按时间排序的,就像一封电子邮件一样。答案可以通过投票和编辑的方式提高或降低。因此,如果您想回复某人,请不要发布答案 - 而是发表评论或更新问题。 【参考方案1】:端口不正确?我将 587 用于 smtp.gmail.com 并且它有效。
【讨论】:
【参考方案2】:你应该检查你的端口,我不确定谷歌的 SMTP 端口是 65,这可以解释超时。
修改您的来源:
smtplib.SMTP_SSL('smtp.google.com', 465)
但是,如果您确定它应该可以工作而它没有工作,那么 smtplib.SMTP_SSL 似乎存在一些问题,并且有一个可用的补丁程序here。
【讨论】:
【参考方案3】:以下代码适用于我:
import smtplib
FROMADDR = "my.real.address@gmail.com"
LOGIN = FROMADDR
PASSWORD = "my.real.password"
TOADDRS = ["my.real.address@gmail.com"]
SUBJECT = "Test"
msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
% (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
msg += "some text\r\n"
server = smtplib.SMTP('smtp.gmail.com', 587)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.login(LOGIN, PASSWORD)
server.sendmail(FROMADDR, TOADDRS, msg)
server.quit()
我使用的是 Python 2.5.2。
编辑:按照 ΤZΩΤZΙΟΥ 的建议将端口从 25 更改为 587,并删除了第二个 ehlo()。现在我很想知道为什么端口 25 在我的机器上完美工作(而端口 465不是)。
【讨论】:
使用 Python 2.4.4 和您的示例我收到以下错误:服务器不支持 SMTP AUTH 扩展。我可以通过在调用 starttls() 后添加第二个 ehlo() 来解决它 不需要调用 server.ehlo()。 server.sendmail(...) 会根据需要处理它。 通过 gmail 发送时,我的代码需要在 starttls() 之前使用 server.ehlo(),使用 python 2.5.2 我正在使用上面的代码,但是我得到了错误 => ssl.SSLError: [Errno 1] _ssl.c:503: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol .【参考方案4】:这是一个简单的丢弃解决方案。本来想早点贴的,结果在椅子上睡着了。
import smtplib
import email
import os
username = "user@gmail.com"
passwd = "password"
def mail(to, subject, text, attach):
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = to
msg['Subject'] = subject
msg.attach(MIMEText(text))
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)
server = smtplib.SMTP("smtp.gmail.com", 495)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username, passwd)
server.sendmail(username, to, msg.as_string())
server.close()
mail("you", "hi", "hi", "webcam.jpg")
我的假设是这个线程上大多数成功尝试过他们的代码的人都不在 win32 上。 ;)
*edit:请参阅http://docs.python.org/library/email-examples.html 了解一些好的“官方”示例。
【讨论】:
我的代码肯定需要 2 个 ehlo 命令。没有 ehlo,代码将无法运行。 @Jiri 你是对的。我在这里使用 Python 2.5 进行验证(卡在这里,因为它是 Saurik 在 Cydia 上可用的全部),它只需要在starttls()
之后额外的 ehlo()
。 server.set_debuglevel(1)
在这方面很有帮助。当然,在 python 2.5 之后不需要第二个ehlo
。不过好像也没事。现在我有了从 2.5 到 2.7 的 python 电子邮件代码。包括在 ios 上运行。【参考方案5】:
好的,发现这行代码可以解决问题!
server = smtplib.SMTP('smtp.gmail.com', 587)
原来是 GMAIL 不支持端口 25 上的 SSL(并且端口 465 由于某种原因导致挂起)。
谢谢大家!
【讨论】:
好吧,写在 12 月 29 日:***.com/questions/399129/…【参考方案6】:使用 SSL 连接到 GMail 的正确方法是:
server = smtplib.SMTP('smtp.gmail.com', 587)
465 端口似乎会导致延迟。两个端口都在GMail FAQ 中指定。
请注意,对于基于 SSL 的 SMTP,使用端口 587 更为常见,虽然这只是一些琐碎的信息,但没有其他实际用途。
此答案作为社区 wiki 提供,以便被选为“the”答案。请根据需要改进。
【讨论】:
【参考方案7】:问题是由于a bug in Python。尝试使用 SMTP_SSL 创建连接将失败,并显示“SMTPServerDisconnected: please run connect() first.”
已提交修复,因此您可以修补本地副本。请参阅名为“smtplib_72551.diff”的附件。
(注意:SMTP_SSL 是 Python 2.6/3.0 及更高版本中添加的新类。)
【讨论】:
【参考方案8】:import smtplib
content = 'example email stuff here'
mail = smtplib.SMTP('smtp.gmail.com', 587)
mail.ehlo()
mail.starttls()
mail.login('email@gmail.com','password')
mail.sendmail('email@gmail.com', 'email@yahoo.com', content)
mail.close()
【讨论】:
【参考方案9】:from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText
HOST = 'smtp.gmail.com'
PORT = 465
USERNAME = 'oltjano13@gmail.com'
PASSWORD = ''
SENDER = 'oltjano13@gmail.com'
RECIPIENT = 'oltjano13@gmail.com'
text_subtype = 'plain'
with open('textfile', 'rb') as f:
msg = MIMEText(f.read(), text_subtype)
msg['Subject'] = 'Python Script'
msg['From'] = SENDER
msg['To'] = RECIPIENT
try:
connection = SMTP(HOST, PORT)
connection.login(USERNAME, PASSWORD)
connection.sendmail(SENDER, RECIPIENT, msg.as_string())
except Exception, e:
print(e)
上面的代码对我来说很好用。如您所见,此示例中使用了PORT = 465
,因为我使用的是SSL
。如果您打算使用端口587
,则需要TLS
。
【讨论】:
【参考方案10】:然后我尝试通过 smtp.gmail.com 发送电子邮件,我遇到了同样的错误。在我的情况下,Internet 提供商关闭了端口 25(以及 587 和其他端口)用于从 IP 地址(从我的网络)到外部网络的传出连接,只为其邮件服务器打开第 25 个端口。 所以,第一次尝试:
telnet smtp.gmail.com 587
(587 是你的端口)
通过这样做,您可以了解您的端口是否被 Internet 提供商关闭。 您可以联系您的提供商并要求他们为您打开一个端口。 我的解决方案是连接到其他网络(使用开放端口) 这是我使用的代码:
gmailaddress = "youremailadress@gmail.com"
gmailpassword = "7777777"
mailto = "youremailadress@gmail.com"
msg = input("What is your message? \n ")
mailServer = smtplib.SMTP('smtp.gmail.com' , 587)
mailServer.starttls()
mailServer.login(gmailaddress , gmailpassword)
mailServer.sendmail(gmailaddress, mailto , msg)
print(" \n Sent!")
mailServer.quit()```
【讨论】:
顺便说一句,我已经获得了许可:accounts.google.com/b/0/DisplayUnlockCaptcha 和 myaccount.google.com/…以上是关于使用 Python 示例发送电子邮件失败的主要内容,如果未能解决你的问题,请参考以下文章