Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo