python smtplib 发送邮件失败

-1 投票
2 回答
4351 浏览
提问于 2025-04-17 16:25
import smtplib

fromaddress = 'me@example.com'
toaddress = [fromaddress]
message = """
From: %s
To: %s
Subject: test

Hello

Goodbye
""" % ( fromaddress, toaddress)

server = smtplib.SMTP('mydomain.com') 
server.set_debuglevel(1) 
server.sendmail(fromaddress, toaddress, message) 

这段代码可以正常打开一个连接,但在发送邮件时却出现了“连接意外关闭”的错误。根据查看smtplib的源代码,这个错误发生在SMTP服务器返回了一个空的响应。

我在这段代码中漏掉了什么呢?我是在一个便宜的网络主机上运行这个代码,作为一个CGI脚本,他们的服务里已经安装了sendmail和Python服务。在他们的文档中,有一个标准的“用PHP发送邮件”的代码示例,不需要身份验证,所以我想用Python也应该可以这样做。

有没有人能给点建议?这个主机是hostgator,如果有帮助的话。

编辑:

根本的错误是SMTP服务器发出了一个强制重置,也就是TCP的“连接被对方重置”。在什么情况下邮件服务器会这样做呢?

2 个回答

2

我觉得toaddress应该是一个列表。

fromaddress = 'me@example.com'
toaddress = [fromaddress]
2

你正在尝试通过SMTP发送邮件,这通常需要一些认证,比如用户名和密码。如果你不进行认证,或者你的IP地址在短时间内认证失败太多次,大多数SMTP服务器会立即断开连接。

通过调用 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]),你是在尝试连接到 mydomain.com。大多数网络托管服务会有一个集中管理的邮件系统(SMTP / IMAP),这个系统和其他服务是分开的。

我有一段时间没有调试SMTP的东西了(或者在Python下使用SMTP),但你可以通过进入你的网络托管服务,使用 telnet mydomain.com 25 来看看SMTP服务器是否愿意接受你的连接,或者它是否根本不理你。

你也可以尝试在你的网络托管服务上运行 phpinfo(),看看他们是否有任何特别的SMTP认证功能。

除此之外,我建议你尝试将消息通过sendmail(兼容)程序发送,让服务器来处理SMTP。

大概会像这样……

p= os.popen( "/usr/sbin/sendmail -t -i -f" , "w" )
p.write(message)
status = p.close()
if status :
    raise RuntimeError("Could not excecute sendmail properly")

撰写回答