2011-04-11 183 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() 
相關問題