[C++] Protokol SMTP - e-mail sending (HELO)

0

Witam,
jak najwiecej o problemie staralem sie powiedziec juz w samym tytule postu. Na poczatku powiem, ze uzywam kompilatora BCB 6. Aplikacja ma byc konsolowa bez zadnych udziwnien.

Pisze program, ktorego zadaniem bedzie wyslanie wiadomosci (na razie tylko tekstowej) na podanego (na razie wpisanego na sztywno w kodzie) maila.
Uzywam biblioteki Winsock. Polaczenie udaje sie nawiazac z serwerem. Jednak po wyslaniu "helo" (specyfikacja SMTP: http://tools.ietf.org/html/rfc2821) nie otrzymuje zadnej odpowiedzi ze strony serwera... Funkcja recv() oczekuje caly czas na reakcje i na nia sie nie moze doczekac. W koncu nastepuje przekroczenie limitu czasu...

I tutaj zwracam sie z pytaniem - gdzie jest luka w moim rozumowaniu? A moze inaczej co oznacza ten brak odpowiedzi ze strony serwera? Dodam, ze probowalem juz z kilkoma roznymi serwerami SMTP i w zasadzie wszedzie ten sam problem.

Dla osiagniecia wiekszej jednoznacznosci mojej wypowiedzi - ponizej dolaczam kod programu - byc moze sie tez komus przyda:

#include <stdlib.h>
#include <winsock.h>
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <conio.h>

using namespace std;

typedef DWORD(WINAPI *REGSERVPROC)(DWORD, DWORD);

int Welcome()
{
   system("cls");
}

void service() // Make Program a Service
{
   HINSTANCE hLibrary;
   REGSERVPROC regproc;
   hLibrary = LoadLibrary("kernel32.dll");
   regproc = (REGSERVPROC) GetProcAddress(hLibrary, "RegisterServiceProcess");
   if((int)GetVersion() < 0)
   regproc(NULL,1);
}

int main()
{
   char FromEmail[100];
   char ToEmail[100 ];
   char Body[100];
   Hotmail:
   system("cls");
   strcpy(ToEmail,"[email protected]");
   strcpy(FromEmail,"[email protected]");
   strcpy(Body,"info");
   #define host "smtp.wp.pl"
   cout<<"Target Email: '"<<ToEmail<<"'\n"<<endl;
   cout<<"Fake Email: '"<<FromEmail<<"'\n"<<endl;
   cout<<"Message: '"<<Body<<"'\n"<<endl;
   system("Pause");
   service();
   getch();
//---------------------------------------------------
   WORD sockV;
   WSAData wsaData;
   int nret;

   sockV = MAKEWORD(2, 2);
   WSAStartup(sockV, &wsaData);
   LPHOSTENT hostEntry;
   hostEntry = gethostbyname(host);
   printf("%s",hostEntry->h_name);
   if (!hostEntry)
   {
      MessageBox(0, "Error, cannot find host", "Fatal error", MB_OK);
      WSACleanup();
      return 0;
   }
   SOCKET CData;
   CData = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if(CData == INVALID_SOCKET)
   {
      MessageBox(0, "Could not start socket", "Fatal error", MB_OK);
      WSACleanup();
      return 0;
   }

   SOCKADDR_IN ServerInfo;
   ServerInfo.sin_family = AF_INET;
   ServerInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
   ServerInfo.sin_port = htons(25);
   nret = connect(CData, (LPSOCKADDR)&ServerInfo, sizeof(struct sockaddr));
   while(nret == SOCKET_ERROR)
   {
      nret = connect(CData, (LPSOCKADDR)&ServerInfo, sizeof(struct sockaddr));
   }
//--------------------
    char test[255];
    char test1[255];
    char email[255]="Mail From: <<ToEmail<<";
    char emailto[255]="RCPT TO: <<FromEmail<<";
    recv(CData,test,555,0);
    send(CData,"helo",strlen("helo"),0);
    recv(CData,test1,555,0);
    send(CData,email, sizeof(email),0);
    recv(CData,test,555,0);;
    send(CData,emailto, strlen(emailto),0);
    recv(CData,test,555,0);
    send(CData,"data", strlen("data"),0);
    recv(CData,test,555,0);
    send(CData,Body,sizeof(Body),0);
    send(CData,".",strlen("."),0);
    recv(CData,test,555,0);
    send(CData,"quit",strlen("quit"),0);
    recv(CData,test,555,0);
    //return true;
    MessageBox (NULL, "Done", "info", MB_ICONEXCLAMATION + MB_SYSTEMMODAL);
}

Pozdrawiam.

0
send(CData,"helo <ktos_ty>",strlen("helo <ktos_ty>"),0);

Musisz tam podać kim jesteś, najlepiej w ostrych nawiasach, niektóre serwery obsługują bez, ale niektóre nie, więc nawiasy lepiej dodać.

Edytka:
O ile pamiętam, to pozostałe pola też dobrze by było w nawiasy opatrzyć.

0
Loloki napisał(a)
send(CData,"helo <ktos_ty>",strlen("helo"),0);

Musisz tam podać kim jesteś, najlepiej w ostrych nawiasach, niektóre serwery obsługują bez, ale niektóre nie, więc nawiasy lepiej dodać.

Kompletnie zadnej zmiany...
Tam pewnie miales na mysli:

send(CData,"helo <ktos_ty>",strlen("helo <ktos_ty>"),0);
0

A nie powinieneś wysyłać "HELO moja.nazwa\r\n"?
(Komendy dużymi literami i znaki nowej linii w standardzie DOS – CR LF – po każdej z nich?)

0

Kompletnie zadnej zmiany...
Tam pewnie miales na mysli:
send(CData,"helo <ktos_ty>",strlen("helo <ktos_ty>"),0);

Dodaj na koncu \r\n

Dobrym zwyczajem jest wysylanie EHLO [twoje-ip] lub HELO [twoje-ip]. Nazwa moze byc w nawiasach "<>" lub "[]"

EHLO daje ci dostep do rozszerzen standardowego protokołu SMTP - ich liste dostaniesz w odpowiedzi na komende.

0

Faktycznie - brakowalo znaku konca linii.
Dzieki za pomoc.

Pozdrawiam

0

Witam, zaciekawił mnie ten kod i też próbowałem coś wysłać, udaje mi się połączyć z serwerem poczta.o2.pl, otrzymuje zwrotny kod 220 (co oznacza ze serwer jest gotowy), ale po poleceniu z MAIL FROM otrzymuje taki komunikat (z recv):

"poczta.o2.pl554 5.7.1 [email protected]: Sender address rejected: SERWER poczta.o2.pl
WYMAGA UWIERZYTELNIENIA. Zobacz http://pomoc.o2.pl/poczta/autoryzacja/ i skonfi
guruj poprawnie program pocztowy."

Co zrobić? Pewnie chodzi o login i hasło, ale gdzie i jak to podać?

0

Co zrobić? Pewnie chodzi o login i hasło, ale gdzie i jak to podać?

A specyfikcje smtp to ukradli ? (podpowiedz: AUTH LOGIN)

1 użytkowników online, w tym zalogowanych: 0, gości: 1