Uso de Android Intent.ACTION_SEND para enviar correo electrónico
Estoy utilizando Intent.ACTION_SEND
para enviar un correo electrónico. Sin embargo, cuando llamo a la intent
que está mostrando opciones para enviar un mensaje, enviar un correo electrónico, y también para enviar a través de bluetooth. Quiero que sólo muestre opciones para enviar un correo electrónico. ¿Cómo puedo hacer esto?
- Trivial: Obtener confirmación de correo electrónico enviado en android
- Envío de correo electrónico formateado HTML en Android
- Envío de correo html si la aplicación permite
- Cómo enviar un correo electrónico con un archivo adjunto en Android
- Correo electrónico html responsivo en la aplicación de correo nativo de Android android nexus 5 (4.4.2)
- ACTION_SENDTO para enviar un correo electrónico
- En la aplicación para Android, ¿puedo escuchar los correos electrónicos que llegan a GMAIL?
- No puedo enviar Yahoo Mail desde Java Mail Api
- Android Enviar Intención adjuntar foto de sdcard como archivo de 0 longitud
- Cómo hacer ImageButton directamente abrir compositor de correo electrónico en el clic?
- Intención de correo electrónico que ignora los saltos de línea en texto predefinido (Android)
- Android: cómo abrir una vista de compositor de correo?
- ACTION_SEND fuerza el envío con correo electrónico
Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("application/octet-stream");
EDITAR:
También puede intentar establecer el tipo "message/rfc822"
.
prueba esto….
@Ganapathy: prueba este código para mostrar gmail
Intent gmail = new Intent(Intent.ACTION_VIEW); gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); gmail.setData(Uri.parse("[email protected]")); gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something"); gmail.setType("plain/text"); gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!"); startActivity(gmail);
Esto te ayudara.
On your button click : Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); email.putExtra(Intent.EXTRA_SUBJECT, "subject"); email.putExtra(Intent.EXTRA_TEXT, "message"); email.setType("message/rfc822"); startActivity(Intent.createChooser(email, "Choose an Email client :"));
No estoy tomando crédito por esta respuesta, pero creo que da la mejor respuesta para este post.
Es un concepto erróneo común usar text / plain o text / html. Esto activará cualquier aplicación que pueda manejar archivos de texto simples o HTML sin ningún contexto, como Google Drive, Dropbox, Evernote y Skype.
En su lugar use un ACTION_SENDTO
, proporcionando el mailto:
Uri
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
A continuación, puede proceder con el selector como se sugiere a través de las otras respuestas.
Respondido por @PaulLammertsma aquí Android selector de correo electrónico
Utilizando el tipo de message/rfc822
como se indica aquí: ACTION_SEND fuerza el envío con correo electrónico resuelve el problema.
Tuve un problema similar con mi aplicación. Recientemente he encontrado este enlace forman el sitio oficial de desarrolladores android que realmente ayuda! Intenciones Comunes: Email
TL, DR:
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
Ahora, sólo se mostrará a los clientes de correo electrónico!
Puede agregar un objeto y un cuerpo haciendo esto:
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body" );
Primera solución: trate de ser más específico en sus parámetros de Intent. Agregar un destinatario de mensajes por ejemplo
emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
Segunda solución: utilice el gestor de paquetes para encontrar todas las aplicaciones capaces de enviar un mensaje y seleccione las únicas que desee utilizar.
Me doy cuenta de que esta es una pregunta bastante antigua, pero es el primer resultado al buscar una solución de "Enviar correo" y todas las respuestas tienen un problema común:
Utilizando Intent.ACTION_SEND
y intent.setType("message/rfc822")
resultará en un selector que no sólo mostrará aplicaciones de correo sino todas las aplicaciones que puedan manejar cualquier tipo de soporte de MIME por mensaje / rfc822, por ejemplo .mhtml
, .mht
, .mime
. Al lado de aplicaciones de correo electrónico esto podría ser Google Drive, Dropbox, Evernote, etc.
La única solución que encontré para limitar el selector a las aplicaciones de correo sólo es utilizar Intent.ACTION_SENDTO en su lugar:
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null)); intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail"); intent.putExtra(Intent.EXTRA_TEXT , "My Message"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); }
El mejor código para restringirlo a sólo enviar un correo electrónico. Defina este tipo para enviar sólo un correo electrónico. i.setType("message/rfc822");
Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); i.putExtra(Intent.EXTRA_TEXT , "body of email"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); }
Esta es una combinación de soluciones de Jack Dsilva y Jignesh Mayani:
try { Intent gmailIntent = new Intent(Intent.ACTION_SEND); gmailIntent.setType("text/html"); final PackageManager pm = _activity.getPackageManager(); final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0); String gmailActivityClass = null; for (final ResolveInfo info : matches) { if (info.activityInfo.packageName.equals("com.google.android.gm")) { gmailActivityClass = info.activityInfo.name; if (gmailActivityClass != null && !gmailActivityClass.isEmpty()) { break; } } } gmailIntent.setClassName("com.google.android.gm", gmailActivityClass); gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message"); gmailIntent.setData(Uri.parse("[email protected]")); this._activity.startActivity(gmailIntent); } catch (Exception e) { Intent i = new Intent(Intent.ACTION_SEND); i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); i.putExtra(Intent.EXTRA_SUBJECT, "Subject"); i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary i.putExtra(Intent.EXTRA_TEXT, "Email message"); i.setType("plain/text"); this._activity.startActivity(i); }
Por lo tanto, al principio se intentará abrir la aplicación de Gmail y en caso de que un usuario no lo tiene, entonces el segundo enfoque se aplicará.
[Solución para API LEVEL> = 15]
Finalmente he tenido éxito en el envío de correo electrónico con adjuntos a sólo clientes de correo electrónico . Lo escribo aquí porque me tomó mucho tiempo y puede ser útil para otros.
El problema es:
-
Intent.ACTION_SENDTO toma URI de datos (por lo que puede especificar el esquema "mailto:"), pero no acepta intención: EXTRA_STREAM.
-
Intent.ACTION_SEND acepta Propósito: EXTRA_STREAM (por lo que puede agregar datos adjuntos) PERO solo toma Tipo (no URI de Datos para que no pueda especificar el esquema "mailto:").
Así que Intent.ACTION_SEND permite que el usuario elija entre varias Actividades, incluso si setType ("message / rfc822"), porque esa aplicación o actividades pueden gestionar todos los tipos de archivos (típicamente GDrive / Dropbox Apps) e incluso archivos de mensajes de correo electrónico.
La solución está en el método setSelector. Con este método puede utilizar Intent.ACTION_SENDTO para seleccionar la Actividad, pero luego enviar el Intent.ACTION_SEND Propósito.
Aquí mi código de solución (el archivo adjunto vino de un FileProvider, pero podría ser cualquier archivo):
{ Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO); emailSelectorIntent.setData(Uri.parse("mailto:")); final Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); emailIntent.setSelector( emailSelectorIntent ); Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile); emailIntent.putExtra(Intent.EXTRA_STREAM, attachment); if( emailIntent.resolveActivity(getPackageManager()) != null ) startActivity(emailIntent); }
- ¿Cómo detectar presencia de teclado de hardware?
- Desarrollador de Android "Subir nuevo APK a la producción 99% completa" y pegado