Newsgroup: it.comp.programmare.win32
Titolo: Messaggio via SMTP!

Ciao a tutti! Come al solito ho bisogno del vs aiuto che già una volta
mi ha levato un pò di casini di torno!
Questa volta il problema è il seguente (x ora l'ho risolto in Java ma
mi occorre anche in C o meglio VC++):
ho la necessita di mandare un messaggio composto da titolo+corpo ad un
indirizzo email qualsiasi. Per esempio:
from   = 
pi...@nonloso.net
to       = 
gi...@noncicredo.it
titolo   = Prova!
Testo = Quello che mi pare!
Esiste qualche funzione o comando in C o VC++ che svolga questo
compito o devo costruirlo ex novo? O meglio, c'è qualcuno che lo ha
già fatto o che lo sa fare? Mi serve questa funzione per finire un
programmino che sto facendo, quindi se qualcuno può aiutarmi, mi fa un
piacere grandissimo. Magari scrivendomi qualche riga direttamente qui
per darmi qualche idea o suggerimento!
Grazie in anticipo!

 ha scritto nel messaggio
news:k3d88tkhfl01aiiu6...@4ax.com...

Potresti usare il winsock, simuleresti una classica connessione telnet ad un
server smtp, nulla di + semplice. Mi pare che qualcuno del ng abbia scritto
proprio un tutorial su questo.

 compito o devo costruirlo ex novo?
E` una cosa molto semplice, si fa tutto in un paio di righe (a te
aggiungere i controlli di errore e/o convertire il codice se non usi
MFC):
AfxSocketInit();
CSocket pippo;
pippo.Create();
pippo.Connect( "
smtp.pippo.com
", 25);
pippo.Send( szBuffer, lstrlen(szBuffer));
Ovviamente in szBuffer devi mettere le cose giuste, formattate come
vuole SMTP, ma se dici di averlo gia` fatto in Java immagino che tu lo
sappia gia`. Un'unica nota: i ritorni a capo "voluti dagli RFC" non si
fanno con "\n" (che in Windows non viene "espanso" automaticamente), ma
con "\r\n"!
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

Grazie, proverň come hai detto tu! Poi ti faccio sapere!
*Restore*
-----------------


Ciao, ho provato a formattare il testo nello stesso modo in cui ho
fatto in java ma x qualche motivo mi spedisce sono il titolo del
messaggio ed il resto no!
Non è che per caso potresti scrivermi un paio di righe in cui mi
illustri come dovrei formattare il testo secondo le specifiche SMTP!
Forse mi sfugge qualcosa!
Grazie in anticipo!
--------------------------------------------------------------------------------------
*Restore*

 specifiche SMTP!
Certo, questo e` un esempio di una sessione SMTP col Telnet (non ho
riportato le risposte che il server ti spedisce per ognuno dei tre
comandi):
MAIL FROM: blabla <blabla@blabla>
RCPT TO: blabla <blabla@blabla>
DATA
Qua devi mettere tutti i campi dell'header senza righe
vuote in mezzo, ad esempio:
From: blabla <blabla@blabla>
To:  blabla <blabla@blabla>
Subject: blabla
Poi, *dopo una riga vuota*, qua metti il corpo del messaggio, e infine
termini con una riga composta interamente da un punto.
.


Grazie di nuovo ma tramite telnet, funziona anche a me nel modo che mi
hai descritto. A me servivano un paio di righe in C/C++ che mi
costruiscano tutto il msg da spedire... Come ti ho già detto, mi
sfugge qualcosa! In java mi funziona ma devo farlo in C!
Scusami se ti sto scocciando.... nel frattempo ci riprovo io!
------------------------------


Ciao,
di seguito trovi il codice che ho usato per un server COM che si collega a
server SMTP.
Non e' molto ordinato ma spero possa esserti d'aiuto.
Andrea
 char Buffer[1024], CodiceRispostaServer[4];
 unsigned short port = 25;
 int retval;
 int len;
 unsigned int addr;
 int socket_type = SOCK_STREAM;
 struct sockaddr_in server;
 struct hostent *hp;
 WSADATA wsaData;
 SOCKET  conn_socket;
 struct linger lLinger;
 CString stringa;
 stringa = (LPCWSTR)bstr_Server;
 char server_name[128];
 strcpy(server_name, stringa.GetBuffer(128));
 if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
  //AfxMessageBox("Error WSAStartup");
  int_Error = ER_WSAStartup;
  WSACleanup();
  return S_OK;
 }
 // Attempt to detect if we should call gethostbyname() or
 // gethostbyaddr()
 if (isalpha(server_name[0])) {   /* server address is a name */
  hp = gethostbyname(server_name);
 }
 else  { /* Convert nnn.nnn address to a usable one */
  addr = inet_addr(server_name);
  hp = gethostbyaddr((char *)&addr,4,AF_INET);
 }
 if (hp == NULL ) {
  int_Error = ER_ResolveName;
  //AfxMessageBox("Error Resolve");
  WSACleanup();
  return S_OK;
 }
 //
 // Copy the resolved information into the sockaddr_in structure
 //
 memset(&server,0,sizeof(server));
 memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
 server.sin_family = hp->h_addrtype;
 server.sin_port = htons(port);
 conn_socket = socket(AF_INET,socket_type,0); /* Open a socket */
 if (conn_socket <0 ) {
  int_Error = ER_Socket;
  WSACleanup();
  return S_OK;
 }
 lLinger.l_onoff  = 1;   // linger on unsent data
    lLinger.l_linger = 1;   // 5 second timeout
    if( setsockopt( conn_socket, SOL_SOCKET, SO_LINGER, (const char
*)&lLinger, sizeof(LINGER)) == SOCKET_ERROR) {
  int_Error = ER_SetOpt;
  WSACleanup();
  return S_OK;
 }
 if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server))
  == SOCKET_ERROR) {
   //AfxMessageBox("connect");
   int_Error = ER_Connect;
   WSACleanup();
   return S_OK;
 }
 retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
 if ((retval == SOCKET_ERROR) || (retval == 0)){
  //AfxMessageBox("recv");
  int_Error = ER_Recv1;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 Buffer[retval]='\0';
 memcpy(CodiceRispostaServer, Buffer, 3);
 CodiceRispostaServer[3]='\0';
 if ( strcmp(CodiceRispostaServer, "220") != 0 ) {
  int_Error = ER_Recv1+100;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 strcpy(Buffer, "HELO commail");
 Buffer[12]=0x0D;
 Buffer[13]=0x0A;
 retval = send(conn_socket,Buffer,14,0);
 if (retval == SOCKET_ERROR) {
  //AfxMessageBox("send");
  int_Error = ER_SendHELO;
  WSACleanup();
  return S_OK;
 }
 retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
 if ((retval == SOCKET_ERROR) || (retval == 0)) {
  //AfxMessageBox("recv");
  int_Error = ER_Recv2;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 Buffer[retval]='\0';
 memcpy(CodiceRispostaServer, Buffer, 3);
 CodiceRispostaServer[3]='\0';
 if ( strcmp(CodiceRispostaServer, "250") != 0 ) {
  int_Error = ER_Recv2+100;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 stringa = (LPCWSTR) bstr_From;
 strcpy(Buffer, "MAIL FROM:<");
 strcat(Buffer, stringa.GetBuffer(64));
 strcat(Buffer, ">");
 len = strlen(Buffer);
 Buffer[len]=0x0D;
 Buffer[len+1]=0x0A;
 retval = send(conn_socket,Buffer,len+2,0);
 if (retval == SOCKET_ERROR) {
  //AfxMessageBox("send");
  int_Error = ER_SendFROM;
  WSACleanup();
  return S_OK;
 }
 retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
 if ((retval == SOCKET_ERROR) || (retval == 0)) {
  //AfxMessageBox("recv");
  int_Error = ER_Recv3;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 Buffer[retval]='\0';
 memcpy(CodiceRispostaServer, Buffer, 3);
 CodiceRispostaServer[3]='\0';
 if ( strcmp(CodiceRispostaServer, "250") != 0 ) {
  int_Error = ER_Recv3+100;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 stringa = (LPCWSTR) bstr_To;
 strcpy(Buffer, "RCPT TO:<");
 strcat(Buffer, stringa.GetBuffer(64));
 strcat(Buffer, ">");
 len = strlen(Buffer);
 Buffer[len]=0x0D;
 Buffer[len+1]=0x0A;
 retval = send(conn_socket,Buffer,len+2,0);
 if (retval == SOCKET_ERROR) {
  //AfxMessageBox("send");
  int_Error = ER_SendTO;
  WSACleanup();
  return S_OK;
 }
 retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
 if ((retval == SOCKET_ERROR) || (retval == 0)) {
  //AfxMessageBox("recv");
  int_Error = ER_Recv4;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
 Buffer[retval]='\0';
 memcpy(CodiceRispostaServer, Buffer, 3);
 CodiceRispostaServer[3]='\0';
 if ( strcmp(CodiceRispostaServer, "250") != 0 ) {
  int_Error = ER_Recv4+100;
  closesocket(conn_socket);
  WSACleanup();
  return S_OK;
 }
eccetera.....
-- 
Posted from 
www.pneusonline.it
 [195.31.179.99] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie, adesso provo a vedere se funziona... poi ti faccio sapere!
*Restore*
