Здравствуйте вот написал на 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 - сервак ругается на не правильную команду ((( подскажите как решить эту проблему???
У тебя буффер один под запрос и ответ. text[] либо обнуляй после каждого запроса -ответа, либо введи дополнительный.
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
У многих smtp серверов (а особенно для мэйла, рамблера, гугла) для отправки сообщения нужно авторизироваться по POP3 протоколу, иначе было бы очень легко вводить произвольный адрес отправителя. Добавь сюда соединение на порт 110 и авторизируйся на ящик, с которого отправляешь.
нужно подключаться, не на 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; }
Вообще ошибка 554 "Ошибка синхронизации" Пытаюсь пройти pop3 авторизацию, пишет вообще ошибку не известная команда ""
я уже выкладывал исходник отправки сообщения с регистрацией, правда код на Delphi: http://forum.antichat.ru/thread76601.html Там нужно делать 2 сокета, один для POP3, а другой для SMTP, причем закрывать оба только в конце, чтобы при отправке сообщения соединение по поп3 было открыто.
strcpy(sen, "AUTH LOGIN\r\n"); send(s, sen, sizeof(sen), 0); схерали sizeof???? ты отправляешь строку. ПО этому strlen
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; } ТЕПЕРЬ ВСЕ РАБОТАЕТ!!! СПАСИБО ВСЕМ!!!
Всегда с обычных смпт серверов нужно делать авторизацию, иначе они не отправят ничего. Тогда адрес отправителя можно было бы произвольный выбирать
Спасибо большое, есть еще вопрос: у меня стоит например задача - найти папку "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"> этой функции, подскажите, как же все таки правильно сделать??
вообщето твой конпелятор хочет юникодную строкую... чтобы этого не было, зайди project-> xxx properties-> Configuration properties: Character Set: Use Multibyte Character Set. по русски это чтото вроде - проект - параметры(свойства) ххх - параметры(свойства) конфигурации: набор символов: использовать многобайтный(или вообщем не юникод) набор символов
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 . Что ж опять не так?
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