3

Linuxで、smtpd.SMTPServerを使用して電子メールを受信する小さなアプリケーションがあります。小さなテストコードは次のとおりです。

class CustomSMTPServer(smtpd.SMTPServer):

    def process_message(self, peer, mailfrom, rcpttos, data):
        print 'Receiving message from:', peer
        print 'Message addressed from:', mailfrom
        print 'Message addressed to  :', rcpttos
        print 'Message length        :', len(data)
        return

server = CustomSMTPServer(('0.0.0.0', 25), None)
asyncore.loop()

次の問題があります。(1)このコードを使用すると、電子メールを送信するコンピューターに次のメッセージが表示されます。502エラー:コマンド「EHLO」が実装されていないため、サーバーが正しく応答してさらにデータを受信したり、電子メールと通信したりできません。 -送信コンピュータ(私はクライアントだと思います)。

そもそもEHLOのような基本的なものをUbuntuのインストールに実装すべきではないでしょうか?なぜ実装されないのですか?

(2)UbuntuにpostfixをインストールすることでEHLOをインストールできると思いました。私はそれを行い、同じテスト呼び出しが続行されましたが、後で別のエラーで停止しました:

Client: RCPT TO: XXX@YYY.com
Server: 554 5.7.1 <XXX@YYY>: Relay access denied

(3)後で、他のいくつかのテストを行った後、テストコード自体からエラーが発生しました。

error: [Errno 98] Address already in use

で見られるように、使用されたIPアドレスはすでに使用されていたことがわかります

netstat -lnpt

そのうちのケースは実行中の接尾辞でした。postfixサービスを停止した後、アドレスは使用されなくなりましたが、もちろん問題#1に戻りました。

502 Error: command "EHLO" not implemented

SMTPServerを使用して電子メールメッセージを受信できるようにしたいと思います1.postfixをインストールする必要なしに2.非同期を使用して

Pythonライブラリを使用してこれを簡単かつ簡単な方法で可能にする方法についてのアイデアがあれば、それは素晴らしいことです!

乾杯アレックス

4

2 に答える 2

4

smtpd1)PostfixはSMTPサーバーであり、PythonのEHLO実装とは何の関係もありません。カスタムSMTPサーバーが必要な場合は、postfixは必要ないので、自由に削除してください。

2)EHLOESMTPコマンドでありSMTP、標準のsmtpdpythonモジュールが実装SMTPするものではないため、実装はありませんEHLO

于 2012-08-08T18:29:53.813 に答える
0

これを試して。もちろん、EHLOコマンドは実装していませんが、HELOコマンドと同じように扱います。もちろん、最初の障害を乗り越えるだけかもしれませんが、残りのSMTPコマンドに互換性がある場合は、次の方法で解決できる可能性があります。

smtpd.pyファイルはおそらく/usr/lib/python2.7にあります。

def smtp_HELO(self, arg):
    if not arg:
        self.push('501 Syntax: HELO hostname')
        return
    if self.__greeting:
        self.push('503 Duplicate HELO/EHLO')
    else:
        self.__greeting = arg
        self.push('250 %s' % self.__fqdn)

#copy the above function and rename it smtp_EHLO

def smtp_EHLO(self, arg):
    if not arg:
        self.push('501 Syntax: HELO hostname')
        return
    if self.__greeting:
        self.push('503 Duplicate HELO/EHLO')
    else:
        self.__greeting = arg
        self.push('250 %s' % self.__fqdn)

また、同じライブラリのpython3.5バージョンはEHLOをサポートしているように見えるので、python3を試して使用することもできます。しかし、どうやらpython3は下位互換性がないようです-幸運を祈ります。

于 2017-09-06T10:02:52.780 に答える