Enviar correo electrónico de intención

Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/html"); intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "I'm email body."); startActivity(Intent.createChooser(intent, "Send Email")); 

El código anterior abre un cuadro de diálogo que muestra las siguientes aplicaciones: Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype, etc.

En realidad, quiero filtrar estas opciones de lista. Quiero mostrar solo aplicaciones relacionadas con el correo electrónico, por ejemplo, Gmail, Yahoo Mail. ¿Cómo hacerlo?

He visto ese ejemplo en la aplicación ‘Android Market’.

  1. Abra la aplicación Android Market
  2. Abra cualquier aplicación donde el desarrollador haya especificado su dirección de correo electrónico. (Si no puede encontrar dicha aplicación solo abra mi aplicación: – market: // details? Id = com.becomputer06.vehicle.diary.free, O busque por ‘Vehicle Diary’)
  3. Desplácese hasta ‘DESARROLLADOR’
  4. Haga clic en ‘Enviar correo electrónico’

El cuadro de diálogo muestra solo aplicaciones de correo electrónico, por ejemplo, Gmail, Yahoo Mail, etc. No muestra Bluetooth, Orkut, etc. ¿Qué código produce dicho diálogo?

cuando cambie su intent.setType como a continuación, obtendrá

 intent.setType("text/plain"); 

Utilice android.content.Intent.ACTION_SENDTO para obtener solo la lista de clientes de correo electrónico, sin facebook ni otras aplicaciones. Solo los clientes de correo electrónico. Ex:

 new Intent(Intent.ACTION_SENDTO); 

No sugeriría que vaya directamente a la aplicación de correo electrónico. Permita que el usuario elija su aplicación de correo electrónico favorita. No lo constriñes.

Si usa ACTION_SENDTO, putExtra no funciona para agregar sujeto y texto a la intención. Use Uri para agregar el tema y el texto del cuerpo.

EDITAR: Podemos usar message/rfc822 lugar de "text/plain" como tipo MIME. Sin embargo, eso no indica “solo ofrecer clientes de correo electrónico”, sino que indica “ofrecer todo lo que admita datos de message / rfc822”. Eso podría incluir fácilmente alguna aplicación que no sean clientes de correo electrónico.

message/rfc822 admite tipos MIME de .mhtml, .mht, .mime

La respuesta aceptada no funciona en el 4.1.2. Esto debería funcionar en todas las plataformas:

 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto","abc@gmail.com", null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Body"); startActivity(Intent.createChooser(emailIntent, "Send email...")); 

Espero que esto ayude.

Actualización: de acuerdo con marcwjj , parece que en 4.3, necesitamos pasar una matriz de cadena en lugar de una cadena para la dirección de correo electrónico para que funcione. Es posible que necesitemos agregar una línea más:

 intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses 

Enlace de referencia

Hay tres enfoques principales:

 String email = /* Your email address here */ String subject = /* Your subject here */ String body = /* Your body here */ String chooserTitle = /* Your chooser title here */ 

1. Uri personalizado:

 Uri uri = Uri.parse("mailto:" + email) .buildUpon() .appendQueryParameter("subject", subject) .appendQueryParameter("body", body) .build(); Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri); startActivity(Intent.createChooser(emailIntent, chooserTitle)); 

2. Uso de extras de Intent :

 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(Intent.EXTRA_TEXT, body); //emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, body); //If you are using HTML in your body text startActivity(Intent.createChooser(emailIntent, "Chooser Title")); 

3. Support Library ShareCompat :

 Activity activity = /* Your activity here */ ShareCompat.IntentBuilder.from(activity) .setType("message/rfc822") .addEmailTo(email) .setSubject(subject) .setText(body) //.setHtmlText(body) //If you are using HTML in your body text .setChooserTitle(chooserTitle) .startChooser(); 

Esto se cita del documento oficial de Android, lo he probado en Android 4.4 y funciona perfectamente. Vea más ejemplos en https://developer.android.com/guide/components/intents-common.html#Email

 public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } 

Una respuesta tardía, aunque descubrí una solución que podría ayudar a otros

 Intent emailIntent = new Intent(Intent.ACTION_SENDTO); emailIntent.setData(Uri.parse("mailto: abc@xyz.com")); startActivity(Intent.createChooser(emailIntent, "Send feedback")); 

Este fue mi resultado (Gmail + Inbox y nada más)

enter image description here

Obtuve esta solución del sitio de Google Developers

Tratar:

 intent.setType("message/rfc822"); 

Esto funciona para mí:

 Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL , new String[] { "me@somewhere.com" }); intent.putExtra(Intent.EXTRA_SUBJECT, "My subject"); startActivity(Intent.createChooser(intent, "Email via...")); 

es decir, use la acción ACTION_SENDTO en lugar de la acción ACTION_SEND . Lo probé en un par de dispositivos Android 4.4 y limita la ventana emergente del selector para que solo muestre las aplicaciones de correo electrónico (correo electrónico, Gmail, Yahoo Mail, etc.) e inserta correctamente la dirección de correo electrónico y el asunto en el correo electrónico.

Esta es la manera de hacerlo de acuerdo con los Documentos para desarrolladores de Android agregue estas líneas de código a su aplicación:

 Intent intent = new Intent(Intent.ACTION_SEND);//common intent intent.setData(Uri.parse("mailto:")); // only email apps should handle this 

Si desea agregar el cuerpo y el tema, agregue esto

 intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here"); intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" ); 

Si solo desea los clientes de correo electrónico, debe usar android.content.Intent.EXTRA_EMAIL con una matriz. Aquí va un ejemplo:

 final Intent result = new Intent(android.content.Intent.ACTION_SEND); result.setType("plain/text"); result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient }); result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); result.putExtra(android.content.Intent.EXTRA_TEXT, body); 

El siguiente código funciona bien para mí.

 Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("message/rfc822"); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"}); Intent mailer = Intent.createChooser(intent, null); startActivity(mailer); 

Finalmente surge la mejor manera de hacerlo

  String to = "test@gmail.com"; String subject= "Hi I am subject"; String body="Hi I am test body"; String mailTo = "mailto:" + to + "?&subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body); Intent emailIntent = new Intent(Intent.ACTION_VIEW); emailIntent.setData(Uri.parse(mailTo)); startActivity(emailIntent); 

Editar: ya no funciona con las nuevas versiones de Gmail

Esta fue la única forma que encontré en ese momento para que funcionara con cualquier personaje.

La respuesta de Doreamon es la correcta, ya que funciona con todos los personajes en las nuevas versiones de Gmail.

Respuesta anterior:


Aquí esta el mio. Parece que funciona en todas las versiones de Android, con soporte de cuerpo de asunto y mensaje, y admite caracteres completos de utf-8:

 public static void email(Context context, String to, String subject, String body) { StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to)); if (subject != null) { builder.append("?subject=" + Uri.encode(Uri.encode(subject))); if (body != null) { builder.append("&body=" + Uri.encode(Uri.encode(body))); } } String uri = builder.toString(); Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri)); context.startActivity(intent); } 

Ninguna de estas soluciones funcionaba para mí. Aquí hay una solución mínima que funciona en Lollipop. En mi dispositivo, solo Gmail y las aplicaciones de correo electrónico nativas aparecen en la lista de selectores resultante.

 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + Uri.encode(address))); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(Intent.EXTRA_TEXT, body); startActivity(Intent.createChooser(emailIntent, "Send email via...")); 

El siguiente código funcionó para mí.

 import android.support.v4.app.ShareCompat; . . . . final Intent intent = ShareCompat.IntentBuilder .from(activity) .setType("application/txt") .setSubject(subject) .setText("Hii") .setChooserTitle("Select One") .createChooserIntent() .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); activity.startActivity(intent); 

Esto funciona para mí perfectamente bien:

  Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("mailto:" + address)); startActivity(Intent.createChooser(intent, "E-mail")); 

Funciona en todas las versiones de Android:

 String[] TO = {"email@server.com"}; Uri uri = Uri.parse("mailto:email@server.com") .buildUpon() .appendQueryParameter("subject", "subject") .appendQueryParameter("body", "body") .build(); Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri); emailIntent.putExtra(Intent.EXTRA_EMAIL, TO); startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

Si desea asegurarse de que su intención sea manejada solo por una aplicación de correo electrónico (y no por otros mensajes de texto o aplicaciones sociales), utilice la acción ACTION_SENDTO e incluya el esquema de datos “mailto:”. Por ejemplo:

 public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } 

Encontré esto en https://developer.android.com/guide/components/intents-common.html#Email

La mayoría de estas respuestas funcionan solo para un caso simple cuando no está enviando archivo adjunto . En mi caso, a veces necesito enviar archivos adjuntos (ACTION_SEND) o dos archivos adjuntos (ACTION_SEND_MULTIPLE).

Así que tomé los mejores enfoques de este hilo y los combiné. Está utilizando ShareCompat.IntentBuilder la biblioteca de ShareCompat.IntentBuilder pero solo muestro aplicaciones que coinciden con ACTION_SENDTO con “mailto:” uri. De esta manera, obtengo solo una lista de aplicaciones de correo electrónico con soporte para archivos adjuntos:

 fun Activity.sendEmail(recipients: List, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) { val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile) val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")) val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0) val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0) val targetedIntents = originalIntentResults .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } } .map { createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName } } .toMutableList() val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText()) finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray()) startActivity(finalIntent) } private fun Activity.createEmailShareIntent(recipients: List, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent { val builder = ShareCompat.IntentBuilder.from(this) .setType("message/rfc822") .setEmailTo(recipients.toTypedArray()) .setStream(file) .setSubject(subject) if (secondFile != null) { builder.addStream(secondFile) } if (text != null) { builder.setText(text) } return builder.intent } 

Tal vez deberías probar esto: intent.setType("plain/text");

Lo encontré aquí . Lo he usado en mi aplicación y solo muestra las opciones de correo electrónico y Gmail.

Utilizar esta:

 boolean success = EmailIntentBuilder.from(activity) .to("support@example.org") .cc("developer@example.org") .subject("Error report") .body(buildErrorReport()) .start(); 

usar build gradle:

 compile 'de.cketti.mailto:email-intent-builder:1.0.0' 

Esto es lo que uso, y funciona para mí:

 //variables String subject = "Whatever subject you want"; String body = "Whatever text you want to put in the body"; String intentType = "text/html"; String mailToParse = "mailto:"; //start Intent Intent variableName = new Intent(Intent.ACTION_SENDTO); variableName.setType(intentType); variableName.setData(Uri.parse(mailToParse)); variableName.putExtra(Intent.EXTRA_SUBJECT, subject); variableName.putExtra(Intent.EXTRA_TEXT, body); startActivity(variableName); 

Esto también le permitirá al usuario elegir su aplicación de correo electrónico preferida. Lo único que esto no le permite hacer es configurar la dirección de correo electrónico del destinatario.

Este código está funcionando en mi dispositivo

 Intent mIntent = new Intent(Intent.ACTION_SENDTO); mIntent.setData(Uri.parse("mailto:")); mIntent.putExtra(Intent.EXTRA_EMAIL , new String[] {"mahendrarajdhami@gmail.com"}); mIntent.putExtra(Intent.EXTRA_SUBJECT, ""); startActivity(Intent.createChooser(mIntent, "Send Email Using...")); 

Si desea orientar sus anuncios a Gmail, puede hacer lo siguiente. Tenga en cuenta que la intención es “ACTION_SENDTO” y no “ACTION_SEND” y los campos de intención extra no son necesarios para Gmail.

 String uriText = "mailto:youremail@gmail.com" + "?subject=" + Uri.encode("your subject line here") + "&body=" + Uri.encode("message body here"); Uri uri = Uri.parse(uriText); Intent sendIntent = new Intent(Intent.ACTION_SENDTO); sendIntent.setData(uri); if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(Intent.createChooser(sendIntent, "Send message")); } 

Componer un correo electrónico en el cliente de correo electrónico del teléfono:

 Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("plain/text"); intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "some@email.address" }); intent.putExtra(Intent.EXTRA_SUBJECT, "subject"); intent.putExtra(Intent.EXTRA_TEXT, "mail body"); startActivity(Intent.createChooser(intent, "")); 
  Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto", email, null)); if (emailIntent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(Intent.createChooser(emailIntent, "Send Email...")); } else { Toast.makeText(context, "No apps can perform this action.", Toast.LENGTH_SHORT).show(); } 

Usando intent.setType("message/rfc822"); funciona, pero muestra aplicaciones adicionales que no necesariamente manejan los correos electrónicos (por ejemplo, GDrive). Usar Intent.ACTION_SENDTO con setType("text/plain") es lo mejor, pero debe agregar setData(Uri.parse("mailto:")) para obtener los mejores resultados (solo aplicaciones de correo electrónico). El código completo es el siguiente:

  Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.setData(Uri.parse("mailto:IT@RMAsoft.NET")); intent.putExtra(Intent.EXTRA_SUBJECT, "Email from My app"); intent.putExtra(Intent.EXTRA_TEXT, "Place your email message here ..."); startActivity(Intent.createChooser(intent, "Send Email"));