¿Cómo enviar correo electrónico con datos adjuntos utilizando sólo aplicaciones de correo electrónico?

Hay dos requisitos:

  • Correo electrónico con adjunto
  • En el selector de Intent , solo deben haber aplicaciones de correo electrónico.

Lo que he sabido / hecho:

  • Intent.ACTION_SENDTO con el intent.setData(Uri.parse("mailto:")) puede cerciorarse de que hay solamente apps del email en el selector del Intent pero no traerá el accesorio (para algunas aplicaciones como Gmail él, pero hay también muchos Aplicaciones que ignorarán el archivo adjunto).

  • Intent.ACTION_SEND puede enviar correo electrónico con datos adjuntos. Sin embargo, en el selector de Intent , habrá aplicaciones que en realidad no son aplicaciones de correo electrónico, pero pueden responder a Intent.ACTION_SEND . El uso de intent.setType("message/rfc822") puede reducir el número de esas aplicaciones pero no todas.

  • Referencias esta respuesta: https://stackoverflow.com/a/8550043/3952691 y casi tener éxito en mis metas. Mi código es el siguiente:

     private static void sendFeedbackWithAttachment(Context context, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0); if (resolveInfos.isEmpty()) { Toast.makeText(context, context.getString(R.string.error_activity_not_found), Toast.LENGTH_SHORT).show(); } else { // ACTION_SEND may be replied by some apps that are not email apps. However, // ACTION_SENDTO doesn't allow us to choose attachment. As a result, we use // an ACTION_SENDTO intent with email data to filter email apps and then send // email with attachment by ACTION_SEND. List<LabeledIntent> intents = new ArrayList<>(); Uri uri = getLatestLogUri(); for (ResolveInfo info : resolveInfos) { Intent i = new Intent(Intent.ACTION_SEND); i.setPackage(info.activityInfo.packageName); i.setClassName(info.activityInfo.packageName, info.activityInfo.name); i.putExtra(Intent.EXTRA_EMAIL, new String[] { Def.Meta.FEEDBACK_EMAIL }); i.putExtra(Intent.EXTRA_SUBJECT, subject); i.putExtra(Intent.EXTRA_STREAM, uri); intents.add(new LabeledIntent(i, info.activityInfo.packageName, info.loadLabel(context.getPackageManager()), info.icon)); } Intent chooser = Intent.createChooser(intents.remove(0), context.getString(R.string.send_feedback_to_developer)); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new LabeledIntent[intents.size()])); context.startActivity(chooser); } } 

    Sin embargo, en algunos dispositivos (por ejemplo, Xiaomi 2S con MIUI V5, no sé si esto puede estar influenciado por una ROM de terceros), el resultado es un selector Intent vacío. Y parece que encima de Android 6.0, Intent.EXTRA_INITIAL_INTENTS tiene algunos bugs ( Custom intent-chooser – ¿por qué en Android 6 muestra celdas vacías ? , y otra: https://code.google.com/p/android/issues / Detail? Id = 202693 ).

Como resultado, no sé cómo lograr mis metas. Por favor, ayúdame, gracias de antemano.

Prueba el siguiente código para Enviar un correo

 String filename="filename.vcf"; File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename); Uri path = Uri.fromFile(filelocation); Intent emailIntent = new Intent(Intent.ACTION_SEND); // set the type to 'email' emailIntent .setType("vnd.android.cursor.dir/email"); String to[] = {"asd@gmail.com"}; emailIntent .putExtra(Intent.EXTRA_EMAIL, to); // the attachment emailIntent .putExtra(Intent.EXTRA_STREAM, path); // the mail subject emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject"); startActivity(Intent.createChooser(emailIntent , "Send email...")); 

Pruebe esto más eficiente:

  String[] TO = {"test@domain.com"}; Uri uri = Uri.parse("mailto:test@domain.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...")); 

Hay dos maneras de hacer esto

OPCIÓN 1

  Intent emailIntent = new Intent( android.content.Intent.ACTION_VIEW); //Option 1 Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "sendme@me.com"); emailIntent.setData(data); startActivity(Intent.createChooser(emailIntent, "")); 

Resultado

Introduzca aquí la descripción de la imagen

OPCION 2

Funciona perfactly excepto que no filtrará hacia fuera ftp

  //Option 2 emailIntent = new Intent( android.content.Intent.ACTION_SEND); emailIntent.setType("message/rfc822"); final String[] toRecipients = new String[] { "sendme@me.com", "", }; emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, toRecipients); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "blah blah subject"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml("blah blah body")); startActivity(Intent.createChooser(emailIntent, "")); 

Resultado

Introduzca aquí la descripción de la imagen

Ambas maneras tienen defectos leves que les muestro las dos maneras que ahora es hasta usted para elegir uno.

  • Android: no se puede enviar el archivo TXT como archivo adjunto al correo electrónico ("No se pudo enviar el archivo adjunto")
  • Enviar correo electrónico HTML con Gmail 6.11.6 con intención
  • Obtener correo electrónico de Facebook después de iniciar sesión en Android
  • Android: Cómo confirmar que el correo electrónico se ha enviado correctamente
  • Utilizar etiqueta de tabla en Android Email
  • Uso de Android Intent.ACTION_SEND para enviar correo electrónico
  • Android Enviar Intención adjuntar foto de sdcard como archivo de 0 longitud
  • Envío de correo electrónico desde la aplicación de Android al hacer clic en el botón
  • Cómo abrir la bandeja de entrada de correo predeterminado desde el código android?
  • Envío de correo electrónico formateado HTML en Android
  • No puedo enviar Yahoo Mail desde Java Mail Api
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.