import org.apache.commons.net.smtp.*;
import java.io.*;
import java.security.*;
import javax.net.ssl.*;

public class clienteSMTP1{
    public static void main(String args[]){
        try{
            // Parámetros del remitente
            String server="smtp.gmail.com";
            String username="XXXX";
            String password="YYYY";
            int puerto=587;
            
            // Creamos un cliente SMTP seguro y nos conectamos
            AuthenticatingSMTPClient cliente=new AuthenticatingSMTPClient();
            cliente.connect(server,puerto);
            System.out.println("1-CONNECT -> "+cliente.getReplyString());
            
            // Se establece la clave para la conexion segura
            KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(null,null);
            KeyManager km=kmf.getKeyManagers()[0];
            cliente.setKeyManager(km);
            int respuesta=cliente.getReplyCode();
            if(!SMTPReply.isPositiveCompletion(respuesta)){
                cliente.disconnect();
                System.out.println("CONEXION RECHAZADA");
                System.exit(1);
            }
            
            // Enviamos el comando EHLO
            // En cualquier transferencia de correo electrónico 
            // es necesario comenzar por el saludo en el que incluimos nuestra identidad. 
            // Este comando es helo/ehlo en SMTP
            cliente.ehlo(server);
            System.out.println("2-EHLO -> "+cliente.getReplyString());
            
            // Enviamos el comando STARTTLS
            // SSL vs TLS vs STARTTLS
            if(cliente.execTLS()){
                System.out.println("3-TLS -> "+cliente.getReplyString());
                // Nos autenticamos con el servidor
                if(cliente.auth(AuthenticatingSMTPClient.AUTH_METHOD.PLAIN,username,password)){
                    System.out.println("4-FROM -> "+cliente.getReplyString());
                    String destino="jmestepa@educa.jcyl.es";
                    String asunto="Prueba de mail desde Java";
                    String mensaje="Hola";
            
                    // Creamos cabecera
                    SimpleSMTPHeader cabecera=new SimpleSMTPHeader(username,destino,asunto);
                    cliente.setSender(username);
                    cliente.addRecipient(destino);
                    System.out.println("5-CABECERA -> "+cliente.getReplyString());
                    
                    // Enviamos DATA 
                    Writer writer=cliente.sendMessageData();
                    if(writer==null){
                        System.out.println("FALLO AL ENVIAR DATA");
                        System.exit(2);
                    }
                    writer.write(cabecera.toString());
                    writer.write(mensaje);
                    writer.close();
                    System.out.println("6-DATA -> "+cliente.getReplyString());
                    
                    // A ver el resultado
                    boolean exito=cliente.completePendingCommand();
                    System.out.println("7-ENVIO -> "+cliente.getReplyString());
                    if(!exito){
                        System.out.println("FALLO AL FINALIZAR TRANSACCION");
                        System.exit(3);
                    }
                }else System.out.println("USUARIO NO AUTENTICADO");
            }else System.out.println("FALLO AL EJECUTAR STARTTLS");
           
            // Hasta luego, Lucas
            cliente.disconnect();
            System.out.println("8-QUIT -> Fin del envio");
            
        }catch(Exception e){
            System.out.println("ERROR GENERAL");
            e.printStackTrace();
        }
    }
}
