smtp отправка почты - AUTH LOGIN - ошибка 500 ((

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by isqad88, 17 Jan 2010.

  1. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте вот написал на Visual C++ 6.0 пример отправки почты на mail.ru:
    Code:
    #include <iostream>
    #include <winsock2.h>
    
    using namespace std;
    
    int main()
    {
    	int err;
    	
    	WSADATA wsaData;
    	SOCKET s;
    	hostent *d_addr;
    	struct sockaddr_in addr;
    	char text[1024];//áóôåð äàííûõ
    	
    	err = WSAStartup(MAKEWORD(1, 1), &wsaData);
    	if(err != 0)
    	{
    		cout<<"Error: "<<err<<"\n";
    		return 1;
    	}
    	
    
    	cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
    	//Ñîçäàíèå ñîêåòà
    	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(s == INVALID_SOCKET)
    	{
    		cout<<"Invalid socket\n";
    		return 1;
    	}
    	//ïîëó÷åíèå àäðåñà ñåðâåðà
    	d_addr = gethostbyname("smtp.mail.ru");
    	if(d_addr == NULL)
    	{
    		cout<<"Error gethostbyname\n";
    		return 1;
    	};
    	//ñîåäèíÿåìñÿ
    	
    	addr.sin_family = AF_INET;//òèï TCP/IP
    	addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    	addr.sin_port = htons (25);
    	//connect
    	if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
    	{
    		cout<<"Error in connect\n";
    		return 1;
    	} else
    	{
    		cout<<"YsneLIIHoe coegunenue\n";
    	}
    	//ïîëó÷àåì äàííûå îò ñåðâåðà
    	recv(s, text, sizeof(text), 0);
    	cout<<"Recive - "<<text<<"\n";
    	//Ïðèâåòñòâóåì ñåðâåð
    	
    	strcpy(text, "EHLO smtp.mail.ru\r\n");
    	send(s, text, sizeof(text), 0);
    	cout<<"Send - "<<text<<"\n";
    
    	recv(s, text, sizeof(text), 0);
    	cout<<"Recive - "<<text<<"\n";
    	//àâòîðèçàöèÿ íà ñåðâåðå
    	//memset(text, 0, sizeof(text));
    	strcpy(text, "AUTH LOGIN\r\n");
    	send(s, text, sizeof(text), 0);
    	cout<<sizeof(text)<<"\n";
    	cout<<"Send - "<<text<<"\n";
    	recv(s, text, sizeof(text), 0);
    	cout<<"Recive - "<<text<<"\n";
    
    
    	closesocket(s);
    	WSACleanup();
    
    
    
    	
    	
    	return 0;
    }
    проблема в том что дойдя до строки AUTH LOGIN - сервак ругается на не правильную команду ((( подскажите как решить эту проблему???
     
  2. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    У тебя буффер один под запрос и ответ. text[]
    либо обнуляй после каждого запроса -ответа, либо введи дополнительный.
     
  3. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Code:
    #include <iostream>
    #include <winsock2.h>
    
    using namespace std;
    
    int main()
    {
    	int err;
    	
    	WSADATA wsaData;
    	SOCKET s;
    	hostent *d_addr;
    	struct sockaddr_in addr;
    	char rec[1024];//áóôåð âõîäíûõ ñîîáùåíèé
    	char sen[1024];//áóôåð èñõ ñîîáùåíèé
    	
    	err = WSAStartup(MAKEWORD(1, 1), &wsaData);
    	if(err != 0)
    	{
    		cout<<"Error: "<<err<<"\n";
    		return 1;
    	}
    	
    
    	cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
    	//Ñîçäàíèå ñîêåòà
    	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(s == INVALID_SOCKET)
    	{
    		cout<<"Invalid socket\n";
    		return 1;
    	}
    	//ïîëó÷åíèå àäðåñà ñåðâåðà
    	d_addr = gethostbyname("smtp.mail.ru");
    	if(d_addr == NULL)
    	{
    		cout<<"Error gethostbyname\n";
    		return 1;
    	};
    	//ñîåäèíÿåìñÿ
    	
    	addr.sin_family = AF_INET;//òèï TCP/IP
    	addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    	addr.sin_port = htons (25);
    	//connect
    	if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
    	{
    		cout<<"Error in connect\n";
    		return 1;
    	} else
    	{
    		cout<<"YsneLIIHoe coegunenue\n";
    	}
    	memset(rec, 0, sizeof(rec));
    	memset(sen, 0, sizeof(sen));
    	//ïîëó÷àåì äàííûå îò ñåðâåðà
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	//î÷èñòêà
    	memset(rec, 0, sizeof(rec));
    	//Ïðèâåòñòâóåì ñåðâåð
    	
    	strcpy(sen, "HELO smtp.mail.ru\r\n");
    	send(s, sen, sizeof(sen), 0);
    	cout<<sen<<"\n";
    	//î÷èñòêà
    	memset(sen, 0, sizeof(sen));
    
    
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    	//àâòîðèçàöèÿ íà ñåðâåðå
    	
    	strcpy(sen, "AUTH LOGIN\r\n");
    	send(s, sen, sizeof(sen), 0);
    	cout<<sen<<"\n";
    	//î÷èñòêà
    	memset(sen, 0, sizeof(sen));
    	
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    
    	closesocket(s);
    	WSACleanup();
    
    
    
    	
    	
    	return 0;
    }
    Вот ввел два буфера, и все равно сервак ругается на не правильную команду 500 (( дело в AUTH LOGIN
     
  4. RaX

    RaX Member

    Joined:
    7 Jun 2008
    Messages:
    34
    Likes Received:
    34
    Reputations:
    0
    У многих smtp серверов (а особенно для мэйла, рамблера, гугла) для отправки сообщения нужно авторизироваться по POP3 протоколу, иначе было бы очень легко вводить произвольный адрес отправителя. Добавь сюда соединение на порт 110 и авторизируйся на ящик, с которого отправляешь.
     
  5. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    нужно подключаться, не на 25 порт а на 2525 в мейл.ру так, рабочий код.
    Code:
    #include <iostream>
    #include <winsock2.h>
    
    using namespace std;
    
    int main()
    {
    	int err;
    	
    	WSADATA wsaData;
    	SOCKET s;
    	hostent *d_addr;
    	struct sockaddr_in addr;
    	char rec[1024];//áóôåð âõîäíûõ ñîîáùåíèé
    	char sen[1024];//áóôåð èñõ ñîîáùåíèé
    	
    	err = WSAStartup(MAKEWORD(1, 1), &wsaData);
    	if(err != 0)
    	{
    		cout<<"Error: "<<err<<"\n";
    		return 1;
    	}
    	
    
    	cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
    	//Ñîçäàíèå ñîêåòà
    	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(s == INVALID_SOCKET)
    	{
    		cout<<"Invalid socket\n";
    		return 1;
    	}
    	//ïîëó÷åíèå àäðåñà ñåðâåðà
    	d_addr = gethostbyname("smtp.mail.ru");
    	if(d_addr == NULL)
    	{
    		cout<<"Error gethostbyname\n";
    		return 1;
    	};
    	//ñîåäèíÿåìñÿ
    	
    	addr.sin_family = AF_INET;//òèï TCP/IP
    	addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    	addr.sin_port = htons (2525);
    	//connect
    	if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
    	{
    		cout<<"Error in connect\n";
    		return 1;
    	} else
    	{
    		cout<<"YsneLIIHoe coegunenue\n";
    	}
    	memset(rec, 0, sizeof(rec));
    	memset(sen, 0, sizeof(sen));
    	
    	 recv( s, rec, sizeof(rec)-1, 0 ); //I отвтет сервера
    
         strcpy(sen,"EHLO smtp.mail.ru\r\n");
         send(s,sen,strlen(sen),0); 
         recv( s, rec, sizeof(rec)-1, 0 );
    
         strcpy(sen,"AUTH LOGIN\r\n");
         send(s,sen,strlen(sen),0); 
         recv( s, rec, sizeof(rec)-1, 0 );
    
    
        closesocket(s);
    	WSACleanup();	
    	
    	return 0;
    }
    
     
  6. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Вообще ошибка 554 "Ошибка синхронизации"

    Пытаюсь пройти pop3 авторизацию, пишет вообще ошибку не известная команда ""
     
  7. RaX

    RaX Member

    Joined:
    7 Jun 2008
    Messages:
    34
    Likes Received:
    34
    Reputations:
    0
    я уже выкладывал исходник отправки сообщения с регистрацией, правда код на Delphi:
    http://forum.antichat.ru/thread76601.html

    Там нужно делать 2 сокета, один для POP3, а другой для SMTP, причем закрывать оба только в конце, чтобы при отправке сообщения соединение по поп3 было открыто.
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    strcpy(sen, "AUTH LOGIN\r\n");
    send(s, sen, sizeof(sen), 0);

    схерали sizeof???? ты отправляешь строку. ПО этому strlen
     
  9. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Code:
    #pragma comment(lib, "Ws2_32.lib")
    #include <iostream>
    #include <winsock2.h>
    
    
    using namespace std;
    
    
    
    int main()
    {
    	int err;
    	WSADATA wsaData;
    	SOCKET s;
    	SOCKET p;
    	hostent *d_addr;
    	struct sockaddr_in addr;
    	char rec[1024];
    
    	
    
    	err = WSAStartup(MAKEWORD(1,1), &wsaData);
    	if(err != 0)
    	{
    		cout<<"Error: "<<err<<"\n";
    		return 1;
    	}
    	p = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(p == INVALID_SOCKET)
    	{
    		cout<<"Invalid socket\n";
    	}
    	d_addr = gethostbyname("pop.mail.ru");
    	if(d_addr == NULL)
    	{
    		cout<<"Error gethostbyname\n";
    		return 1;
    	};
    	
    	addr.sin_family = AF_INET;
    	addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    	addr.sin_port = htons (110);
    	if(SOCKET_ERROR == (connect(p, (sockaddr *) &addr, sizeof (addr))))
    	{
    		cout<<"Error in connect\n";
    		return 1;
    	} else
    	{
    		cout<<"YsneLIIHoe coegunenue c pop.mail.ru\n";
    	}
    	
    	//создаем 2й сокет для smtp
    	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(s == INVALID_SOCKET)
    	{
    		cout<<"Invalid socket\n";
    	}
    	d_addr = gethostbyname("smtp.mail.ru");
    	if(d_addr == NULL)
    	{
    		cout<<"Error gethostbyname\n";
    		return 1;
    	};
    	
    	addr.sin_family = AF_INET;
    	addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    	addr.sin_port = htons (25);
    	if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
    	{
    		cout<<"Error in connect\n";
    		return 1;
    	} else
    	{
    		cout<<"YsneLIIHoe coegunenue c smtp.mail.ru\n";
    	}
    	recv(p, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    	//авторизуемся на pop
    	strcpy(rec,"USER user\r\n");
    	send(p, rec, strlen(rec),0);
    	cout<<rec<<"\n";
    	recv(p, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    
    	strcpy(rec,"PASS parol\r\n");
    	send(p, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(p, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    	//пробуем отправить сообщение
    	strcpy(rec, "HELO smtp.mail.ru\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    	strcpy(rec, "MAIL FROM:[email protected]\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    	strcpy(rec, "RCPT TO:[email protected]\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    	strcpy(rec, "DATA\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    	strcpy(rec, "from:[email protected]\r\nto:[email protected]\r\nsubject:Hello\r\nHello Andrew!!\r\n.\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	memset(rec, 0, sizeof(rec));
    
    	strcpy(rec, "QUIT\r\n");
    	send(s, rec, strlen(rec), 0);
    	cout<<rec<<"\n";
    	recv(s, rec, sizeof(rec), 0);
    	cout<<rec<<"\n";
    	
    
    
    
    
    
    
    
    
    
    
    
    
    
    	closesocket(p);
    	closesocket(s);
    	WSACleanup();
    
    	return 0;
    }
    ТЕПЕРЬ ВСЕ РАБОТАЕТ!!! СПАСИБО ВСЕМ!!!
     
  10. RaX

    RaX Member

    Joined:
    7 Jun 2008
    Messages:
    34
    Likes Received:
    34
    Reputations:
    0
    Всегда с обычных смпт серверов нужно делать авторизацию, иначе они не отправят ничего.
    Тогда адрес отправителя можно было бы произвольный выбирать ;)
     
  11. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Спасибо большое, есть еще вопрос:

    у меня стоит например задача - найти папку "My" на всех разделах, использую FindFirstFile("C:\\*", &FindFileData);

    в итоге компилятор ругается на первый параметр :
    <невозможно преобразовать параметр 1 из 'const char [5]' в 'LPCWSTR'
    1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
    1>Журнал построения был сохранен в "file://c:\Users\Andrew\Documents\Visual Studio 2008\Projects\findfile\findfile\Debug\BuildLog.htm"
    >
    этой функции, подскажите, как же все таки правильно сделать??
     
  12. RaX

    RaX Member

    Joined:
    7 Jun 2008
    Messages:
    34
    Likes Received:
    34
    Reputations:
    0
    может заюзать другие строки? они вроде в модуле string.h, точно не помню.
     
  13. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    вообщето твой конпелятор хочет юникодную строкую...
    чтобы этого не было, зайди project-> xxx properties-> Configuration properties: Character Set: Use Multibyte Character Set.

    по русски это чтото вроде - проект - параметры(свойства) ххх - параметры(свойства) конфигурации: набор символов: использовать многобайтный(или вообщем не юникод) набор символов
     
    #13 sn0w, 18 Jan 2010
    Last edited: 18 Jan 2010
  14. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Спасибо! Помогло )))
     
  15. isqad88

    isqad88 New Member

    Joined:
    16 Dec 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Code:
    #include <windows.h>
    #include <stdio.h>
    
    
    
    int main(int argc, char *argv[])
    {
      WIN32_FIND_DATA FindFileData;
      HANDLE hFind;
    
      printf ("Target file is %s.\n", argv[1]);
      hFind = FindFirstFile("C:\\Program Files\\*", &FindFileData);
      if (hFind == INVALID_HANDLE_VALUE) 
      {
        printf ("Invalid File Handle. GetLastError reports %d\n", 
                GetLastError ());
        return (0);
      } 
      else 
      {
    	  if((FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) && (FindFileData.cFileName != "."))
    	  {
    			printf ("Find Directory %s\n", FindFileData.cFileName);
    	  }
        FindClose(hFind);
        return (1);
      }
    }
    Не пойму...вроде все правильно, но выводит все равно Find Directory .

    Что ж опять не так?
     
  16. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    Code:
    	WIN32_FIND_DATA wfd;
    	HANDLE hFind;
    
    	hFind = FindFirstFile("*.*", &wfd);
    	char s_dir[] = "MyJopa";
    
    	do{
    		if(lstrcmpi(s_dir, wfd.cFileName)==0)
    			MessageBox(0,s_dir,"directory found",0);
    	}while(FindNextFile(hFind, &wfd));
    ммм?
    да, я б для поиска юзал не полный путь а переключение с помощью SetCurrentDirectory, если еще и рекурсивный поиск долж быть

    //// вот пример поиска файлов
    http://www.cyberguru.ru/cpp-sources/files-folders/poisk-fajlov.html
     
    #16 sn0w, 18 Jan 2010
    Last edited: 18 Jan 2010