studio enviar correo android email android-intent

studio - Usar Android Intent.ACTION_SEND para enviar correos electrónicos



enviar correo android studio (13)

@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);

Estoy usando Intent.ACTION_SEND para enviar un correo electrónico. Sin embargo, cuando llamo al intent , muestra las opciones para enviar un mensaje, enviar un correo electrónico y también enviarlo a través de Bluetooth. Quiero que solo muestre las opciones para enviar un correo electrónico. ¿Cómo puedo hacer esto?


El mejor código para restringirlo solo para enviar un correo electrónico. configura este tipo para enviar solo 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 las 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 intentará abrir la aplicación de Gmail y, en caso de que un usuario no la tenga, se implementará el segundo enfoque.


Esto abrirá solo la aplicación de correo electrónico instalada en su teléfono Android.

Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); intent.putExtra(Intent.EXTRA_SUBJECT, "email subject"); intent.putExtra(Intent.EXTRA_TEXT, "message body"); try { startActivity(Intent.createChooser(intent, "send mail")); } catch (ActivityNotFoundException ex) { Toast.makeText(this, "No mail app found!!!", Toast.LENGTH_SHORT); } catch (Exception ex) { Toast.makeText(this, "Unexpected Error!!!", Toast.LENGTH_SHORT); }


Esto me salvó el día. Envía un mensaje de texto compuesto directamente a la aplicación de Gmail:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto","togmail.com", null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message"); emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString()); startActivity(Intent.createChooser(emailIntent, "Send email..."));


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 me atribuyo esta respuesta, pero creo que da la mejor respuesta para esta publicación.

Es un concepto erróneo común utilizar texto / texto simple o texto / html. Esto desencadenará cualquier aplicación que pueda manejar archivos de texto sin formato o HTML sin contexto, incluidos 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:"));

Luego puede continuar usando el selector como se sugiere a través de las otras respuestas.

Respondido por @PaulLammertsma aquí Elección del correo electrónico de Android


Noté que esta es una pregunta bastante antigua, pero es el primer resultado cuando se busca una solución de "Enviar correo" y todas las respuestas tienen un problema común:

El uso de Intent.ACTION_SEND y intent.setType("message/rfc822") dará como resultado un selector que no solo muestra las aplicaciones de correo, sino todas las aplicaciones que pueden manejar cualquier tipo de soporte MIME mediante message / rfc822, por ejemplo, .mht , .mime , .mime . Además de las aplicaciones de correo, esto podría ser Google Drive, Dropbox, Evernote, etc.

La única solución que encontré para limitar que el seleccionador envíe aplicaciones solo es usar 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(); }


Primera solución: trate de ser más específico en sus parámetros de Intención. Agregue un destinatario de mensaje por ejemplo

emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});

Segunda solución: utilice el administrador de paquetes para encontrar todas las aplicaciones capaces de enviar un mensaje y seleccionar las únicas que desea usar.


Tuve un problema similar con mi aplicación. ¡Recientemente encontré este enlace del sitio oficial de desarrolladores de Android que realmente ayuda! Intenciones comunes: correo electrónico

TL; DR:

Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));

¡Ahora, solo se te mostrarán clientes de correo electrónico!

Puede agregar un Sujeto y Cuerpo haciendo esto:

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body" );


Usando el tipo de message/rfc822 como se indica aquí: ACTION_SEND forzar el envío con correo electrónico resuelve el problema.


[Solución para API LEVEL> = 15]

Finalmente tuve éxito al enviar correos electrónicos con archivos adjuntos a SOLO clientes de correo electrónico . Lo escribo aquí porque me llevó mucho tiempo y puede ser útil para otros.

El problema es:

  • Intent.ACTION_SENDTO toma el URI de datos (para que pueda especificar el esquema "mailto:") PERO no acepta la intención: EXTRA_STREAM.

  • Intent.ACTION_SEND acepta Intent: EXTRA_STREAM (para que pueda agregar datos adjuntos) PERO solo requiere Tipo (no URI de datos, por lo que no puede especificar el esquema "mailto:").

Así Intent.ACTION_SEND le permite al usuario elegir entre varias actividades, incluso si configura Type ("message / rfc822"), porque esa aplicación / actividades puede administrar 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 usar Intent.ACTION_SENDTO para seleccionar la actividad, pero luego envíe la intención de Intent.ACTION_SEND.

Aquí mi código de solución (el archivo adjunto provino 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); }


Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("application/octet-stream");

EDITAR:
Podría intentar configurar el tipo a "message/rfc822" también.

prueba esto....