2011-04-11 141 views
28

我一直在试图让我的应用程序邮寄一些输出的文本到电子邮件。为了简化我已经分离出的脚本:Sendmail Errno [61]拒绝连接

import smtplib 
import sys 
import os 

SERVER = "localhost" 

FROM = os.getlogin() 
TO = [raw_input("To : ")] 

SUBJECT = "Message From " + os.getlogin() 

print "Message : (End with ^D)" 
TEXT = '' 
while 1: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    TEXT = TEXT + line 

# Prepare actual message 

message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT) 

# Send the mail 

server = smtplib.SMTP(SERVER) 
server.sendmail(FROM, TO, message) 
server.quit() 

此脚本输出:

Traceback (most recent call last): 
    File "/Users/christianlaustsen/Dropbox/Apps - Python/mail/smtplib_mail.py", line 32, in <module> 
    server = smtplib.SMTP(SERVER) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 239, in __init__ 
    (code, msg) = self.connect(host, port) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 295, in connect 
    self.sock = self._get_socket(host, port, self.timeout) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/smtplib.py", line 273, in _get_socket 
    return socket.create_connection((port, host), timeout) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 512, in create_connection 
    raise error, msg 
error: [Errno 61] Connection refused 

所以你可以看到,连接被拒绝。我在Mac OS X Snow Leopard上运行Python 2.6(如果这是相关的)。

我尝试了很多搜索,但一直未能找到解决方案。任何帮助将不胜感激。

+2

你在调试的第一步...转到壳型“远程登录本地主机25”如果不工作,问题并不在SO – 2011-04-11 10:31:31

+3

@MikePennington或他们属于可以使用Gabriel的答案,这非常有帮助。 ;) – Adam 2013-08-22 21:29:40

回答

14

我的猜测是你没有在本地机器上安装任何SMTP服务器。

如果您的邮件不敏感,请打开一个Gmail帐户并登录send your emails using it with Python

+0

谢谢,我只是踩踏了(不知道那么多关于smtp),因为我可以用sendmail和os.popen发送邮件,我不明白为什么这会有什么不同,但你的答案澄清它我猜:)...谢谢... – Tehnix 2011-04-11 10:53:49

10

开始使用Python简单的SMTP服务器,像这样:

python -m smtpd -n -c DebuggingServer localhost:1025 
51

如果你启动一个本地服务器,如下所示:

蟒蛇-m -n的smtpd -c DebuggingServer本地主机:1025

确保修改邮件发送代码以使用非标准端口号:

server = smtplib.SMTP(SERVER, 1025) 
server.sendmail(FROM, TO, message) 
server.quit() 
3

如果你不希望运行一个单独的服务器,如果你只使用Unix的,你可以使用这个技术,复制从http://www.yak.net/fqa/84.html,并且最初从Python FAQ:

在Unix上,这很简单,使用sendmail。 sendmail程序的位置因系统而异;有时它是/ usr/lib/sendmail,有时是/ usr/sbin/sendmail。 sendmail手册页将帮助你。下面是一些示例代码:

SENDMAIL = "/usr/sbin/sendmail" # sendmail location 
import os 
p = os.popen("%s -t" % SENDMAIL, "w") 
p.write("To: [email protected]\n") 
p.write("Subject: test\n") 
p.write("\n") # blank line separating headers from body 
p.write("Some text\n") 
p.write("some more text\n") 
sts = p.close() 
if sts != 0: 
    print "Sendmail exit status", sts 
0

如果您的系统上的根,那么你可能要安装opensmtpd。首先,您不需要手动运行服务器(此服务在默认情况下处于启用状态,因此安装smtpd后,可以手动启动或重新启动计算机)。其次,你不需要改变行server = smtplib.SMTP(SERVER)。总之,使用yum install opensmtpd或等效的apt-get命令。

0

无论出于何种原因,我很难将服务器和端口传递给构造函数,而不是连接函数。这结束了对我的工作:

s = smtplib.SMTP(timeout=30) #seconds 
    s.connect(EMAIL_HOST, EMAIL_PORT) 
    m = MIMEText('see subject') 
    m['subject'] = 'sweet subject' 
    m['from'] = EMAIL_FROM 
    m['to'] = to_list # comma-separated list of emails 
    s.sendmail(m['from'], m['to'].split(','), m.as_string()) 
    s.quit()