用Python通过Hotmail发送电子邮件

7

我想从我的服务器发送电子邮件。我尝试使用我已经拥有的hotmail帐户进行发送。

user = "myaddress@hotmail.com"
passwd = "xxxxxxxxx"

from_addr = "myaddress@hotmail.com"
to_addr = "someaddress@gmail.com"
smtp_srv = "smtp.live.com"

subject = "Home Server Uptime"
message = "The server has been online for: %s" %(uptime)

smtp = smtplib.SMTP(smtp_srv,587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login(user, passwd)
smtp.sendmail(from_addr, to_addr, message)
smtp.quit()

我收到了这个错误信息:


Traceback (most recent call last):
  File "sendemail.py", line 23, in <module>
    smtp.starttls()
  File "/usr/lib/python2.7/smtplib.py", line 636, in starttls
    (resp, reply) = self.docmd("STARTTLS")
  File "/usr/lib/python2.7/smtplib.py", line 385, in docmd
    return self.getreply()
  File "/usr/lib/python2.7/smtplib.py", line 358, in getreply
    + str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [Errno 104] Connection reset by peer

我不知道如何解决这个问题。
这是根据Nathan的建议,使用set_debuglevel(1)输出的结果:
send: 'ehlo [127.0.1.1]\r\n'
reply: '250-BLU0-SMTP190.blu0.hotmail.com Hello [my-ip-address]\r\n'
reply: '250-TURN\r\n'
reply: '250-SIZE 41943040\r\n'
reply: '250-ETRN\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-DSN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-8bitmime\r\n'
reply: '250-BINARYMIME\r\n'
reply: '250-CHUNKING\r\n'
reply: '250-VRFY\r\n'
reply: '250-TLS\r\n'
reply: '250-STARTTLS\r\n'
reply: '250 OK\r\n'
reply: retcode (250); Msg: BLU0-SMTP190.blu0.hotmail.com Hello [my-ip-address]
TURN
SIZE 41943040
ETRN
PIPELINING
DSN
ENHANCEDSTATUSCODES
8bitmime
BINARYMIME
CHUNKING
VRFY
TLS
STARTTLS
OK
send: 'STARTTLS\r\n'
Traceback (most recent call last):
  File "sendemail.py", line 24, in <module>
    smtp.starttls()
  File "/usr/lib/python2.7/smtplib.py", line 636, in starttls
    (resp, reply) = self.docmd("STARTTLS")
  File "/usr/lib/python2.7/smtplib.py", line 385, in docmd
    return self.getreply()
  File "/usr/lib/python2.7/smtplib.py", line 358, in getreply
    + str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [Errno 104] Connection reset by peer

你尝试过 smtp.set_debuglevel(1) 吗?这样你可能会得到更有用的输出。 - Nathan Villaescusa
在主贴中粘贴了set_debuglevel(1)的输出 - koogee
3个回答

17

尝试一下这个

import email
import smtplib

msg = email.message_from_string('warning')
msg['From'] = "example1@hotmail.fr"
msg['To'] = "example2@hotmail.fr"
msg['Subject'] = "helOoooOo"

s = smtplib.SMTP("smtp.live.com",587)
s.ehlo() # Hostname to send for this command defaults to the fully qualified domain name of the local host.
s.starttls() #Puts connection to SMTP server in TLS mode
s.ehlo()
s.login('example1@hotmail.fr', 'pass')

s.sendmail("example1@hotmail.fr", "example2@hotmail.fr", msg.as_string())

s.quit()

10
你应该解释为什么你的代码可以解决提问者的问题。 - morkro

1

看起来你的代码在尝试启动TLS (smtp.starttls()) 时出现了错误。我刚刚测试了 smtp.live.com,并且能够到达你尝试登录的代码行,所以可能是由于你的网络设置造成的。

这与此无关,但根据 smtplib 文档,你必须在消息开头添加 fromto 地址头:

parts = ("From: " + from_addr,
         "To: " + to_addr,
         "Subject: " + subject,
         "",
         message)    
msg = '\r\n'.join(parts)

添加了 msg = "To:%s\nFrom:%s\nSubject: %s\n\n%s" % (to_addr, from_addr, subject, message) 并更改了 smtp.sendmail(from_addr, to_addr, msg)。仍然出现相同的错误 :( - koogee
基本上是一个运行Samba的Ubuntu文件服务器,连接到路由器。我没有设置任何邮件服务器或对网络进行任何特殊更改。我关闭了防火墙以查看是否导致问题。仍然无法使用Hotmail进行身份验证。但可以通过Web浏览器进行身份验证。 - koogee

1

使用smtp-mail.outlook.com作为邮件服务器。我测试过了,它可以工作,而不是smtp.live.com。否则,代码的其余部分都很好。虽然Gmail不允许以这种方式发送邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接