Using Android Intent.ACTION_SEND for sending email
[Solution for API LEVEL >=15]
I've finally succeded in sending email WITH attachments to ONLY email clients.I write it here because it took me a lot of time and it may be usefull to others.
The problem is:
Intent.ACTION_SENDTO takes Data URI (so you can specify "mailto:"schema) BUT it does not accept Intent:EXTRA_STREAM.
Intent.ACTION_SEND accepts Intent:EXTRA_STREAM (so you can addattachment) BUT it takes only Type (not Data URI so you cannotspecify "mailto:" schema).
So Intent.ACTION_SEND lets the user choose from several Activities, even if you setType("message/rfc822"), because that App/Activities can manage all file types (tipically GDrive/Dropbox Apps) and so even email message files.
The solution is in the setSelector method.With this method you can use Intent.ACTION_SENDTO to select the Activity, but then send the Intent.ACTION_SEND Intent.
Here my solution code (the attachment came from a FileProvider, but it could be any file):
{ 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[]{"address@mail.com"}); 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);}
I'm not taking credit for this answer but I believe it gives the best answer for this post.
It's a common misconception to use text/plain or text/html. This will trigger any application that can handle plain or HTML text files without any context, including Google Drive, Dropbox, Evernote and Skype.
Instead use a ACTION_SENDTO
, providing the mailto:
Uri
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
You can then proceed using the chooser as suggested through the other answers.
Answered by @PaulLammertsma here Android email chooser
Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("application/octet-stream");
EDIT:
You could try setting the type to "message/rfc822"
as well.
try this...