554 Ошибка синхронизации SMTP с exim4 и моим кодом - PullRequest
4 голосов
/ 15 февраля 2010

Я столкнулся лицом к лицу с этой ошибкой отклонения из exim4:

2010-02-15 01:46:05 Ошибка синхронизации протокола SMTP (вход отправлен без ожидания приветствия): отклонено соединение от H = ender [192.168.20.49] input = "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% случаев (да, это сработало дважды). Да, сокет блокируется, я вешаю в recv ~ 5 секунд в ожидании отклонения. В 2 раза, когда это сработало, оно вообще не останавливалось.

Я попытался отправить EHLO вместо HELO, не повезло. У меня даже было горе от того, что я подключился к телнет-сеансу и сказал 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';

1 Ответ

5 голосов
/ 15 февраля 2010

Ваш код должен ждать строки 220 от сервера smtp перед отправкой сообщения HELO. См. Раздел 3.1 из RFC 2821 . Это, вероятно, то, что делает библиотека Python.

Должно быть несколько бесплатных библиотек, которые могут помочь вам в этом, например libsmtp . Подумайте о том, чтобы потратить время на изучение одного из них, а не на исправление собственного решения (если ваш проект не заключается в написании собственного почтового решения).

...