-1
import smtplib

fromaddress = 'me@example.com'
toaddress = [fromaddress]
message = """
From: %s
To: %s
Subject: test

Hello

Goodbye
""" % ( fromaddress, toaddress)

server = smtplib.SMTP('mydomain.com') 
server.set_debuglevel(1) 
server.sendmail(fromaddress, toaddress, message) 

このコードはソケットを正常に開きますが、sendmailで「接続が予期せず閉じられました」エラーで失敗します。smtplibソースを見ると、これはsmtpサーバーから空の応答が返されたときに発生します。

上記のコードには何が欠けていますか?私はこれを安価なウェブホスト上でcgiスクリプトとして実行しており、それらのサービスの一部として、sendmailおよびpythonサービスがインストールされています。彼らのドキュメントには、認証を必要としない標準の「phpでメールを送信する」コード例があるので、Pythonでも同じことが機能すると思います。

誰か洞察がありますか?役立つ場合、ホストはhostgatorです。

編集:

根本的なエラーは、SMTPサーバーがハードリセットを発行していることです。つまり、TCP「ピアによる接続のリセット」です。電子メールサーバーはどのような状況でこれを行いますか?

4

2 に答える 2

2

toaddress はリストであるべきだと思います。

fromaddress = 'me@example.com'
toaddress = [fromaddress]
于 2013-02-19T21:44:40.757 に答える
2

SMTP 経由で送信しようとしていますが、これは通常、何らかの認証 (ユーザー名 + パスワード) で実装されています。ほとんどの SMTP サーバーは、認証しない場合 (または IP アドレスが指定された間隔内で何度も認証に失敗した場合)、すぐに接続を切断します。

を呼び出すことsmtplib.SMTP([host[, port[, local_hostname[, timeout]]]])で、 への接続を開こうとしていますmydomain.com。ほとんどのウェブホストには、シェル システムとは別の集中メール システム ( SMTP / IMAP ) があります。

私はしばらくSMTPのものをデバッグしていません(またはPythonでSMTPを使用していました)が、Webホストに飛び込んでtelnet mydomain.com 25調べてみると、SMTPサーバーがあなたからの接続を受け入れても構わないと思っているかどうかを確認できます...または去るだけです。

また、ウェブホストで phpinfo() を実行して、特別な SMTP 認証機能が組み込まれているかどうかを確認することもできます。

それ以外では、メッセージを sendmail(互換) バイナリにパイプして、サーバーに SMTP を処理させることをお勧めします。

それはこのように見えるでしょう...

p= os.popen( "/usr/sbin/sendmail -t -i -f" , "w" )
p.write(message)
status = p.close()
if status :
    raise RuntimeError("Could not excecute sendmail properly")
于 2013-02-19T22:21:06.840 に答える