Seleccionar página

Android: Como enviar emails sin pedirle al usuario que interactue

por | Dic 13, 2011 | Android

Para enviar emails en Android se lanzan Intents que piden la interacción del usuario. Pero si queremos enviar emails en aplicaciones empresariales para temas de debug y control de errores. No se le puede estar al usuario pidiendo que este enviando emails todo el rato.

Esto no se puede hacer directamente con las librerias que vienen con Android. Para poder hacer esto se puede usar un port que hay de las JavaMail para Android.

 

Para ello es necesario descargar los jar que salen aqui:

 

Y añadirlos como librerias a nuestro proyecto.

Despues necesitamos implementar una clase que use las javamail para enviar emails como en cualquier otra aplicación Java.

Aqui voy a poner un ejemplo de una clase con la que se pueden enviar email con ficheros adjuntos:
(Como regalo o modificación los adjuntos se envian comprimidos en zip)

package mypackage;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

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 para el envio email
 * 
 */

public class Mail 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; 

	public Mail() { 
		_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 Mail(String user, String pass) { 
		this(); 

		_user = user; 
		_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 { 

		// Antes de adjuntar el fichero se comprime en zip
		String outputFilename = filename+".zip";
		File outputFile = new File(outputFilename);
		FileOutputStream fos = new FileOutputStream(outputFile); 
		File inputFile = new File(filename);
		BufferedInputStream fis =  new BufferedInputStream(new FileInputStream(inputFile)); 

		ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
		try {

			byte[] buffer = new byte[1024];
			ByteArrayOutputStream stream = new ByteArrayOutputStream();
			int len1 = 0;
			while ((len1 = fis.read(buffer)) != -1) {
				stream.write(buffer, 0, len1);
			}				        

			byte[] bytes = stream.toByteArray();
			ZipEntry entry = new ZipEntry(outputFilename);
			zos.putNextEntry(entry);
			zos.write(bytes);
			zos.closeEntry();
		} finally {
			zos.close();
			fos.close();
			fis.close();
		}		

		// Se adjunta el zip
		BodyPart messageBodyPart = new MimeBodyPart(); 
		DataSource source = new FileDataSource(outputFilename); 
		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; 
	} 

	// the getters and setters 
	public String getBody() { 
		return _body; 
	} 

	public void setBody(String _body) { 
		this._body = _body; 
	} 

	public String getFrom() { 
		return _from; 
	} 

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

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

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

	public String getHost() { 
		return _host; 
	} 

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

	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 getSubject() { 
		return _body; 
	} 

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

Un ejemplo de uso de esta clase podria ser el siguiente:

	/** 
	 * Enviar un email con fichero adjunto 
	 * */
	public static void send(String emailTo, String nameTo, String emailFrom, String nameFrom,
			String subject, String body, String fileName){

		Log.d("Mail","Enviando email con los datos: "+emailTo +" / "+nameTo +" / "+emailFrom +
				" / "+nameFrom +" / "+subject +" / "+body +" / "+fileName +" / ");

		Mail m = new Mail(); 

		String[] toArr = {emailTo}; 
		m.setTo(toArr); 
		m.setFrom(emailFrom); 
		m.setSubject(subject); 
		m.setBody(body); 

		try { 

			m.addAttachment(fileName); 

			if(m.send()) { 
				Log.i("Mail","Se ha enviado el email con los datos: "+emailTo +" / "+nameTo +" / "+emailFrom +
						" / "+nameFrom +" / "+subject +" / "+body +" / "+fileName +" / "); 
			} else { 
				Log.e("Mail","No se ha podido enviar el email con los datos: "+emailTo +" / "+nameTo +" / "+emailFrom +
						" / "+nameFrom +" / "+subject +" / "+body +" / "+fileName +" / ");
			} 
		} catch(Exception e) { 
			Log.e("Mail",("Ha habido algun problema con el email con los datos: "+emailTo +" / "+nameTo +" / "+emailFrom +
					" / "+nameFrom +" / "+subject +" / "+body +" / "+fileName +" / ");			
		}     	

	}

Te puede interesar…

1 Comentario

  1. ada

    el codigo esta igual pero no manda ningun correo 🙁

    Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *