22

我一直在尝试(并且失败)弄清楚如何通过 Python 发送电子邮件。

从这里尝试示例:http: //docs.python.org/library/smtplib.html#smtplib.SMTP

server = smtplib.SMTP_SSL('smtp.gmail.com', 465)在我收到关于没有 SSL 连接的反弹后添加了这条线。

现在我得到了这个:

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”,这里有一些格式化的事情。

4

10 回答 10

29

以下代码适用于我:

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 端口不能)。

于 2008-12-30T00:48:19.343 回答
8

使用 SSL 连接到 GMail 的正确方法是:

server = smtplib.SMTP('smtp.gmail.com', 587)

端口 465 似乎会导致延迟。这两个端口都在GMail FAQ中指定。

请注意,对于基于 SSL 的 SMTP,使用端口 587 更为常见,虽然这只是一些琐碎的信息,但没有其他实际用途。

此答案作为社区 wiki 提供,以便被选为“the”答案。请根据需要改进。

于 2008-12-31T01:41:13.730 回答
6

Here's a simple throw away solution. Meant to paste this earlier, but fell asleep at my chair.


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")

It's my assumption that most people on this thread that have had successful attempts with their code aren't on win32. ;)

*edit: See http://docs.python.org/library/email-examples.html for some good "official" examples.

于 2008-12-30T05:35:03.350 回答
6

问题是由于Python 中的错误造成的。尝试使用 SMTP_SSL 创建连接将失败,并显示“SMTPServerDisconnected:请先运行 connect()”。

已提交修复,因此您可以修补本地副本。请参阅名为“smtplib_72551.diff”的附件。

(注意:SMTP_SSL 是 Python 2.6/3.0 及更高版本中添加的新类。)

于 2009-06-05T11:01:06.077 回答
2

好的,发现这行代码可以解决问题!

服务器 = smtplib.SMTP('smtp.gmail.com', 587 )

结果是 GMAIL 不支持端口 25 上的 SSL(并且端口 465 由于某种原因导致挂起)。

多谢你们!

于 2008-12-30T17:30:53.437 回答
1

可能端口不正确?我将587用于smtp.gmail.com,它可以工作。

于 2008-12-29T23:59:19.457 回答
1

你应该检查你的端口,我不确定谷歌的 SMTP 端口是 65,这可以解释超时。

修改您的来源,如下所示:

smtplib.SMTP_SSL('smtp.google.com', 465)

但是,如果您确定它应该可以工作,但它不能工作,那么 smtplib.SMTP_SSL 似乎存在一些问题,这里有一个可用的补丁

于 2008-12-29T23:59:31.343 回答
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需要。

于 2015-06-02T12:04:50.657 回答
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()
于 2014-02-05T22:08:59.667 回答
0

然后我尝试通过 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()```
于 2020-10-19T09:00:48.757 回答