PDA

Просмотр полной версии : smtp отправка почты - AUTH LOGIN - ошибка 500 ((


isqad88
17.01.2010, 18:12
Здравствуйте вот написал на Visual C++ 6.0 пример отправки почты на mail.ru:
#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 - сервак ругается на не правильную команду ((( подскажите как решить эту проблему???

Spy2ex
17.01.2010, 18:28
У тебя буффер один под запрос и ответ. text[]
либо обнуляй после каждого запроса -ответа, либо введи дополнительный.

isqad88
17.01.2010, 19:23
У тебя буффер один под запрос и ответ. text[]
либо обнуляй после каждого запроса -ответа, либо введи дополнительный.

#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

RaX
17.01.2010, 20:24
У многих smtp серверов (а особенно для мэйла, рамблера, гугла) для отправки сообщения нужно авторизироваться по POP3 протоколу, иначе было бы очень легко вводить произвольный адрес отправителя. Добавь сюда соединение на порт 110 и авторизируйся на ящик, с которого отправляешь.

Spy2ex
17.01.2010, 20:37
нужно подключаться, не на 25 порт а на 2525 в мейл.ру так, рабочий код.

#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;
}

isqad88
17.01.2010, 21:04
нужно подключаться, не на 25 порт а на 2525 в мейл.ру так, рабочий код.

#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 авторизацию, пишет вообще ошибку не известная команда ""

RaX
17.01.2010, 21:14
Вообще ошибка 554 "Ошибка синхронизации"

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

я уже выкладывал исходник отправки сообщения с регистрацией, правда код на Delphi:
http://forum.antichat.ru/thread76601.html

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

slesh
17.01.2010, 21:55
strcpy(sen, "AUTH LOGIN\r\n");
send(s, sen, sizeof(sen), 0);

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

isqad88
18.01.2010, 09:33
#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:user@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, "RCPT TO:user2@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, "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:user@mail.ru\r\nto:user2@mail.ru\r\nsubject:H ello\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;
}
ТЕПЕРЬ ВСЕ РАБОТАЕТ!!! СПАСИБО ВСЕМ!!!

RaX
18.01.2010, 10:34
Всегда с обычных смпт серверов нужно делать авторизацию, иначе они не отправят ничего.
Тогда адрес отправителя можно было бы произвольный выбирать ;)

isqad88
18.01.2010, 11:05
Спасибо большое, есть еще вопрос:

у меня стоит например задача - найти папку "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">
этой функции, подскажите, как же все таки правильно сделать??

RaX
18.01.2010, 11:14
может заюзать другие строки? они вроде в модуле string.h, точно не помню.

sn0w
18.01.2010, 13:22
вообщето твой конпелятор хочет юникодную строкую...
чтобы этого не было, зайди project-> xxx properties-> Configuration properties: Character Set: Use Multibyte Character Set.

по русски это чтото вроде - проект - параметры(свойства) ххх - параметры(свойства) конфигурации: набор символов: использовать многобайтный(или вообщем не юникод) набор символов

isqad88
18.01.2010, 13:33
Спасибо! Помогло )))

isqad88
18.01.2010, 13:44
#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 .

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

sn0w
18.01.2010, 15:32
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