Send Email Intent
UPDATE
Official approach:
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); }}
OLD ANSWER
The accepted answer doesn't work on the 4.1.2. This should work on all platforms:
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..."));
Update: According to marcwjj, it seems that on 4.3, we need to pass string array instead of a string for email address to make it work. We might need to add one more line:
intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses
There are three main approaches:
String email = /* Your email address here */String subject = /* Your subject here */String body = /* Your body here */String chooserTitle = /* Your chooser title here */
1. Custom Uri
:
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. Using Intent
extras:
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 textstartActivity(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();
when you will change your intent.setType like below you will get
intent.setType("text/plain");
Use android.content.Intent.ACTION_SENDTO
to get only the list of e-mail clients, with no facebook or other apps. Just the email clients.Ex:
new Intent(Intent.ACTION_SENDTO);
I wouldn't suggest you get directly to the email app. Let the user choose his favorite email app. Don't constrain him.
If you use ACTION_SENDTO, putExtra does not work to add subject and text to the intent. Use Uri to add the subject and body text.
EDIT:We can use message/rfc822
instead of "text/plain"
as the MIME type. However, that is not indicating "only offer email clients" -- it indicates "offer anything that supports message/rfc822 data". That could readily include some application that are not email clients.
message/rfc822
supports MIME Types of .mhtml, .mht, .mime