Enviar Email desde una Activity Android

Buenas tardes, en esta entrada vamos a ver como podemos enviar un Correo Electrónico desde nustro dispositivo mediante el uso de la clase Intent.


Nos puede ocurrir que necesitemos implementar en nuestra aplicación la necesidad de abrir la aplicación que tengamos instalada que gestione todo lo relacionado con el envío de un correo electrónico. Para ello, a continuación veremos como podemos hacerlo de una forma bastante intuitiva, con el uso de la clase Intent, aunque como para todo, hay múltiples formas de hacerlo.

Dicho esto vamos a ponernos manos a la obra:

  • Creación del Proyecto

    Para comenzar, nos vamos a ir a File -> New -> Android Application Project. Si por algún caso no encontramos en la lista esta opción, pulsamos sobre “Other”, donde una ventana nos aparecerá para encontrar entre una lista. Si queremos podemos filtrar los resultados escribiendo “Android” en la caja de texto, para que nos sea mas fácil.

    Una vez lo encontremos, nos aparecerá el asistente, y en su primera ventana nos disponemos a darle un nombre a nuestro proyecto, en mi caso lo he llamado “EjemploEnviarEmail”, aunque podeis darle el nombre que deseeis. Las demás opciones podeis dejarlas como están.

    Una vez tengamos nuestro nombre de proyecto, seguiremos hacia delante hasta encontrarnos con la ventana en la que se nos pide un nombre para la Activity principal, la cual llamaremos “EmailActivity”, aunque podeis darle el deseado, y su archivo layout lo llamaré “activity_email.xml”.

    Cuando hayamos terminado con el asistente, podremos comenzar a construir nuestra aplicación.

  • EmailActivity

    En cuanto tengamos nuestro Proyecto creado, tendremos nuestra Activity creada en la carpeta src/package_name/EmailActivity.java, y su archivo layout en res/layout/activity_email.xml. Dicho esto vamos a modificar el layout:

    		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    		    xmlns:tools="http://schemas.android.com/tools"
    		    android:layout_width="match_parent"
    		    android:layout_height="match_parent"
    		    tools:context=".EmailActivity" >
    		
    		    <Button
    		        android:id="@+id/btnEnviarEmail"
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:onClick="onClick"
    		        android:text="Enviar Email" />
    		
    		</LinearLayout>
    		

    Como podemos observar, solo hemos añadido un botón, cuya función será la de lanzar el Intent con unos datos que estableceremos.

    A continuación vamos a nuestra Activity EmailActivity.java, la cual comoa tnes hemos visto se encuentra en src/package_name/EmailActivity.java. Le añadiremos lo siguiente:

    		package sekth.droid.Email;
    
    		import android.app.Activity;
    		import android.content.Intent;
    		import android.net.Uri;
    		import android.os.Bundle;
    		import android.view.View;
    		
    		public class EmailActivity extends Activity {
    		
    			@Override
    			protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_email);
    			}
    		
    			public void onClick(View v) {
    				// Reemplazamos el email por algun otro real
    				String[] to = { "email1@ejemplo.com", "otroEmail@ejemplo.com" };
    				String[] cc = { "otroEmail@ejemplo.com" };
    				enviar(to, cc, "Hola",
    						"Esto es un email enviado desde una app de Android");
    			}
    		
    			private void enviar(String[] to, String[] cc,
    				String asunto, String mensaje) {
    				Intent emailIntent = new Intent(Intent.ACTION_SEND);
    				emailIntent.setData(Uri.parse("mailto:"));
    				//String[] to = direccionesEmail;
    				//String[] cc = copias;
    				emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
    				emailIntent.putExtra(Intent.EXTRA_CC, cc);
    				emailIntent.putExtra(Intent.EXTRA_SUBJECT, asunto);
    				emailIntent.putExtra(Intent.EXTRA_TEXT, mensaje);
    				emailIntent.setType("message/rfc822");
    				startActivity(Intent.createChooser(emailIntent, "Email "));
    			}
    		}
    		

    Vamos a analizar sus métodos:

    • protected void onCreate (Bundle savedInstanceState)

      Su código:

      				@Override
      				protected void onCreate(Bundle savedInstanceState) {
      					super.onCreate(savedInstanceState);
      					setContentView(R.layout.activity_email);
      				}
      				

      Como podemos ver, en el método onCreate no hemos hecho nada, lo único que hemos establecido su archivo layout, pero por lo demás, no se le aplica ninguna otra funcionalidad.

    • public void onClick(View v)

      Vemos su código a continuación:

      				public void onClick(View v) {
      					// Reemplazamos el email por algun otro real
      					String[] to = { "email1@ejemplo.com", "otroEmail@ejemplo.com" };
      					String[] cc = { "otroEmail@ejemplo.com" };
      					enviar(to, cc, "Hola",
      							"Esto es un email enviado desde una app de Android");
      				}
      				

      Este método será ejecutado cuando pulsemos el Button que tenemos en nuestro xml, estableciendolo mediante el atributo android:onClick=”onClick”. En este método tenemos 2 arrays de String. Uno de ellos, llamado to, contiene los email a los cuales serán enviados directamente los correos, y el otro array llamado cc enviará copias a las direcciones que vayan dentro de el. Una vez hayamos establecido los correos, llamamos al método enviar, el cual vemos a continuación.

    • private void enviar(String[] to, String[] cc, String asunto, String mensaje)

      Vemos su código:

      				private void enviar(String[] to, String[] cc,
      					String asunto, String mensaje) {
      					Intent emailIntent = new Intent(Intent.ACTION_SEND);
      					emailIntent.setData(Uri.parse("mailto:"));
      					//String[] to = direccionesEmail;
      					//String[] cc = copias;
      					emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
      					emailIntent.putExtra(Intent.EXTRA_CC, cc);
      					emailIntent.putExtra(Intent.EXTRA_SUBJECT, asunto);
      					emailIntent.putExtra(Intent.EXTRA_TEXT, mensaje);
      					emailIntent.setType("message/rfc822");
      					startActivity(Intent.createChooser(emailIntent, "Email "));
      				}
      				

      Como podemos ver, en este método recibimos la lista de emails a los cuales vamos a enviar un mensaje, además de la lista de emails que recibirán una copia del mensaje, y por otro lado recibimos el Asunto del email y el cuerpo del mensaje.

      Lo primero que hacemos es crear un objeto de la clase Intent que es el que realizará al acción de enviar, mediante la constante Intent.ACTION_SEND:

      				Intent emailIntent = new Intent(Intent.ACTION_SEND);
      				

      A continuación, vamos a ir agregando información a este Intent para cargarlo con los parámetros que hemos recibido:

      				emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
      				emailIntent.putExtra(Intent.EXTRA_CC, cc);
      				emailIntent.putExtra(Intent.EXTRA_SUBJECT, asunto);
      				emailIntent.putExtra(Intent.EXTRA_TEXT, mensaje);
      				emailIntent.setType("message/rfc822");
      				

      Como vemos, vamos añadiendo al Intent y mediante la ayuda de las constantes de Intent.EXTRA_XXXXX todos los argumentos que hemos recibido, y por último establecemos el tipo de mensaje que contiene, mediante el string “message/rfc822”.

      Por último, invocamos al método startActivity:

      				startActivity(Intent.createChooser(emailIntent, "Email "));
      				

      Hemos añadido el Intent junto con la llamada al método createChooser, con el cual nos aparecerá una ventana adicional para elegir un cliente de e-mail con el cual podemos enviar el correo, en caso de que tengamos mas de 1 aplicación que pueda manejar emails.

Con esto, nuestra aplicación ya es funcional, y podemos ejecutarla para ver como funciona.

A continuación unas imágenes de la aplicación:

Principal Aplicación Email

Por último, un vídeo en el que veremos la aplicación en ejecución:


Esta, como bien he especificado antes, es una de las maneras que tenemos para poder enviar un correo electrónico desde nuestra aplicación.

El código dl ejemplo podeis descargarlo de aquí

Sin más, cualquier aporte o corrección son bienvenidos.

Saludos!!!

  • Nacho

    Hola, buen aporte!

    ¿Sabes cómo hacer esto mismo de forma transparente al usuario?
    Es decir, poder enviar un e-mail en el transcurso de la aplicación si algo sucede sin que el usuario se percate de ello, “por detrás de la interfaz”, sobre todo para control de errores e informar al administrador.

    Gracias.

    • Buenas Nacho, ante todo perdona el retraso pero he estado algo ocupado.

      Esto se puede lograr usando la API JavaMail de Java, haciendo una pequeña búsqueda he encontrado una entrada en StackOverflow

      URL: http://stackoverflow.com/questions/2020088/sending-email-in-android-using-javamail-api-without-using-the-default-built-in-a

      Aunque quizás si lo que quieres es este tipo de funcionalidad, podrías hacer un archivo de texto donde guardas un log de errores, y cada vez que se entra en la app mandarlos o por correo (aunque esto podría ser muy bestia si tienes uan gran cantidad de usuarios) o enviartelos a algún tipo de Web Service donde mantienes todos los registros y tal vez pueda ser mas cómodo para el Correo , aunque es solo una idea.

      Espero que te sirva de ayuda Nacho,

      Saludos!!!

  • Hola que tal, que buen codigo, justo lo que necesitaba para aprender a hacerlo, ahora te quiero preguntar, Quiero desarrollar un programita cliente-servidor, es decir mis usuarios descargaran un programita cliente. y Yo desde mi servidor envio mensajes a todos mis clientes que hayan descargado mi aplicacion, mensajes conteniendo solo texto. Me podras orientar para saber por donde buscarle….?? saludos dsd México.

    • Buenas tardes Ricardo,

      Deberías investigar sobre la plataforma “Google Cloud Messaging”, la cual trata justo de esto que quieres, poder enviar información desde el servidor a los usuarios que tengan tu aplicación en Android.

      Puedes buscar mas información en su web:

      Dado que no he investigado mucho en esto no puedo serte mucho mas de ayuda, pero parece que es lo que andas buscando ;).

      Saludos!

  • toni jimenez

    Hola ricardo, estoy haciendo mi primera app en java y googleando sobre el tema del mail he llegado hasta tu post. mi pregunta es la siguiente:

    lo que quiero hacer es que el usuario escoja una opción a la hora de enviar el mail, de forma que esa opción es un grupo de varios (3,5,10, aun no lo se) destinatarios, así que en realidad lo único que debe ver es una pantalla de opciones y escoger una de ellas, después se escribe el texto y se envían los mails, por supuesto antes de eso habrá puesto su propio mail en una pantalla de configuración.

  • toni jimenez

    Hola de nuevo David, hace poco he tenido la oportunidad de probar el ejemplo que me recomendaste, pero no me funciona, simplemente los mail no llegan al destino. supongo que estoy haciendo algo mal, pero no se que puede ser. No te voy a pedir que busques mi error, ya que de todas maneras he pensado usar el tuyo que funciona perfecto, primero pediré al usuario sus datos en una opción de configuración y luego los usare pare enviar el mail, pero ocultando los campos de direcciones, dejando solo el cuerpo del mail y una opción de adjuntar.

    Tengo una pregunta, como puedo crear un aviso que cuando intente seguir sin haber terminado la configuración le diga que no puede hacerlo. Algo así como “debes completar los datos personales antes de poder enviar”

  • francisco

    Muy buen tutorial, ya lo tenia algo claro, ando buscando la forma de adjuntar varias imágenes. Hasta el momento puedo adjuntar una, pero si quiero adjuntar más no las toma en cuenta.

    i.putExtra(Intent.EXTRA_STREAM,Uri.parse(“file://”+Environment.getExternalStorageDirectory()+”/JApp/RS.jpg”));

    alguna idea?

    Muchas gracias!!

    • Buenas Francisco,

      La idea que se me ocurre mas fácil es que hagas un ArrayList con las rutas (por ejemplo) o de arrays de bytes con el intent, y así las tendrás disponibles en la siguiente activity.

      Espero que te ayude!

      Saludos!

    • Perdona Francisco, en mi mensaje anterior faltaban datos (no lo entendí bien).

      Para enviar múltiples imágenes deberás usar un action en el Intent, algo como lo siguiente:

      intent.setAction(Intent.ACTION_SEND_MULTIPLE); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, arrayUri); intent.setType(“image/*”);

      (No puedo formatearlo como código desde el móvil)

      Espero que te sea de ayuda!

      Saludos

  • Muy buenas David. Estoy con mi primera App. es un examen para mis alumnos, se autocorrige y te da la nota. Me gustaría poder capturar el contenido de la pantalla (del layout) y enviarlo por mail a mi correo y al del alumno. Llevo varios días atascado y no encuentro respuesta.
    ¿Me puedes dar alguna pista?

    Un saludo y muchas gracias.

    • Buenas Javier,

      Si mal no entiendo, quieres establecer una serie de “preguntas” que pueden tener diferentes radiobuttons o checkbox, y que el usuario pueda elegir y en un paso final validarse todo y enviar correo tanto al alumno como al profesor.

      Así de primeras te diría que no es complicado, simplemente tendrías bastante mas trabajo a la hora de meter los datos en la aplicación. Con estos datos, ya en la aplicación mirar que tratar las preguntas para montar un layout a medida.

      Por ejemplo:
      Si la pregunta es de opción múltiple -> Usamos CheckBox para que el usuario pueda elegir varios
      Si la pregunta es de opción única -> Usamos unos RadioButton para recoger la respuesta.

      Por detrás de esto tendrás unos elementos para que se comuniquen los layout con tus modelospara ir recogiendo las respuestas, y ya al final del examen ejecutas el algoritmo que compruebe esto y saque una especie de informe.

      Así es mas o menos como lo haría yo.

      Por tanto primero tienes que definir el tipo de dato que vas a manejar, y ya según eso ir montando los diferentes layouts que vas a usar.

      Espero que te sea de ayuda Javier, cualquier duda no dudes en escribirme.

      Saludos!

      • Gracias David por responder. Todo eso ya lo tengo y funciona. 53 radio group con 3 radio buton cada uno.
        Cuenta las acertadas, las fallidas, las totales, da el informe de todo y la nota. Pone la respuesta en verde si acierta y en rojo si falla.
        Solo me falta sacar el layout a un pdf y enviarlo por mail.
        Te pongo aquí el enlace de lo que llevo.
        Aún está muy básica en cuanto a estética, pero todo se andará.

        https://www.dropbox.com/s/yjmlvqi2ogsdrdr/TeTBT.apk?dl=0

        Un saludo y gracias de nuevo.

        • Buenas,

          Lo llevas muy avanzado y perdona porque quizás nada de lo que te conté te podría haber ayudado demasiado para ello, sin embargo puede que de algo te sirva ;).

          Respecto a recoger el contenido del layout y hacerlo PDF, tienes varias opciones:

          • Usar librerías externas para generar pdf en base a lo que requiera. Esto quiere decir que seguramente tendrás que formar un html con todo el contenido, y pasarle a la librería el contenido para generar un PDF. Esto puede ser un proceso pesado, ya que los PDF se las traen.
          • Usar un servidor externo en internet al que le mandas el contenido, y allí tratas la creación del PDF (Hay librerías open source para esto y que son mas usadas que las de Android), y de paso, puede enviar ese PDF a los usuarios que quieras configurando la salida donde quieras, además de las múltiples ventajas que puede tener esto centralizado.

          Al menos es lo que yo haría, me decanto mas por la segunda opción, pero es mas pesada en forma de trabajo, algo mas larga pero mas efectiva seguramente.

          Saludos y esta vez espero haber sido mas de ayuda 😉