540

I am developing an application in Android. I don't know how to send an email from the application?

Samet ÖZTOPRAK
  • 2,428
  • 3
  • 23
  • 26
Rakesh
  • 14,229
  • 12
  • 36
  • 60
  • Simple ShareBuilder https://gist.github.com/gelldur/9c199654c91b13478979 – Dawid Drozd May 27 '15 at 10:43
  • Does this answer your question? [Android Studio mailto Intent doesn't show subject and mail body](https://stackoverflow.com/questions/59314608/android-studio-mailto-intent-doesnt-show-subject-and-mail-body) – Alex Aug 06 '20 at 12:57
  • The suggested duplicate seems worse, the accepted answer has a bizarre, unnecessary intent-filter. – Ryan M Aug 07 '20 at 05:49

23 Answers23

999

The best (and easiest) way is to use an Intent:

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"recipient@example.com"});
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(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}

Otherwise you'll have to write your own client.

Jeremy Logan
  • 45,614
  • 37
  • 119
  • 143
  • 6
    In the above code,there is no sender email id.Then how the message send? – KIRAN K J Jun 23 '11 at 04:12
  • 40
    KIRAN: You'll need to look into how Intents work to understand this. It'll basically open an email application with the recipient, subject, and body already filled out. It's up to the email app to do the sending. – Jeremy Logan Jul 11 '11 at 20:36
  • 8
    The email is not appearing in "TO" field by starting the activity. anyone knows? – Hamza Waqas Mar 26 '12 at 12:03
  • exactly what I needed, awesome answer – pbojinov Jun 27 '12 at 03:41
  • 1
    Its also showing bluetooth to complete the action.How this can be done only by mail? I don't need bluetooth option. – Dray Sep 11 '12 at 06:00
  • 5
    Yeah... this worked perfect, until Skype also decided to "support" message/rfc822 - now Skype pops-up in list also. That company is truly becoming evil... – nikib3ro Oct 09 '12 at 20:56
  • 2
    You can't "force" it to be an email app unless you know exactly which app the user would want to use. – Jeremy Logan Oct 19 '12 at 16:14
  • 1
    Although forcing it to be a specific email app is not possible in general, you can limit the chooser to only display email apps. See [this alternative answer](http://stackoverflow.com/a/12804063/249239). Worked beautifully for me. – darrenp Sep 04 '13 at 18:46
  • I just have a question on this one of how to listen back if email sending fails do we have to use intent filters for that ? – Deepak Samuel Rajan May 12 '14 at 06:00
  • 12
    the great contribution of this comment is: message/rfc822 – Guilherme Oliveira Jul 05 '14 at 19:12
  • 3
    what is **rfc822** ?? – Mayur R. Amipara Mar 26 '15 at 06:00
  • 4
    RFC822: Standard for ARPA Internet Text Messages http://www.w3.org/Protocols/rfc822/ – Jeremy Logan Mar 26 '15 at 13:53
  • One phone I tested this on suggested sending the email using "Bluetooth" and "Android Beam". The `ACTION_SENDTO` approach doesn't seem to have this problem. – Sam Jun 25 '15 at 12:59
  • 25
    add these to be sure that chooser displays only email apps: `Intent i = new Intent(Intent.ACTION_SENDTO);` `i.setType("message/rfc822");` `i.setData(Uri.parse("mailto:"));` – Edris Oct 07 '15 at 13:41
  • 3
    From the [official Android docs](http://developer.android.com/reference/android/content/Intent.html#ACTION_CHOOSER): "An example of when not to use it [`Intent.createChooser`] is when the user clicks on a "mailto:" link. They would naturally expect to go directly to their mail app, so startActivity() should be called directly: it will either launch the current preferred app, or put up a dialog allowing the user to pick an app to use and optionally marking that as preferred." – Ben Hutchison Mar 02 '16 at 05:20
  • How do I listen to successfully or failed email? – X09 May 03 '16 at 04:18
  • 1
    @Ozuf You can't unless the desire email app suports some kind of callbacks (via intents for example). AFAIK Gmail has no such tools. – Daniels Šatcs Jul 17 '16 at 14:23
  • @JeremyLogan using this but stil getting image in junk folder. how to get in inbox ? – Erum Nov 10 '16 at 09:23
  • Is it possible to also put sender email as extra? I cannot find it anywhere – K.Os May 11 '17 at 13:06
  • Hello all can i send mail on backend without passing intent? – ManishNegi Jun 30 '17 at 12:17
  • 1
    It is also showing whatsapp like apps for sending email – varmashrivastava Aug 18 '18 at 15:57
  • this is the best solution if you want to see only mail apps (not whatsapp etc) https://stackoverflow.com/questions/8701634/send-email-intent/16217921#16217921 – chezi shem tov Apr 26 '21 at 14:31
199

Use .setType("message/rfc822") or the chooser will show you all of the (many) applications that support the send intent.

Ahmad
  • 58,947
  • 17
  • 107
  • 133
Jeff S
  • 3,166
  • 1
  • 16
  • 7
  • 5
    Nice, this should have more up votes tbh. You won't notice testing on the emulator, but when you go to send "text/plain" on a real device it will give you a list of 15+ apps!! so "message/rfc822" is definitely recommended (the email standard). – Blundell Jul 23 '11 at 21:28
  • 8
    @Blundell hi, but I didn't see any difference after changing to `message/rfc822` – draw Aug 13 '11 at 09:56
  • 2
    Can you remove bluetooth from the list? This also shows up with this type. +1 though, neat trick! – ingh.am Aug 22 '11 at 15:52
  • 6
    Saved our bacon. Can't imagine explaining to client that the user might tweet support requests instead of emailing them. – Kevin Galligan Jan 23 '12 at 23:03
  • Is there a constant for this type somewhere? – karl Mar 07 '14 at 23:56
  • 1
    +1111111 This deserves endless +1's so others can see this. I missed this portion and had to deal with this problem for a while! – ChallengeAccepted Aug 06 '14 at 09:50
  • Is this still relevant for the latest Android APIs? – saltandpepper Jan 13 '17 at 08:51
94

I've been using this since long time ago and it seems good, no non-email apps showing up. Just another way to send a send email intent:

Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com")); // or just "mailto:" for blank
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app.
startActivity(intent);
Randy Sugianto 'Yuku'
  • 64,635
  • 54
  • 168
  • 216
  • 2
    Unsopported action: This action is not currently supported – erdomester Mar 25 '12 at 18:01
  • I get an error: ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.SENDTO typ=plain/text flg=0x10000000 } – IgorGanapolsky Aug 15 '12 at 13:33
  • 4
    lgor G->plz change from setType"(plain/text") to setType("text/plain") – sachit Oct 09 '12 at 10:04
  • 2
    .setType("message/rfc822") not text/plain – The Hungry Androider Apr 22 '14 at 12:41
  • 1
    this code willl open email intent ? how can i send email without showing intent to user @yuku i want to send password to email – Erum Feb 07 '15 at 09:14
  • @erdomester, I've seen this happen on an Android 4.1.1 emulator when the default email client isn't configured with an email account. Maybe this just means no matching activities were found. – Sam Jun 25 '15 at 10:54
  • @erdomester, interestingly, this doesn't happen if you use the `setType` approach instead of this one. – Sam Jun 25 '15 at 11:30
  • @erdomester, further testing suggests this is just a problem with the official Android emulators. – Sam Jun 25 '15 at 13:01
  • Wrong. I never test on emulators, cause I use real phones. Also, emulators make my notebook extremely slow (but eclipse or studio both make it very slow) even if I have 8GB RAM, 4 processors and the notebook is in perfect condition. – erdomester Jun 26 '15 at 18:21
  • @erdomester, on what device did the problem happen for you? I haven't been able to produce it on any real devices. – Sam Sep 25 '15 at 21:06
  • The reason you are getting the "No app can perform this action" is because you did not add setData to your intent. Add that, and leave the "mailto:" without an email address to resolve. Text/Play type is better because it filters out unnecessary email clients. – portfoliobuilder Oct 27 '15 at 18:12
  • Thank you! This is the only solution worked for me. All others didn't work on devices without sd card –  Dec 16 '15 at 08:31
  • 2
    This answer is [quite influential](https://www.google.com/?q="this+will+make+such+that+when+user+returns+to+your+app,+your+app+is+displayed,+instead+of+the+email+app"&gws_rd=cr&ei=BWXHWOqDNoStsAHp-634BA#newwindow=1&q="this+will+make+such+that+when+user+returns+to+your+app,+your+app+is+displayed,+instead+of+the+email+app"). :) – Nick Volynkin Mar 14 '17 at 03:36
  • You call setData() after setType() here. It has no sense as calling setData() will erase any type set before. So, just remove setType() and it will work the same. – Prizoff Jul 25 '19 at 14:00
  • @Prizoff wow, thanks for this updated information! I will remove the setType from the answer. Ref from Android docs: > Set the data this intent is operating on. This method automatically clears any type that was previously set by setType(String) – Randy Sugianto 'Yuku' Aug 13 '19 at 04:13
56

I was using something along the lines of the currently accepted answer in order to send emails with an attached binary error log file. GMail and K-9 send it just fine and it also arrives fine on my mail server. The only problem was my mail client of choice Thunderbird which had troubles with opening / saving the attached log file. In fact it simply didn't save the file at all without complaining.

I took a look at one of these mail's source codes and noticed that the log file attachment had (understandably) the mime type message/rfc822. Of course that attachment is not an attached email. But Thunderbird cannot cope with that tiny error gracefully. So that was kind of a bummer.

After a bit of research and experimenting I came up with the following solution:

public Intent createEmailOnlyChooserIntent(Intent source,
    CharSequence chooserTitle) {
    Stack<Intent> intents = new Stack<Intent>();
    Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
            "info@domain.com", null));
    List<ResolveInfo> activities = getPackageManager()
            .queryIntentActivities(i, 0);

    for(ResolveInfo ri : activities) {
        Intent target = new Intent(source);
        target.setPackage(ri.activityInfo.packageName);
        intents.add(target);
    }

    if(!intents.isEmpty()) {
        Intent chooserIntent = Intent.createChooser(intents.remove(0),
                chooserTitle);
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                intents.toArray(new Parcelable[intents.size()]));

        return chooserIntent;
    } else {
        return Intent.createChooser(source, chooserTitle);
    }
}

It can be used as follows:

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] {
    ANDROID_SUPPORT_EMAIL
});
i.putExtra(Intent.EXTRA_SUBJECT, "Crash report");
i.putExtra(Intent.EXTRA_TEXT, "Some crash report details");

startActivity(createEmailOnlyChooserIntent(i, "Send via email"));

As you can see, the createEmailOnlyChooserIntent method can be easily fed with the correct intent and the correct mime type.

It then goes through the list of available activities that respond to an ACTION_SENDTO mailto protocol intent (which are email apps only) and constructs a chooser based on that list of activities and the original ACTION_SEND intent with the correct mime type.

Another advantage is that Skype is not listed anymore (which happens to respond to the rfc822 mime type).

Morteza Jalambadani
  • 1,881
  • 5
  • 19
  • 30
tiguchi
  • 5,292
  • 1
  • 30
  • 37
  • 1
    i just inserted you code snippet and it works fine. Before there have been listed apps like Google Drive, Skype etc. But isn't there a way to send a mail out of the application without calling another application? i just read the article about the email client that @Rene postet above but seems to be too complicated for just sending a simple email – Alex Cio Jan 18 '13 at 19:29
  • Excellent answer. I had Skype and Google Drive coming up with `ACTION_SEND` as well and this sorts it out beautifully. – darrenp Sep 04 '13 at 18:45
  • 1
    The most popular solution above returns Skype and Vkontakte as well. This solution is better. – Denis Kutlubaev Dec 26 '13 at 17:18
  • what is crashLogFile ?where did it initialise?pease sepecify – Noufal Feb 06 '14 at 06:03
  • @Noufal This is just some remainder from my own code base. It's a `File` instance pointing to a crash log file my Android apps create in the background in case there was an uncaught exception. That example should just illustrate how to add an email attachment. You could also attach any other file from the external storage (an image for example). You can also remove that line with `crashLogFile` in order to get a working example. – tiguchi Feb 06 '14 at 15:06
  • Works for me as well. The accepted answer was including options like Skype and Google Drive which carry some problems: the problem with the Skype option was that you'd get a `'You can only send files stored on your device.'` message when trying to send the file; with Google Drive it would use the `EXTRA_SUBJECT` as the default file name instead of the actual file's name. – user1987392 May 06 '16 at 14:58
  • Creative and works well to filter out undesirable apps. Needs more upvotes! – kaay Dec 14 '17 at 09:28
37

To JUST LET EMAIL APPS to resolve your intent you need to specify ACTION_SENDTO as Action and mailto as Data.

private void sendEmail(){

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com")); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body");

    try {
        startActivity(Intent.createChooser(emailIntent, "Send email using..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
    }

}
wildzic
  • 388
  • 3
  • 10
23

I solved this issue with simple lines of code as the android documentation explains.

(https://developer.android.com/guide/components/intents-common.html#Email)

The most important is the flag: it is ACTION_SENDTO, and not ACTION_SEND

The other important line is

intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***

By the way, if you send an empty Extra, the if() at the end won't work and the app won't launch the email client.

According to Android documentation. If you want to ensure that your intent is handled only by an email app (and not other text messaging or social apps), then use the ACTION_SENDTO action and include the "mailto:" data scheme. For example:

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);
    }
}
Pedro Varela
  • 2,099
  • 1
  • 21
  • 31
22

The strategy of using .setType("message/rfc822") or ACTION_SEND seems to also match apps that aren't email clients, such as Android Beam and Bluetooth.

Using ACTION_SENDTO and a mailto: URI seems to work perfectly, and is recommended in the developer documentation. However, if you do this on the official emulators and there aren't any email accounts set up (or there aren't any mail clients), you get the following error:

Unsupported action

That action is not currently supported.

As shown below:

Unsupported action: That action is not currently supported.

It turns out that the emulators resolve the intent to an activity called com.android.fallback.Fallback, which displays the above message. Apparently this is by design.

If you want your app to circumvent this so it also works correctly on the official emulators, you can check for it before trying to send the email:

private void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO)
        .setData(new Uri.Builder().scheme("mailto").build())
        .putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith <johnsmith@yourdomain.com>" })
        .putExtra(Intent.EXTRA_SUBJECT, "Email subject")
        .putExtra(Intent.EXTRA_TEXT, "Email body")
    ;

    ComponentName emailApp = intent.resolveActivity(getPackageManager());
    ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback");
    if (emailApp != null && !emailApp.equals(unsupportedAction))
        try {
            // Needed to customise the chooser dialog title since it might default to "Share with"
            // Note that the chooser will still be skipped if only one app is matched
            Intent chooser = Intent.createChooser(intent, "Send email with");
            startActivity(chooser);
            return;
        }
        catch (ActivityNotFoundException ignored) {
        }

    Toast
        .makeText(this, "Couldn't find an email app and account", Toast.LENGTH_LONG)
        .show();
}

Find more info in the developer documentation.

Sam
  • 35,545
  • 30
  • 157
  • 202
13

Sending email can be done with Intents which will require no configuration. But then it will require user interaction and the layout will be a bit restricted.

Build and sending a more complex email without user interaction entails building your own client. The first thing is that the Sun Java API for email are unavailable. I have had success leveraging the Apache Mime4j library to build email. All based on the docs at nilvec.

Tom van Enckevort
  • 4,160
  • 1
  • 23
  • 40
Rene
  • 3,962
  • 2
  • 22
  • 29
7

Here is the sample working code which opens mail application in android device and auto-filled with To address and Subject in the composing mail.

protected void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:feedback@gmail.com"));
    intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Sridhar Nalam
  • 491
  • 8
  • 8
  • Thanks. Comparing with a solution of @Avi Parshan, you set an email in `setData()`, and Avi sets in `putExtra()`. Both variants a working. But if remove `setData` and use only `intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});`, there would be a `ActivityNotFoundException`. – CoolMind Apr 16 '18 at 16:13
5

I use the below code in my apps. This shows exactly email client apps, such as Gmail.

    Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null));
    contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
    startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser)));
lomza
  • 8,576
  • 13
  • 63
  • 82
5

This will show you only the email clients (as well as PayPal for some unknown reason)

 public void composeEmail() {

    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:"));
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
    intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    intent.putExtra(Intent.EXTRA_TEXT, "Body");
    try {
        startActivity(Intent.createChooser(intent, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }
}
Avi Parshan
  • 1,427
  • 2
  • 19
  • 23
  • 1
    Nice solution! It avoids many unsuitable applications (mostly used as "Share"). Don't add `intent.type = "message/rfc822"; intent.type = "text/html";` here as it will lead to exception. – CoolMind Apr 15 '18 at 23:26
4

This is how I did it. Nice and simple.

String emailUrl = "mailto:email@example.com?subject=Subject Text&body=Body Text";
        Intent request = new Intent(Intent.ACTION_VIEW);
        request.setData(Uri.parse(emailUrl));
        startActivity(request);
Dog Lover
  • 538
  • 1
  • 5
  • 17
3

This function first direct intent gmail for sending email, if gmail is not found then promote intent chooser. I used this function in many commercial app and it's working fine. Hope it will help you:

public static void sentEmail(Context mContext, String[] addresses, String subject, String body) {

    try {
        Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW);
        sendIntentGmail.setType("plain/text");
        sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses)));
        sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
        sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses);
        if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body);
        mContext.startActivity(sendIntentGmail);
    } catch (Exception e) {
        //When Gmail App is not installed or disable
        Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND);
        sendIntentIfGmailFail.setType("*/*");
        sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses);
        if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body);
        if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) {
            mContext.startActivity(sendIntentIfGmailFail);
        }
    }
}
Shohan Ahmed Sijan
  • 3,775
  • 1
  • 28
  • 37
3

I used this code to send mail by launching default mail app compose section directly.

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setType("message/rfc822"); 
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"test@gmail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    i.putExtra(Intent.EXTRA_TEXT   , "body of email");
    try {
        startActivity(Intent.createChooser(i, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }
Faris Muhammed
  • 577
  • 7
  • 13
2

simple try this one

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    buttonSend = (Button) findViewById(R.id.buttonSend);
    textTo = (EditText) findViewById(R.id.editTextTo);
    textSubject = (EditText) findViewById(R.id.editTextSubject);
    textMessage = (EditText) findViewById(R.id.editTextMessage);

    buttonSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            String to = textTo.getText().toString();
            String subject = textSubject.getText().toString();
            String message = textMessage.getText().toString();

            Intent email = new Intent(Intent.ACTION_SEND);
            email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
            // email.putExtra(Intent.EXTRA_CC, new String[]{ to});
            // email.putExtra(Intent.EXTRA_BCC, new String[]{to});
            email.putExtra(Intent.EXTRA_SUBJECT, subject);
            email.putExtra(Intent.EXTRA_TEXT, message);

            // need this to prompts email client only
            email.setType("message/rfc822");

            startActivity(Intent.createChooser(email, "Choose an Email client :"));

        }
    });
}
NagarjunaReddy
  • 8,500
  • 10
  • 60
  • 94
  • 3
    How is this any better than the answers that already existed when you posted this? It just looks like a copy of the accepted answer wrapped in an activity. – Sam Jun 25 '15 at 13:03
2

Other solution can be

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("plain/text");
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"someone@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);

Assuming most of the android device has GMail app already installed.

silentsudo
  • 5,523
  • 5
  • 34
  • 65
  • @PedroVarela we can always check activity not found exception. – silentsudo Aug 23 '16 at 18:14
  • 1
    Yes we can. But your solution is no the right one. The Android documentation states clearly what you have to do in order to show only mail apps in the intent chooser. You wrote "Assuming most of the android device has Gmail app already installed"; What if it is a rooted device and the user delete Gmail client?. Suppose you are creating your own email app?, if a user is going to send a e-mail your app won't be in that list. What happen if gmail change the package name? Are you going to update your app? – Pedro Varela Aug 23 '16 at 18:20
2

Use this for send email...

boolean success = EmailIntentBuilder.from(activity)
    .to("support@example.org")
    .cc("developer@example.org")
    .subject("Error report")
    .body(buildErrorReport())
    .start();

use build gradle :

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
Manish
  • 226
  • 2
  • 13
2
 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","ebgsoldier@gmail.com", null));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Forgot Password");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "this is a text ");
    startActivity(Intent.createChooser(emailIntent, "Send email..."));
Taha Gorme
  • 433
  • 12
1

This method work for me. It open Gmail app (if installed) and set mailto.

public void openGmail(Activity activity) {
    Intent emailIntent = new Intent(Intent.ACTION_VIEW);
    emailIntent.setType("text/plain");
    emailIntent.setType("message/rfc822");
    emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
    final PackageManager pm = activity.getPackageManager();
    final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
    ResolveInfo best = null;
    for (final ResolveInfo info : matches)
        if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
            best = info;
    if (best != null)
        emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
    activity.startActivity(emailIntent);
}
psycho
  • 31
  • 1
  • 3
1
/**
 * Will start the chosen Email app
 *
 * @param context    current component context.
 * @param emails     Emails you would like to send to.
 * @param subject    The subject that will be used in the Email app.
 * @param forceGmail True - if you want to open Gmail app, False otherwise. If the Gmail
 *                   app is not installed on this device a chooser will be shown.
 */
public static void sendEmail(Context context, String[] emails, String subject, boolean forceGmail) {

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL, emails);
    i.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (forceGmail && isPackageInstalled(context, "com.google.android.gm")) {
        i.setPackage("com.google.android.gm");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(Intent.createChooser(i, "Send mail..."));
        } catch (ActivityNotFoundException e) {
            Toast.makeText(context, "No email app is installed on your device...", Toast.LENGTH_SHORT).show();
        }
    }
}

/**
 * Check if the given app is installed on this devuice.
 *
 * @param context     current component context.
 * @param packageName The package name you would like to check.
 * @return True if this package exist, otherwise False.
 */
public static boolean isPackageInstalled(@NonNull Context context, @NonNull String packageName) {
    PackageManager pm = context.getPackageManager();
    if (pm != null) {
        try {
            pm.getPackageInfo(packageName, 0);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
    return false;
}
Gal Rom
  • 5,509
  • 2
  • 37
  • 30
1

Try this:

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
    startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
    //TODO: Handle case where no email app is available
}

The above code will open the users favourite email client prefilled with the email ready to send.

Source

Dan Bray
  • 5,616
  • 3
  • 43
  • 51
0

Kotlin version which only shows Email clients (no contacts etc.):

    with(Intent(Intent.ACTION_SEND)) {
        type = "message/rfc822"
        data = Uri.parse("mailto:")
        putExtra(Intent.EXTRA_EMAIL, arrayOf("example@mail.com"))
        putExtra(Intent.EXTRA_SUBJECT,"YOUR SUBJECT")
        putExtra(Intent.EXTRA_TEXT, "YOUR BODY")
        try {
            startActivity(Intent.createChooser(this, "Send Email with"))
        } catch (ex: ActivityNotFoundException) {
            // No email clients found, might show Toast here
        }
    }
Merthan Erdem
  • 1,244
  • 1
  • 8
  • 18
0

The code below works on Android 10 devices and higher. It also sets the subject, body and recipient(To).

val uri = Uri.parse("mailto:$EMAIL")
                .buildUpon()
                .appendQueryParameter("subject", "App Feedback")
                .appendQueryParameter("body", "Body Text")
                .appendQueryParameter("to", EMAIL)
                .build()

            val emailIntent = Intent(Intent.ACTION_SENDTO, uri)

            startActivity(Intent.createChooser(emailIntent, "Select app"))