//classe con il compito di restituire via protocollo SMTP il fle-risultato al Client
//con altresi' la funzionalita' di controllare l'esistenza dell'indirizzo Mail fornito

import java.io.*;
import java.net.*;
import java.util.*;

public class gestoreMail {
	private String destination;

	public gestoreMail(String arg_mail) {
		
		destination=arg_mail;
	}

	//non deve fare assolutamente exit in caso di errore ma return!!!!
	public int sendMail(String nomeFile) {
		boolean error=false;
    Socket soc;
		
		if (!ConstantsM.useMail) return 0; // simulazione invio mail
		int pos=destination.indexOf('@');
		if (pos==-1) return -1;
    String host=destination.substring(pos+1,destination.length());
    BufferedReader inp=null;
	  //in nomeFile posso avere "errore" e allora mando una mail con scritto errore!!!
		if (nomeFile.equals("errore")) 
		      error=true;
	   else try { // verifica che il file nomeFile sia leggibile
	              inp=new BufferedReader(new FileReader(nomeFile));
	  
	        } catch(IOException ex) {
	            System.out.println("gestoreMail.sendMail: "+ex.toString());
              return -1;
	          }
	  // manda la mail.
    try { System.out.println("gestoreMail.sendMail: mando la mail");
		      soc=new Socket(host,25);
          soc.setSoTimeout(Constants.attesaRec*2); // per le letture prima della chiusura
          BufferedReader inbuf=new BufferedReader(new InputStreamReader(soc.getInputStream()));
		      PrintWriter outbuf=new PrintWriter(soc.getOutputStream(),true);
          outbuf.println("helo "+(soc.getLocalAddress()).getHostAddress());
          outbuf.println("mail from: result@treesearch.org");
 		      outbuf.println("rcpt to: "+destination);
          outbuf.println("data");
          outbuf.println("To: "+destination);
          outbuf.println("Subject: TreeSearch Result\n");
			    if (error)
				        { outbuf.println("errore nella ricerca");
				          System.out.println("gestoreMail.sendMail: messaggio di errore scritto nella mail.");	
			          }
			     else { String inStr;
			 	          while ((inStr=inp.readLine())!=null)
					         outbuf.println(inStr);
				          inp.close();
			          	System.out.println("gestoreMail.sendMail: ok, dati scritti nella mail.");	
			          }
			    outbuf.println(".");
			    outbuf.println("quit");
          // raccoglie i msg di risposta del server per una corretta termina-
          // zione (necessario prima di chiudere la connessione).
          String line;
          for (int j=0;j<8;j++) line=inbuf.readLine(); 
			    inbuf.close();outbuf.close();soc.close();      			
			    return 0;
			    
		} catch(UnknownHostException ex) {
	      System.out.println("gestoreMail.sendMail: "+ex.toString());
	      return -1;
	    }
      catch(InterruptedIOException ex) {
        // lo scadere del timeout di lettura e' intercettato qui.
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return -1;
	    }
	    catch(IOException ex) {
	      System.out.println("gestoreMail.sendMail: "+ex.toString());
	      return -1;
	    }
      catch(SecurityException ex) {
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return -1;
	    }
	}//fine sendMail
	
	// controlla la validita' dell'indirizzo e-mail. Si suppone che il
	// comando vrfy del protocollo SMTP dia sempre dei risultati validi.
	public boolean checkMail() {
		Socket soc=null;
    
		if (!ConstantsM.useMail) return true; // simulazione check indirizzo
		int pos=destination.indexOf('@');
		if (pos==-1) return false;
    String host=destination.substring(pos+1,destination.length());
		try { soc=new Socket(host,25);
          soc.setSoTimeout(Constants.attesaRec*2); // per le letture delle risposte del server
		      BufferedReader inbuf=new BufferedReader(new InputStreamReader(soc.getInputStream()));
		      PrintWriter outbuf=new PrintWriter(soc.getOutputStream(),true);
		      String line;
		      line=inbuf.readLine(); // legge il msg di benvenuto
          outbuf.println("helo "+(soc.getLocalAddress()).getHostAddress());
		      line=inbuf.readLine(); // legge la risposta
          outbuf.println("vrfy "+destination);
		      line=inbuf.readLine(); // legge la risposta
		      // verifica il codice: 250 = OK
		      boolean res;
		      if ((line.substring(0,3)).equals("250")) res=true;
		                                          else res=false;
		      outbuf.println("quit");
          line=inbuf.readLine(); // legge la risposta
          line=inbuf.readLine();                                    
		      inbuf.close();outbuf.close();soc.close();
		      return res;                                         
	  
	  } catch(UnknownHostException ex) {
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return false;
	    }
	    catch(InterruptedIOException ex) {
        // lo scadere del timeout di lettura e' intercettato qui.
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return false;
	    }
      catch(IOException ex) {
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return false;
	    }
      catch(SecurityException ex) {
	      System.out.println("gestoreMail.checkMail: "+ex.toString());
	      return false;
	    }
	}	
}//fine class gestoreMail