Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - invio email
Forum - C/C++ - invio email

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 18:49
Domenica, 06/06/2010
ciao ragazi..complimenti per il sito super efficente. Volevo chiedervi un aiuto.
Ho fatto una funzione in c che mi invia le email(ho appena inziato a studiare le socket)..ci sono riuscito pero c'è un problema.. Invio l'email, dopo di che se lo eseguo nuovamente non l'inavia piu. Perche? vi posto il codice
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>              //Input/output Standard (es:printf()…)
  2. #include <stdlib.h>
  3. #include <winsock.h>            //API winsock
  4. #include <windows.h>
  5.  
  6. typedef char stringa[500];
  7.  
  8.  
  9. WSADATA data;                                //La struttura WSADATA contiene informazioni sull’implementazione
  10.                                              //delle socket windows
  11.  
  12. WORD versione;                               //preparo la variabile che tiene la versione di socket windows che il chiamante può usare.
  13.  
  14.  
  15. SOCKET conn;                                 //Creare un elemento di tipo socket chiamato conn:
  16.        
  17. FILE *fmail;                                 //creo un puntatore al file
  18.  
  19. char buf[1500];                              //variabile dove vado ad inserire temporaneamente destinatario,mittente, oggetto che poi immetto nell'email
  20.  
  21.  
  22. int err=0;
  23.  
  24. char end[7];
  25. char input;
  26. char mess[1000];
  27. int n=0;
  28.                                                
  29.  
  30. LPHOSTENT host;                                       //restituisce una struttura di tipo "hostent" in cui mette
  31.                                                       //l'indirizzo IP. Riceve in ingresso il nome dell'host che puo' essere
  32.                                                       //un nome, in indirizzo IPv4 o un indirizzo IPv6.
  33.                                                       //Nel caso di IPv4 o IPv6, il campo "indirizzo_host->h_addr" contiene il nome stesso.
  34.                                                       //indirizzo_host=gethostbyname("nome.inventato.it");
  35.                                                       //Se hp contiene il puntatore nullo, allora la chiamata a gethostbyname e' fallita.
  36.  
  37.  
  38.  
  39.  
  40. char Mittente[50]="provai@hotmail.it";         //imposto il mittente
  41. char Destinatario[50]="alauraXX@gmail.com";      //imposto il destinatario
  42. char Oggetto[50]="email";                        //imposto l'ogetto del messaggio
  43.  
  44.  
  45. main()
  46. {
  47.  
  48.      fmail=fopen("testo.txt","r");               //controllo se esiste il file e se ho i permessi per aprirlo
  49.          if (fmail==NULL){
  50.                  printf("file esiste");                  //se qualcosa va storto esco
  51.                 }
  52.  
  53.      versione=MAKEWORD(2,0);                    //versione di socket windows che il chiamante può usare.
  54.      
  55.      WSAStartup(versione,&data);                 //specifica il numero di versione di winsock sul
  56.                                                  //sistema e lo costruisce correttamente
  57.  
  58.  
  59.      int lun;                                     //conterra il numero che indica la lunghezza della struttura della socket
  60.                                                  
  61.          conn=socket(PF_INET,SOCK_STREAM,0);         //Crea una socket dedicata ad un fornitore di servizi specifico
  62.                                                      
  63.                                             //Tipo: PF_INET , descrizione:      
  64.                                                  //In questo esempio la funzione
  65.                                                  //usa l’internet address family,
  66.                                                  //con socket di tipo stream e
  67.                                                  //protocollo TCP/IP (? “0”)
  68.                                                  
  69.                                                      
  70.                                            //Tipo: SOCK_STREAM, descrizione:      
  71.                                                  //Fornisce una connessione sequenziale,
  72.                                                  //affidabile e full-duplex. Il protocollo TCP
  73.                                                  //è basato su questo tipo di socket.
  74.          
  75.      SOCKADDR_IN conn_addr;                           //creo la struttura della socket (sockaddr)
  76.      conn_addr.sin_family=PF_INET;                    //Forma di sockaddr In AF_INET poiche utilizziamo il protocollo ip
  77.                                                       //ip v4
  78.          conn_addr.sin_port=htons(25);                    //assegnando la porta 25
  79.  
  80.          host=gethostbyname ("mail.tin.it");              //prendo l'indirizzo ip di mail.tin.it
  81.          
  82.          if (host==NULL)                                  //controllo se l'ip e valido altrimenti esco
  83.                 printf("host ok");
  84.  
  85.          conn_addr.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
  86.      lun=sizeof(struct sockaddr);                     //prendo la lunghezza della socket per poi passarla alla funzione creazione
  87.  
  88.      err=connect(conn,(struct sockaddr*)&conn_addr,lun);   //Chiamo la funzione connect () passando come parametri la socket
  89.                                                            //creata e settata all’ascolto e la struttura sockaddr_in.
  90.                                                            
  91.                                                            
  92.      if (err!=0)                                           //Verifico la presenza di errori
  93.      {
  94.                 err=WSAGetLastError();
  95.                 printf("Errore della Socket\t%d",err);
  96.      }
  97.  
  98.     char mess[1000];                                           //dichiaro variabile dove salvero i messaggi del server
  99.        
  100.         n=recv(conn,mess,200,0);
  101.         mess[n]=0;
  102.         printf(mess,"%s");
  103.  
  104.  
  105.     sprintf(buf, "helo inviamail\nmail from:<send@email.it>\nrcpt to:<%s>\ndata\n",Destinatario);
  106.     send(conn, buf, strlen(buf), 0);    
  107.    
  108.     printf(buf);
  109.     sprintf(buf, "From: %s\n",Mittente);
  110.     send(conn, buf, strlen(buf), 0);
  111.  
  112.     sprintf(buf, "To: %s\n",Destinatario);
  113.     send(conn, buf, strlen(buf), 0);
  114.  
  115.     sprintf(buf, "Subject: %s\n",Oggetto);
  116.     send(conn, buf, strlen(buf), 0);
  117.  
  118.  
  119.         while (feof(fmail)==0){
  120.                 fscanf (fmail,"%c",&input);
  121.                 send (conn,&input,1,0);
  122.                    }
  123.  
  124.     sprintf(buf, "\n.\n");
  125.     printf(buf);
  126.     send(conn, buf, strlen(buf), 0);
  127.  
  128.         fclose(fmail);
  129.  
  130.  
  131.         sprintf(end,"quit\n");
  132.         send(conn,end,strlen(end),0);
  133.  
  134.  
  135.  
  136.  
  137.        
  138.         n=recv(conn,mess,200,0);
  139.         mess[n]=0;
  140.         printf(mess,"%s");
  141.  
  142.  
  143.   closesocket(conn);                                          //chiude la socket (chiude la connessione)
  144.  
  145.  
  146. WSACleanup();
  147. system("del log.txt");
  148. }


PM Quote
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 19:11
Domenica, 06/06/2010
Ho capito un po il funzionamento e praticamente se avvio il programma per la rima volta lo esegue (tutte le istruzioni) fino alla cancellazione del file e funziona perfettamente, poi quando provo a riavviarlo mi si blocca il programma non dando piu segni di vita..
Ho ceracto qualkosa che ho dimenticato a chidere (file, socket) ma non mi sembra abbia dimenticato niente.. Ho provato ad inserire exit(EXIT_SUCCESS); per terminarlo piu corretamente ma nulla..Mi dareste un aiuto..

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:23
Domenica, 06/06/2010
Quando lo esegui la seconda volta, hai fatto un po' di debugging per capire quale funzione restituisce errore?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 14:59
Lunedì, 07/06/2010
risolto :k:
ne approfitto della vostra gentilezza per chiedervi una cosa.. Come posso fare a prendere il patch di dove si trova il mio eseguibile?
Io ho fatto un programmino dove e possibile scrivere un messaggio e viene codificato e salvato su un file di .txt. Sempre questo eseguibile dovrebbe riuscire a prendere il percorso dove si trova es C: , aggiungere il nome dell'altro eseguibile invio.exe e passarlo alla funzione system..
Io con le conoscenze che ho vorrei farlo cosi ma se voi conoscete altre funzioni che semplifichino la vita saranno bene accette:)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:13
Lunedì, 07/06/2010
Testo quotato

Postato originariamente da gabriele94:

risolto :k:
ne approfitto della vostra gentilezza per chiedervi una cosa.. Come posso fare a prendere il patch di dove si trova il mio eseguibile?



No patch ! Ma path ...

Il path è contenuto nel primo argomento passato al main

argv[0]


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 15:26
Lunedì, 07/06/2010
patch 8-| path:D cmq ancora non sono molto pratico non ho afferrato bene il concetto..
Io nel codice ho
main()
{
}
se è un argomento del main come lo passo ad una variabile es char posizione?

PM Quote
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 15:26
Lunedì, 07/06/2010
Ho letto che:
argv[0] e' il nome del programma ed e' sempre presente.
ma a me non interessa il nome del programma..interessa la directory dove viene mandato in esecuzione... Sono un po confuso :alert:

Ultima modifica effettuata da gabriele94 il 07/06/2010 alle 15:52
PM Quote
Avatar
gabriele94 (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/06/2010

Segnala al moderatore
Postato alle 15:58
Lunedì, 07/06/2010
SEI UN GRANDE!!!
L'ho capito adesso facendomi un programmino stupido ma efficace

#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
      char *nome;
      nome=argv[0];
      printf("%s",nome);
      system("pause");
}

:k::k::k::k:
Grazie

Ma alla funzione system non posso passare una stringa?
system("%s",percorso);
???


Ultima modifica effettuata da gabriele94 il 07/06/2010 alle 16:03
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:01
Lunedì, 07/06/2010
Prego ma non sono affatto "grande" ... sono nozioni di base ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo