/**
 * 
 */
package org.vocefiscal.email;

import java.security.Security;
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;

public class GMailSender extends javax.mail.Authenticator 
{   
	 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; 
	  
	  static 
	  {   
	        Security.addProvider(new JSSEProvider());   
	  }  


	  public GMailSender() 
	  { 
	    host = "smtp.gmail.com"; // default smtp server 
	    port = "465"; // default smtp port 
	    sport = "465"; // default socketfactory port 

	    user = ""; // username 
	    pass = ""; // password 
	    from = ""; // email sent from 
	    subject = ""; // email subject 
	    body = ""; // email body 

	    debuggable = false; // debug mode on or off - default off 
	    auth = true; // smtp authentication - default on 

	    multipart = new MimeMultipart(); 

	    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
	    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); 
	  } 

	  public GMailSender(String user, String pass)
	  { 
	    this(); 

	    this.user = user; 
	    this.pass = pass; 
	  } 

	  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()); 

	      // setup message body 
	      BodyPart messageBodyPart = new MimeBodyPart(); 
	      messageBodyPart.setText(body); 
	      multipart.addBodyPart(messageBodyPart); 

	      // Put parts in message 
	      msg.setContent(multipart); 

	      // send email 
	      Transport.send(msg); 

	      return true; 
	    } else 
	    { 
	      return false; 
	    } 
	  } 

	  public void addAttachment(String filename) throws Exception 
	  { 
		  if(filename!=null)
		  {
			  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); 
	  } 

	  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; 
	  }

	/**
	 * @return the user
	 */
	public String getUser() {
		return user;
	}

	/**
	 * @param user the user to set
	 */
	public void setUser(String user) {
		this.user = user;
	}

	/**
	 * @return the pass
	 */
	public String getPass() {
		return pass;
	}

	/**
	 * @param pass the pass to set
	 */
	public void setPass(String pass) {
		this.pass = pass;
	}

	/**
	 * @return the to
	 */
	public String[] getTo() {
		return to;
	}

	/**
	 * @param to the to to set
	 */
	public void setTo(String[] to) {
		this.to = to;
	}

	/**
	 * @return the from
	 */
	public String getFrom() {
		return from;
	}

	/**
	 * @param from the from to set
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * @return the port
	 */
	public String getPort() {
		return port;
	}

	/**
	 * @param port the port to set
	 */
	public void setPort(String port) {
		this.port = port;
	}

	/**
	 * @return the sport
	 */
	public String getSport() {
		return sport;
	}

	/**
	 * @param sport the sport to set
	 */
	public void setSport(String sport) {
		this.sport = sport;
	}

	/**
	 * @return the host
	 */
	public String getHost() {
		return host;
	}

	/**
	 * @param host the host to set
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * @return the subject
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * @param subject the subject to set
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * @return the body
	 */
	public String getBody() {
		return body;
	}

	/**
	 * @param body the body to set
	 */
	public void setBody(String body) {
		this.body = body;
	}

	/**
	 * @return the auth
	 */
	public boolean isAuth() {
		return auth;
	}

	/**
	 * @param auth the auth to set
	 */
	public void setAuth(boolean auth) {
		this.auth = auth;
	}

	/**
	 * @return the debuggable
	 */
	public boolean isDebuggable() {
		return debuggable;
	}

	/**
	 * @param debuggable the debuggable to set
	 */
	public void setDebuggable(boolean debuggable) {
		this.debuggable = debuggable;
	}

	/**
	 * @return the multipart
	 */
	public Multipart getMultipart() {
		return multipart;
	}

	/**
	 * @param multipart the multipart to set
	 */
	public void setMultipart(Multipart multipart) {
		this.multipart = multipart;
	} 
}