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

此代码可以打开一个套接字,但随后在 sendmail 上失败,并出现“连接意外关闭”错误。通过查看smtplib 源,当 smtp 服务器返回一个空响应时,就会发生这种情况。

我从上面的代码中遗漏了什么?我在一个便宜的虚拟主机上运行它作为一个 cgi 脚本,作为他们服务的一部分,他们安装了 sendmail 和 python 服务。在他们的文档中,他们有标准的“在 php 中发送电子邮件”代码示例,不需要身份验证,所以我认为同样适用于 python。

任何人有任何见解?如果有帮助,主机是hostgator。

编辑:

根本错误是 smtp 服务器发出硬重置,即 TCP 'Connection reset by peer'。电子邮件服务器在什么情况下会这样做?

4

2 回答 2

2

您正在尝试通过 SMTP 发送,这通常是通过某种身份验证(用户名 + 密码)实现的。如果您不进行身份验证(或者您的 IP 地址在给定时间间隔内身份验证失败次数过多),大多数 SMTP 服务器将立即终止连接。

通过调用smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]),您正在尝试打开与 的连接mydomain.com。大多数 webhosts 将有一个集中的邮件系统( SMTP / IMAP ),它也与 shell 系统分开。

我已经有一段时间没有调试过 SMTP 的东西了(或者在 Python 下使用过 SMTP),但是你可以通过跳转到 webhost 并做telnet mydomain.com 25这件事来看看 SMTP 服务器是否愿意接受你的连接......或者是刚离开。

您还可以尝试在您的网络主机上执行 phpinfo() 并查看它们是否内置了任何特殊的 SMTP 身份验证内容。

除此之外,我建议您尝试将消息传送到 sendmail(compatible) 二进制文件中,并让服务器处理 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")
于 2013-02-19T22:21:06.840 回答
2

我相信 toaddress 应该是一个列表。

fromaddress = 'me@example.com'
toaddress = [fromaddress]
于 2013-02-19T21:44:40.757 回答