web-dev-qa-db-ja.com

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を実行しています(関連する場合)。

私はよく検索してみましたが、解決策を見つけることができませんでした。任意の助けをいただければ幸いです。

35
Tehnix

私の推測では、ローカルマシンにSMTPサーバーがインストールされていません。

メールが機密事項でない場合は、Gmailアカウントを開き、 Pythonでそれを使用してメールを送信します

16
Adam Matan

次のようにローカルサーバーを起動する場合:

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

非標準のポート番号を使用するようにメール送信コードを必ず変更してください。

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

PythonのようにシンプルなSMTPサーバーを起動します:

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

別のサーバーを実行したくない場合、および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
4

コピーして貼り付けて動作させるために何かを作成したかったのですが、これが私が最も近いものです:

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('[email protected]', 'password_for_gmail')
    msg = EmailMessage()
    msg.set_content(message)

    msg['Subject'] = 'TEST'
    msg['From'] = '[email protected]'
    msg['To'] = destination
    server.send_message(msg)

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

チュートリアルは、電子メールを送信する実行中のサーバーが既にあることを十分に伝えることなく想定しているため、誤解を招くと感じています...奇妙なことです。私のスクリプトの唯一の問題は、クリアテキストのパスワードをそこに書かなくても機能させる方法がわからないということですが、残念ながら...少なくとも送信しますか?偽のメールアドレスなどを作成するだけです...

1
Charlie Parker

なんらかの理由で、サーバーとポートをコンストラクターに渡すことは困難でしたが、接続関数はできませんでした。これは私のために働いてしまいました:

    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
Blaskovicz

システムのルートである場合は、opensmtpdをインストールできます。まずこの方法では、サーバーを手動で実行する必要はありません(このサービスはデフォルトで有効になっているため、smtpdインストール後に手動で起動するか、マシンを再起動します)。第二に、server = smtplib.SMTP(SERVER)行を変更する必要はありません。最後に、yum install opensmtpdまたは同等のapt-getコマンドを使用します。

0
e271p314