我一直在尝试(并且失败)找出如何通过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:错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议”(见下文)。
我正在尝试不同的端口,现在我遇到了一个全新的错误。我只是发布了一些代码,我可能会犯一些菜鸟错误。
“
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 下划线 SSL 下划线 PORT = 587”,这里有这里有某种格式化的东西。
答案 0 :(得分:28)
以下代码适用于我:
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。
编辑:根据ΤΖΩΤΖΙΟΥ的建议将端口从25更改为587,并删除第二个ehlo()。现在我想知道为什么端口25从我的机器完美工作(而端口465 不)。
答案 1 :(得分:7)
使用SSL连接GMail的正确方法是:
server = smtplib.SMTP('smtp.gmail.com', 587)
465号港口似乎造成延误。两个端口都在GMail FAQ中指定。
请注意,使用端口587对于SMTP over SSL更为常见,尽管这只是一些简单的信息,但没有其他实际用途。
此答案作为社区维基提供,以便被选为“答案”。请根据需要进行改进。
答案 2 :(得分:6)
这是一个简单的抛弃解决方案。我想早点粘贴它,但是在我的椅子上睡着了。
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上。 ;)
*编辑:有关一些好的“官方”示例,请参阅http://docs.python.org/library/email-examples.html。
答案 3 :(得分:6)
问题归因于a bug in Python。尝试使用SMTP_SSL创建连接将失败,并显示“SMTPServerDisconnected:请先运行connect()。”
已提交修复程序,因此您可以修补本地副本。请参阅名为“smtplib_72551.diff”的附件。
(注意:SMTP_SSL是添加到Python 2.6 / 3.0及更高版本的新类。)
答案 4 :(得分:2)
好的,发现这行代码可以解决问题!
server = smtplib.SMTP('smtp.gmail.com',587)
原来是GMAIL不支持端口25上的SSL(并且端口465由于某种原因导致挂起)。
谢谢你们!
答案 5 :(得分:1)
可能是错误的端口?我正在使用 587 smtp.gmail.com ,它可以正常运行。
答案 6 :(得分:1)
你应该检查你的端口,我不确定google的SMTP端口是65,这可以解释超时。
修改您的来源:
smtplib.SMTP_SSL('smtp.google.com',465)
但是,如果你确定它应该工作但事实并非如此,那么smtplib.SMTP_SSL似乎存在一些问题,而且它有一个可用的补丁here。
答案 7 :(得分:1)
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
,则需要dictionary<string,string>
。
答案 8 :(得分:0)
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 :(得分:0)
然后,我试图通过smtp.gmail.com发送电子邮件,但我遇到了同样的错误。在我的情况下,Internet提供商关闭了端口25(以及587和其他端口),用于从IP地址(从我的网络)到外部网络的传出连接,只为邮件服务器打开了第25个端口。 因此,首先尝试:
LRESULT CALLBACK ListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case WM_NOTIFY:
{
UINT debugval = (((LPNMHDR)lParam)->code);
switch (debugval)
{
case HDN_BEGINTRACK:
return true;
}
break;
}
case LVM_SETCOLUMNWIDTH:
OutputDebugString(L"LVM_SETCOLUMNWIDTH triggered\n");
break;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
(587是您的端口)
这样做可以使您了解端口是否被Internet提供商关闭。 您可以联系您的提供商,并要求他们为您打开端口。 我的解决方案是连接到其他网络(使用开放端口) 这是我使用的代码:
telnet smtp.gmail.com 587