Sendmail Errno [61] Соединение отклонено - PullRequest
34 голосов
/ 11 апреля 2011

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

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

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

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

Ответы [ 7 ]

56 голосов
/ 15 сентября 2011

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

python -m smtpd -n -c Локальный хост DebuggingServer: 1025

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

server = smtplib.SMTP(SERVER, 1025)
server.sendmail(FROM, TO, message)
server.quit()
16 голосов
/ 11 апреля 2011

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

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

12 голосов
/ 26 августа 2011

Запустите простой SMTP-сервер с Python, например:

python -m smtpd -n -c DebuggingServer localhost:1025
4 голосов
/ 06 ноября 2013

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

В 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: cary@ratatosk.org\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
1 голос
/ 02 мая 2018

Я хотел создать что-то, чтобы вы могли просто скопировать, вставить и заставить это работать, но это самое близкое, что я получил:

from email.message import EmailMessage
import smtplib
import os

def send_email(message,destination):
    # important, you need to send it to a server that knows how to send e-mails for you
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    # don't know how to do it without cleartexting the password and not relying on some json file that you dont git control...
    server.login('valid.username@gmail.com', 'password_for_gmail')
    msg = EmailMessage()
    msg.set_content(message)

    msg['Subject'] = 'TEST'
    msg['From'] = 'valid.username@gmail.com'
    msg['To'] = destination
    server.send_message(msg)

if __name__ == '__main__':
    send_email('msg','destination@email')

Я чувствую, что учебник вводит в заблуждение, потому что он предполагает, не говоря вам очень хорошо, что у вас уже есть работающий сервер, который отправляет вам электронные письма ... это странно. Единственная проблема с моим сценарием заключается в том, что я не знаю, как заставить его работать, не имея только что записанного пароля в виде открытого текста, но, увы ... по крайней мере, он его отправляет? Просто сделайте фальшивый адрес электронной почты или что-то ...

0 голосов
/ 24 августа 2016

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

    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()
0 голосов
/ 22 апреля 2014

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

...