MokaByte Numero 01 - Ottobre 1996
Step to Step: 
una applet per spedire posta 
da una pagina html 
di
Luca Bertoncello 
 

 



In questo articolo il nostro collaboratore ci introduce nel mondo delle comunicazioni via internet e ci da un assaggio su come realizzare un esempio di comunicazione. Si noti bene che le righe di codice presenti più avanti sono da considerarsi solo come direttiva di lavoro , e nel caso si voglia implementarle si tenga conto che vanno completate con altre routine non presenti in questo articolo. In questo numero per i più curiosi è presente un articolo che presenta una applet funzionante per inviare posta elettronica realizzata con la tecnica dei socket.
 



 
 
 
 
 
 

 

Spedizione di E-Mail da un Applet Java 

In questo articolo verrà spiegato come sostituire i vecchi "FORM" che assillano tutti i creatori di pagine HTML. Il semplice programma presentato in questa sede provvede a spedire via E-Mail il contenuto dei campi di un Applet. Per fare ciò occorre prima spendere due parole su come può avvenire la spedizione di una E-Mail. 

Spedizione di E-Mail Una E-Mail può essere facilmente spedita da un programma scritto in Java perché, nella sua stessa struttura, questo potente linguaggio facilita la comunicazione via Internet. A questo punto è sufficiente aprire un socket (porta di comunicazione) con il proprio provider sulla porta dedicata alla posta. Tutte le informazioni che darò ora sono tratte dall'RFC822 e RFC823¸ che spiegano la struttura di un messaggio. Innanzitutto qual'è la porta dedicata alla posta? Per default è la 25 (decimale). Su questa porta dobbiamo indirizzare tutti i nostri comandi SMTP (Simple Mail Transfer Protocol). Vedremo in seguito, analizzando il programma come si possa creare la struttura di una E-Mail corretta. Da ricordare subito una cosa: l'indirizzo del mittente dovrebbe essere corretto, in quanto, se ci sono stati errori (il destinatario è sconosciuto, altri errori generici, etc.) verrà spedita una mail ad esso, e se l'indirizzo è errato il proprio provider potrebbe ritrovarsi con un messaggio di provenienza sconosciuta che gli gira per il server. 

Struttura del programma Vediamo ora come scrivere questo nostro primo Applet. Di seguito riporterò parti del codice descrivendone la funzione. Alla fine verrà proposto il codice per intero in modo che si possa compilare ed eseguire direttamente. Innanzitutto spieghiamo cos'è un Applet. Un Applet è un programma che viene fatto girare in una finestra di Netscape. A questo programma si possono passare dei parametri (nel nostro caso viene passato l'indirizzo E-Mail a cui spedire i campi) e può aprire altre finestre e/o pagine HTML. Un Applet deve necessariamente contenere il membro init() nella sua classe. Questa funzione provvede ad inizializzare i vari componenti e a predisporre per il disegno di essi sullo schermo. Può anche contenere altre funzioni (start(), stop(), etc.) che vedremo in seguito. Cominciamo quindi ad esaminare il codice. 

// Dichiarazione degli import import java.awt.*;

import java.applet.*; 

import java.io.*; 

import java.net.*; 



// Dichiarazione della classe public class Form

class form extends Applet {
Innanzitutto vediamo le dichiarazioni degli import, ossia di quei "pacchetti" di classi già costruiti che ci servono per il nostro programma, poi vediamo la dichiarazione della classe. È importante notare che il nome della classe deve essere anche il nome del file che la contiene. Per chi non sapesse cos'è un classe darò una definizione (riduttiva, non me ne vogliano gli esperti OOP). "Una classe è un insieme di dati e di funzioni che servono per uno stesso scopo, la cui visibilità è totale all'interno della stessa classe e (volendo) parziale all'esterno di essa" Vediamo ora la funzione principale di questo Applet, la init(). Innanzitutto essa inizializza la classe (super.init()), quindi prende il parametro passato (EMail=getParameter("email")) e provvede infine ad inizializzare tutti i componenti del programma. Come ho scritto dopo, chi utilizza un ambiente integrato (consiglio Symantec Cafè) non ha bisogno di sapere come avviene questa inizializzazione, in quanto provvede lo stesso compilatore a crearla. 
// Procedura che inizializza l'Applet 
public void init()      

   { 

   // inizializza la classe

   super.init();            

      

   // Prende il parametro passatogli 

   EMail=getParameter("email"); 



   // Da questo punto in poi inizializza i vari 

   // Controlli  presenti sullo schermo.  Per 

   // chi ha a disposizione un ambiente integrato 

   // come J++ o Cafè, non è  necessario curarsene 

   // in quanto provvede a tutto il compilatore. 



   //{{INIT_CONTROLS 

     setLayout(null); 

     resize(346,227);

     group1= new CheckboxGroup(); 

     label1=new Label("Applet che spedisce via--

                --E-Mail una Form", Label.CENTER);

     add(label1); 

     label1.reshape(40,8,266,15);

     label2=new Label("Nome:");

     add(label2); label2.reshape(14,53,70,15);

     label3=new Label("Cognome:"); 

     add(label3);    

     label3.reshape(14,90,70,15);

     label4=new Label("Età:"); 

     add(label4); 

     label4.reshape(14,135,70,15);

     LavSi=new Checkbox("Si",group1, false);

     add(LavSi); LavSi.reshape(280,62,35,19);

     LavNo=new Checkbox("No",group1, false); 

     add(LavNo); 

     LavNo.reshape(280,83,35,22);

     Nome=new TextField(27); 

     add(Nome); 

     Nome.reshape(14,69,226,21); 

     Cognome=new TextField(27); 

     add(Cognome); 

     Cognome.reshape(14,105,226,23); 

     Eta=new TextField(7);

     add(Eta); 

     Eta.reshape(14,150,63,23); 

     label5=new Label("Lavora?",Label.CENTER); 

     add(label5); 

     label5.reshape(266,45,56,15); 

     spedisci=new Button("Spedisci"); 

     add(spedisci); 

     spedisci.reshape(14,189,88,27);

     azzera=new Button("Azzera");    

     add(azzera); 

     azzera.reshape(235,189,87,27);

     LavNo.setState(false); LavSi.setState(true); 

} 
A questo punto, passiamo alla prossima procedura di masima importanza: la gestione dei messaggi. Questa funzione deve essere necessariamente implementata in tutti i programmi che devono rispondere a degli eventi e si riduce, nella sua forma più semplice, a una serie di confronti. Vediamo come funziona la nostra. 
// HandleEvent, ossia la funzione che viene 

// richiamata per interpretare tutti i messaggi 

// che vengono passati e chiamare le funzioni 

// ad essi associate. 



public boolean handleEvent(Event event) { 

     if (event.id== Event.ACTION_EVENT && 

     event.target == spedisci){

          // Se il messaggio è: "Premuto 

          // il pulsante Spedisci", allora 

          // provvedi alla  spedizione

          try { 

               clickedSpedisci(); 

          } 

          catch(Exception e) { 

               System.out.println("Eccezione"+e); 

          }

          return true;

     } 

     else 

          if (event.id == Event.ACTION_EVENT &&

          event.target == azzera) {

               // Se il messaggio è: "Premuto il pulsante

               //Azzera", allora provvedi alla  cancellazione 

               clickedAzzera(); 

               return true; 

          } 



     return super.handleEvent(event); 

} 
La procedura è talmente semplice da non richiedere nessuna spiegazione. Passiamo quindi alle ultime due procedura (quelle interessanti). La prima provvede a cancellare la matrice. Per fare ciò imposta semplicemente il valore dei campi a "" (campo vuoto). 
// Questa procedura azzera i campi dell'Applet

public void clickedAzzera() { 

     Cognome.setText(""); 

     Nome.setText("");

     Eta.setText(""); 

     LavNo.setState(false); 

     LavSi.setState(true);

} 


Ed eccoci, finalmente, al cuore del nostro primo programma. La procedura che spedisce la E-Mail. Come spiegato in precedenza, la funzione apre un socket e manda i comandi SMTP attraverso esso. È fondamentale sostituire a "biella.alpcom.it" (il mio provider) il nome del VOSTRO provider. Questa è la procedura commentata: 

// Pezzo forte dell'Applet, questa procedura provvede 

//alla spedizione via   E-Mail dei dati. 

public void clickedSpedisci() throws IOException {



     // Apre un socket di comunicazione con un Host 

     //(consiglio di usare il vostro provider) 

     //alla porta 25 (quella dedicata alla posta).

     Socket mailSocket = new Socket("biella.alpcom.it", 25);



     // Associa ad esso uno stream per poter 

     //usare la funzione println 

     PrintStream os = --

     --new PrintStream(mailSocket.getOutputStream()); 

     int l,k,i; 

     String User,Host;



     // Decodifica l'indirizzo E-Mail 

     // dividendolo in User e Host 

     User="";

     Host=""; 

     for (l=i=0; i<EMail.length();i++) 

          if(EMail.charAt(i)!='@') 

               if(l==0) User+=EMail.charAt(i); 

          else Host+=EMail.charAt(i);

     else l=1;



     // Comunica con il socket precedentemente 

     // aperto inviando  i comandi SMTP



     // Apre la comunicazione postale 

     os.println("HELO "+Host); 



     // Specifica che la mail proviene da form@mokabyte.com. 

     // Per evitare errori è consigliato inserire un 

     // indirizzo valido. 

     os.println("MAIL FROM: form@mokabyte.com"); 



     // La mail viene ricevuta da User+"@"+Host

     os.println("RCPT TO: "+User+"@"+Host); 



     // Incominciano i dati os.println("DATA"); 

     os.println("SUBJECT: Campi della Form"); 



     // Scrive tutti i campi dell'Applet 

     os.println("Nome: "+Nome.getText()); 

     os.println("Cognome: "+Cognome.getText());

     os.println("Eta: "+Eta.getText()); 

     if(LavSi.getState()) 

          os.println("Lavora");

     else 

          os.println("Non lavora"); 



     // Fondamentale il '.' per indicare la fine

     // della mail (vedi standard SMTP) 

     os.println("."); 



     // Chiude la comunicazione 

     os.println("QUIT"); 

     os.close(); mailSocket.close();

} 



// Per ultima cosa (ultima, ma non meno importante) non 

// dimentichiamo le variabili usate. 

// La maggior parte di queste (i vari controlli) 

// vengono creati in automatico (e inizializzati nella init())

// se si usa un ambiente integrato. 



//{{DECLARE_CONTROLS 

     CheckboxGroup group1; 

     Label label1; 

     Label label2; 

     Label label3; 

     Label label4; 

     Checkbox LavSi; 

     Checkbox LavNo; 

     TextField Nome; 

     TextField Cognome; 

     TextField Eta; 

     Label label5;

     Button spedisci; 

     Button azzera; 

     String EMail; 

//}} 

}
Conclusioni Questo articolo presenta, nella sua forma basilare, quanto serve per iniziare il meraviglioso viaggio all'interno della programmazione in rete. Come si è potuto vedere l'utilizzo di funzioni "ostiche" in altri linguaggi (vedi comunicazione con Sockets) viene semplificato enormemente, si usano le classiche funzioni di stampa sullo schermo. Inoltre si tenga presente che questo Applet gira su tutte le macchine che abbiano un Netscape con le estensioni Java. Di seguito riporto, per comodità, il listato completo, in modo che si possa scriverlo e implementarlo direttamente. Se si dispone di un ambiente IDE (Microsoft J++, Symantec Cafè, Borland Latte) lo sviluppo è molto semplice, altrimenti si crei un file di nome Form.java e lo si compili con l'istruzione javac Form.java. Occorre anche, naturalmente, scrivere una pagina HTML che provveda a richiamare l'Applet. Riporterò di seguito anche questa. Arrivederci al prossimo Applet. Ecco il codice html che da utilizzare per inserire l'applet in una pagina www 
Pagine HTML che richiama l'Applet 
<HTML> 

<HEAD> 

<TITLE> Form in Java 

</TITLE> 

</HEAD> 

<BODY> 



<APPLET CODE="Form.class" WIDTH=346 HEIGHT=227 

    email="lucabert@biella.alpcom.it"></APPLET>

</BODY>

</HTML> 


Sostituire l'indirizzo E-Mail con il proprio.



Luca Bertoncello è un programmatore in C++ e Java (da poco dopo i suoi esordi). 
Diplomato in Informatica all'ITIS di Ivrea, lavora presso una ditta che ha creato due anni fa. 
È specializzato in programmi sistemistici per il gioco del Lotto, ma non disdegna altri programmi e speculazioni mentali sui vari sistemi. 
Può essere contattato a: 
lucabert@biella.alpcom.it (per messaggi privati) bdb@usa.net softserv@biella.alpcom.it (per lavoro) 

  
 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it