5

exim4 からのこの拒否エラーに真っ先に遭遇しました。

2010-02-15 01:46:05 SMTP プロトコル同期エラー (挨拶を待たずに入力が送信されました): H=ender からの接続が拒否されました [192.168.20.49] 入力="HELO 192.168.20.49\r\n"

次のように、同期を強制しないように exim4 構成を変更しました。

 smtp_enforce_sync='false'
 acl_smtp_connect = nosync nosync:
         control = no_enforce_sync
         accept

しかし、それは問題ではないようです。そもそもなぜ私が 554 を手に入れたのか、私にはあまり意味がありません。HELO を送信し、応答を待ち、その最中に何とか「554 エラー」を生成することができました。

以下のコードで何が間違っているのでしょうか。これにより、99% の確率で失敗します (はい、2 回機能しました)。はい、ソケットがブロックされています。recv で約 5 秒間、拒否を待っています。それが機能した2回で、まったく一時停止しませんでした。

HELO の代わりに EHLO を送信しようとしましたが、うまくいきません。私は、telnet セッションに接続して HELO と言うのに苦労したことさえありました。ただし、python smtp (別のマシンから) を使用して、この同じサーバーに対して問題なくメールを送信できます。

        hSocket = _connectServerSocket(server, port);    
    if (hSocket != INVALID_SOCKET) {        
        BYTE        sReceiveBuffer[4096];
        int            iLength = 0;
        int            iEnd = 0;
        char        buf[4096];

        strcpy(buf, "HELO ");
        strcat(buf, "192.168.20.49");
        strcat(buf, "\r\n");
        printf("%s", buf);
        if (send(hSocket, (LPSTR)buf, strlen(buf), NO_FLAGS) == SOCKET_ERROR) {
            printf("Socket send error: %d\r\n", WSAGetLastError());    
            return (false);
        }
        iLength = recv(hSocket, 
                       (LPSTR)sReceiveBuffer+iEnd,sizeof(sReceiveBuffer)-iEnd, 
                        NO_FLAGS);
        iEnd += iLength;
        sReceiveBuffer[iEnd] = '\0';
4

1 に答える 1

6

コードは220、HELO メッセージを送信する前に、smtp サーバーからの行を待機する必要があります。RFC 2821のセクション 3.1 を参照してください。それはおそらく Python ライブラリが行うことです。

libsmtpなど、これに役立つ無料のライブラリがいくつかあるはずです。独自のソリューションにパッチを適用するのではなく、これらのいずれかを学習することに時間を費やすことを検討してください (プロジェクトが独自のメール ソリューションを作成する場合を除きます)。

于 2010-02-15T08:22:53.320 に答える