En esta página:
En algunas ocasiones necesitamos enviar un correo dentro de nuestra aplicación Android creada con el lenguaje de programación Kotlin.
Dependerá de cómo estamos desarrollando nuestra aplicación.
Cada proceso requiere una configuración diferente.
1. Abriendo una Aplicación de Correo (Ejemplo: Gmail)
Podemos hacer uso de la clase URI y de algunos Intents concatenados con constantes como:
- ACTION_SENDTO
- EXTRA_EMAIL
- EXTRA_SUBJECT
- EXTRA_TEXT
Todas estas constantes las puedes encontrar en la documentación oficial de Android Developers.
En la documentación encontrarás otras constantes que te pueden ser de utilidad.
Importa Intent y URI, luego crea una función llamada enviarEmail() y llámala en la línea que desees.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import android.content.Intent import android.net.Uri fun enviarEmail() { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Las apps de correo deben manejar esto putExtra(Intent.EXTRA_EMAIL, arrayOf("micorreo@nubecolectiva.com")) putExtra(Intent.EXTRA_SUBJECT, "Asunto") putExtra(Intent.EXTRA_TEXT, "Mensaje") } if (intent.resolveActivity(this.packageManager) != null) { startActivity(intent) } else { println("No existen aplicaciones de correo en este dispositivo.") } } |
Explicación del código:
- Con Intent.ACTION_SENDTO le decimos que solo se abra una aplicación de correo como Gmail, Outlook, etc.
- Mediante Uri.parse(“mailto:”) le indicamos que es un correo electrónico.
- Con putExtra y los Intents con las constantes, definimos los datos del correo (destinatario, asunto y mensaje).
- Por último, mediante el componente resolveActivity() comprobamos que haya una aplicación de correo instalada en el dispositivo Android.
Adjuntar un archivo en el correo
Si necesitas enviar un archivo, por ejemplo, un archivo PDF.
Puedes hacer uso de la constante EXTRA_STREAM y pasarle la ruta del archivo en el dispositivo:
1 2 3 4 5 6 7 8 9 10 11 |
val uri: Uri = Uri.parse("file://ruta/del/archivo/pdf") val intent = Intent(Intent.ACTION_SEND).apply { type = "application/pdf" // Puedes cambiar el formato del archivo putExtra(Intent.EXTRA_EMAIL, arrayOf("micorreo@nubecolectiva.com")) putExtra(Intent.EXTRA_SUBJECT, "Asunto + adjunto") putExtra(Intent.EXTRA_TEXT, "Mensaje") putExtra(Intent.EXTRA_STREAM, uri) } startActivity(Intent.createChooser(intent, "Enviar correo...")) |
2. Desde una Actividad o Formulario
Suponiendo que estamos trabajando en la actividad principal.
Creamos el diseño del formulario (activity_main.xml):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/etEmail" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Email" android:inputType="textEmailAddress" /> <EditText android:id="@+id/etAsunto" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Asunto" /> <EditText android:id="@+id/etMensaje" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Mensaje" android:minLines="5" android:gravity="top" /> <Button android:id="@+id/btnEnviar" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Enviar" /> </LinearLayout> |
Luego en el archivo MainActivity.kt capturamos los datos del formulario.
Esto lo hacemos dentro del método principal onCreate()
Al presionar nuestro botón registramos un callback llamando al método setOnClickListener() y pasamos los datos capturados a la función enviarEmail()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import android.content.Intent import android.net.Uri import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val etEmail = findViewById<EditText>(R.id.etEmail) val etAsunto = findViewById<EditText>(R.id.etAsunto) val etMensaje = findViewById<EditText>(R.id.etMensaje) val btnEnviar = findViewById<Button>(R.id.btnEnviar) btnEnviar.setOnClickListener { val email = etEmail.text.toString().trim() val asunto = etAsunto.text.toString().trim() val mensaje = etMensaje.text.toString().trim() if (email.isNotEmpty() && asunto.isNotEmpty() && mensaje.isNotEmpty()) { enviarEmail(email, asunto, mensaje) } else { Toast.makeText(this, "Por favor, rellena todos los campos", Toast.LENGTH_SHORT).show() } } } private fun enviarEmail(email: String, asunto: String, mensaje: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") putExtra(Intent.EXTRA_EMAIL, arrayOf(email)) putExtra(Intent.EXTRA_SUBJECT, asunto) putExtra(Intent.EXTRA_TEXT, mensaje) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(this, "No existen aplicaciones de correo en este dispositivo.", Toast.LENGTH_SHORT).show() } } } |
También hacemos una validación para verificar que todos los campos han sido rellenados antes de enviar el correo.
3. Usando Una Librería SMTP: JavaMail (Automático)
La librería JavaMail o Jakarta Mail nos brinda un paquete para enviar correos desde nuestra aplicación Android.
Para usarla agrega las dependencias en tu archivo build.gradle:
1 2 3 4 5 6 |
dependencies { implementation "com.sun.mail:android-mail:1.6.7" implementation "com.sun.mail:android-activation:1.6.7" } |
Luego, en el código Kotlin de tu actividad, crea una función llamada enviarEmail()
En ella definimos las propiedades del protocolo SMTP.
Hacemos uso del método javax.mail.Authenticator() para iniciar sesión con nuestras credenciales.
Enviamos el mensaje con el método Transport.send() y validamos que el correo se envíe correctamente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import android.os.StrictMode import java.util.Properties import javax.mail.Message import javax.mail.PasswordAuthentication import javax.mail.Session import javax.mail.Transport import javax.mail.internet.InternetAddress import javax.mail.internet.MimeMessage fun enviarEmail() { // Permite operaciones de red en el hilo principal (no recomendado para producción) val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() StrictMode.setThreadPolicy(policy) val correo = "tucorreo@correo.com" val contraseña = "tupassword" val propiedades = Properties().apply { put("mail.smtp.auth", "true") put("mail.smtp.starttls.enable", "true") put("mail.smtp.host", "smtp.gmail.com") put("mail.smtp.port", "587") } val sesion = Session.getInstance(propiedades, object : javax.mail.Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication(correo, contraseña) } }) try { val mensaje = MimeMessage(sesion).apply { setFrom(InternetAddress(correo)) setRecipients(Message.RecipientType.TO, InternetAddress.parse("destinatario@correo.com")) subject = "Asunto del email" setText("Este es el cuerpo del email") } Transport.send(mensaje) println("Email enviado correctamente") } catch (e: Exception) { e.printStackTrace() println("Error al enviar el email: ${e.message}") } } |
Así de fácil, puedes enviar un correo desde tu aplicación Android desarrollada con Kotlin.
Conclusión
En este tutorial has aprendido a Cómo Enviar un Correo en Android con Kotlin.
Te será de guía para implementar el envío de correos en tu aplicación.
Recuerda practicar mucho para que seas un gran desarrollador en Android con Kotlin.