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';