package pfc.android.gestormensajeria.utiles;

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
 
/**
 * Clase donde se definen los métodos para enviar correos electrónicos
 * @author Francisco José Lamela Rincón 
 *
 */
public class Mail extends javax.mail.Authenticator { 
	public static final String SMTP_SERVER_POR_DEFECTO = "smtp.gmail.com";
	public static final String SMTP_PUERTO_POR_DEFECTO = "465";
	public static final String SMTP_PUERTO_SOCKERFACTORY_POR_DEFECTO = "465";
	
	private String _user; 
	private String _pass;
	 
	private String[] _to; 
	private String _from; 
	 
	private String _port; 
	private String _sport; 
	 
	private String _host; 
	 
	private String _subject; 
	private String _body; 
	 
	private boolean _auth; 
	 
	private boolean _debuggable; 
	 
	private Multipart _multipart; 
	 
 
	/**
	 * Constructor por defecto de la clase
	 */
	public Mail() { 
	    _host = SMTP_SERVER_POR_DEFECTO;  
	    _port = SMTP_PUERTO_POR_DEFECTO;  
	    _sport = SMTP_PUERTO_SOCKERFACTORY_POR_DEFECTO; 
	    
	    _user = ""; //Usuario 
	    _pass = ""; //Contraseña 
	    _from = ""; //Email origen 
	    _subject = ""; //Asunto 
	    _body = ""; //Cuerpo del mensaje 
	 
	    _debuggable = false; 
	    _auth = true; //Autentificacion SMTP  - por defecto ON 
	 
	    _multipart = new MimeMultipart(); 
	 
	    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
	    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
	    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
	    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
	    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
	    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
	    CommandMap.setDefaultCommandMap(mc); 
	} 
 
	
	/**
	 * Constructor pasando usuario y contraseña
	 * @param user
	 * @param pass
	 */
	public Mail(String user, String pass) { 
		this(); 
 
	    _user = user; 
	    _pass = pass; 
	} 
 
	
	/**
	 * Ejecuta el proceso de envío del mensaje
	 * @return
	 * @throws Exception
	 */
	public boolean send() throws Exception { 
	    Properties props = _setProperties(); 
	 
	    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
	    	Session session = Session.getInstance(props, this); 
	 
	    	MimeMessage msg = new MimeMessage(session); 
 
	    	msg.setFrom(new InternetAddress(_from)); 
       
	    	InternetAddress[] addressTo = new InternetAddress[_to.length]; 
	    	for (int i = 0; i < _to.length; i++) { 
	    		addressTo[i] = new InternetAddress(_to[i]); 
	    	} 
	    	msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
 
	    	msg.setSubject(_subject); 
	    	msg.setSentDate(new Date()); 
	 
	    	//Establecemos el cuerpo del mensaje
	    	BodyPart messageBodyPart = new MimeBodyPart(); 
	    	messageBodyPart.setText(_body); 
	    	_multipart.addBodyPart(messageBodyPart); 
 	    	msg.setContent(_multipart); 
 
	    	//Enviamos el mensaje 
	    	Transport.send(msg); 
 
	    	return true; 
	    }else 
	      return false; 
	} 
 
	/**
	 * Incluye un fichero adjunto al mensaje
	 * @param filename
	 * @throws Exception
	 */
	public void addAttachment(String filename) throws Exception { 
	    BodyPart messageBodyPart = new MimeBodyPart(); 
	    DataSource source = new FileDataSource(filename); 
	    messageBodyPart.setDataHandler(new DataHandler(source)); 
	    messageBodyPart.setFileName(filename); 
	    
	    _multipart.addBodyPart(messageBodyPart); 
	} 
 
	@Override 
	public PasswordAuthentication getPasswordAuthentication() { 
	    return new PasswordAuthentication(_user, _pass); 
	} 
 
	
	/**
	 * Rellena las propiedades del correo electrónico
	 * @return
	 */
	private Properties _setProperties() { 
	    Properties props = new Properties(); 
	 
	    props.put("mail.smtp.host", _host); 
	 
	    if(_debuggable) { 
	      props.put("mail.debug", "true"); 
	    } 
	 
	    if(_auth) { 
	      props.put("mail.smtp.auth", "true"); 
	    } 
	 
	    props.put("mail.smtp.port", _port); 
	    props.put("mail.smtp.socketFactory.port", _sport); 
	    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
	    props.put("mail.smtp.socketFactory.fallback", "false"); 
	 
	    return props; 
	} 
 
	//GETTERS AND SETTERS 
	public String getBody() { 
	    return _body; 
	} 
 
	public void setBody(String _body) { 
		this._body = _body; 
	}

	public String getUser() {
		return _user;
	}

	public void setUser(String _user) {
		this._user = _user;
	}

	public String getPass() {
		return _pass;
	}

	public void setPass(String _pass) {
		this._pass = _pass;
	}

	public String[] getTo() {
		return _to;
	}

	public void setTo(String[] _to) {
		this._to = _to;
	}

	public String getFrom() {
		return _from;
	}

	public void setFrom(String _from) {
		this._from = _from;
	}

	public String getPort() {
		return _port;
	}

	public void setPort(String _port) {
		this._port = _port;
	}

	public String getSport() {
		return _sport;
	}

	public void setSport(String _sport) {
		this._sport = _sport;
	}

	public String getHost() {
		return _host;
	}

	public void setHost(String _host) {
		this._host = _host;
	}

	public String getSubject() {
		return _subject;
	}

	public void setSubject(String _subject) {
		this._subject = _subject;
	}

	public boolean isAuth() {
		return _auth;
	}

	public void setAuth(boolean _auth) {
		this._auth = _auth;
	}

	public boolean isDebuggable() {
		return _debuggable;
	}

	public void setDebuggable(boolean _debuggable) {
		this._debuggable = _debuggable;
	}

	public Multipart getMultipart() {
		return _multipart;
	}

	public void setMultipart(Multipart _multipart) {
		this._multipart = _multipart;
	} 
} 