Sendmail Errno [61] Соединение Отказано

Я пытаюсь получить приложение для отправки некоторого выводимого текста на электронную почту. Для упрощения я выделил script:

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

Этот script выдает:

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
</module>

Итак, как вы можете видеть, соединение отказывается. Я запускаю Python 2.6 на Mac OS X Snow Leopard (если это необходимо).

Я пробовал много искать, но не смог найти решение. Любая помощь будет оценена.

6 ответов

Я предполагаю, что у вас нет SMTP-сервера, установленного на вашей локальной машине.

Если ваши электронные письма не чувствительны, откройте учетную запись Gmail и отправьте свои письма с помощью Python.


Если вы запустите локальный сервер следующим образом:

python -m smtpd -n -c ОтладкаServer localhost: 1025

Обязательно измените код отправки почты, чтобы использовать нестандартный номер порта:

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


Запустите простой SMTP-сервер с Python следующим образом:

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


Если вы не хотите запускать отдельный сервер, и если вы используете Unix, вы можете использовать эту технику, скопированную из http://www.yak.net/fqa/84.html, и изначально из FAQ Python:

В Unix это очень просто, используя sendmail. Расположение программы sendmail варьируется между системами; иногда это /usr/lib/sendmail, sometime/usr/sbin/sendmail. Страница руководства sendmail поможет вам. Вот пример кода:

SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
p = os.popen("%s -t" % SENDMAIL, "w")
p.write("To: [removed_email]\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


Если вы root в вашей системе, вы можете установить opensmtpd. Во-первых, вам не нужно запускать сервер вручную (эта услуга включена по умолчанию, поэтому после smtpd установка либо запустит ее вручную, либо перезагрузите компьютер). Во-вторых, вам не нужно менять строку server = smtplib.SMTP(SERVER). В заключение используйте yum install opensmtpd или эквивалентную команду apt-get.


По какой-то причине мне было сложно передать сервер и порт конструктору, но не функцию подключения. Это закончилось для меня работой:

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

licensed under cc by-sa 3.0 with attribution.