2010-02-15 9 views
1

Я бежал с головой в этот отклонять ошибку от exim4:554 SMTP ошибки синхронизации с exim4 и моим кодом

2010-02-15 1:46:05 SMTP ошибки синхронизации протокола (вход отправлен, не дожидаясь приветствий): отверг соединение от H = Эндер [192.168.20.49] вход = "HELO 192.168.20.49 \ г \ п"

Я изменил мой exim4 конфигурации, чтобы не применять синхронизацию, например, так:

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

Но что кажется, не имеет значения. То, что имеет для меня меньше смысла, - это то, почему я получаю 554 в первую очередь. Я посылаю HELO, я жду ответа, и как-то посреди этого, мне удается генерировать «Ошибка 554»

Что я делаю неправильно в приведенном ниже коде, что заставляет это терпеть неудачу 99% времени (да, он работал дважды). Да, сокет блокируется, я вишу в recv в течение ~ 5 секунд, ожидая отклонения. В 2 раза, когда он сработал, он не остановился вообще.

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

Я бесстыдно украл код с http://www.codeproject.com/KB/IP/zsmtp.aspx?msg=1332673#xx1332673xx Я пытаюсь получить одну из моих тестовых программ, чтобы отправить мне по электронной почте, когда это законченный! – boatcoder

ответ

2

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

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

+0

Я нашел этот код по ссылке выше. Большинство smtp-библиотек, похоже, очень трудны для работы под окнами. Спасибо, что поднялись на 220, ПЕРЕД Я отправляю HELO, я пропустил это в спецификации. Я очистил этот код, и я, вероятно, опубликую его в комментариях к этой статье. – boatcoder

+0

Большое спасибо за вас! –