64

I am designing an app in which i need to open an email client on clicking a button. The email client should be opened with a pre-defined subject and 'to' address. Is there a way to attain this? Please provide me the solution and a code example if possible...

Matt
  • 17,290
  • 7
  • 57
  • 71
Rahul Kalidindi
  • 4,666
  • 14
  • 56
  • 92
  • Possible duplicate of [How to open Email program via Intents (but only an Email program)](http://stackoverflow.com/questions/3312438/how-to-open-email-program-via-intents-but-only-an-email-program) – mixel May 16 '16 at 10:19
  • Please have a look at [this](https://stackoverflow.com/a/54602382/413306) answer to get ONLY email clients – Ayyappa Feb 09 '19 at 01:41

6 Answers6

93

Goes like this:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "some@email.address" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));

Alternatively, you could use IntentFactory.getSendEmailIntent(String mailTo, String mailCC, String subject, CharSequence body, File attachment).

yanchenko
  • 56,576
  • 33
  • 147
  • 165
  • 1
    When i click the button its displaying that NO APPLCATIONS CAN PERFORM THIS ACTION.... Whats the solution??? – Rahul Kalidindi Apr 29 '10 at 07:01
  • 5
    This does not work reliably today - it will allow user to choose Facebook Messenger for example, instead of GMail. Please see: https://stackoverflow.com/a/15022153/1735603 (accepted answer in thread is wrong as well, beware) – Firzen Jun 03 '19 at 14:59
  • This solution did not work for me in 2020 DEC. My working solution from official doc: https://stackoverflow.com/a/62877003/2155858 – Rajeev Jayaswal Dec 19 '20 at 13:54
49

To show only email clients use this code:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:recipient@example.com?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body));
intent.setData(data);
startActivity(intent);

If you already chose default email client then it will launch it. Otherwise it will show a list of available email clients.

mixel
  • 25,177
  • 13
  • 126
  • 165
7

If you have a e-mail address on screen, you can just use in your xml, like this:

android:autoLink="email"
Daniel Beltrami
  • 756
  • 9
  • 22
5

Ok - now the above answer no longer works for me in year 2020. I found something mentioned on google official developer sites which worked for me.

 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);
    }
Rajeev Jayaswal
  • 1,423
  • 1
  • 20
  • 22
  • Not working for me on Android 10. `EXTRA_SUBJECT` and `EXTRA_TEXT` are being ignored – Mark Aug 26 '21 at 10:36
  • For Android 10 and higher we need to add query in manifest to make `resolveActivity` work as said in answer https://stackoverflow.com/a/65166064/10413998 – remain4life Aug 18 '22 at 17:15
1

Prefer to use constants if available like for intent.type ClipDescription.MIMETYPE_TEXT_PLAIN

Kotlin:

val intent = Intent(Intent.ACTION_SEND)
intent.type = ClipDescription.MIMETYPE_TEXT_PLAIN
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("emailId 1", "emailId 2"))
intent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject for email")
intent.putExtra(android.content.Intent.EXTRA_TEXT, "Description for email")
startActivity(Intent.createChooser(intent,"Send Email"))
Sumit Jain
  • 1,100
  • 1
  • 14
  • 27
0

You can open email client on emulator by configuring your email address with email inbuild with email. Then when call the intent will open and send mail.

Stephan
  • 41,764
  • 65
  • 238
  • 329
shailesh
  • 31
  • 4