How to send HTML email

57,621

Solution 1

You can pass Spanned text in your extra. To ensure that the intent resolves only to activities that handle email (e.g. Gmail and Email apps), you can use ACTION_SENDTO with a Uri beginning with the mailto scheme. This will also work if you don't know the recipient beforehand:

final Intent shareIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "The Subject");
shareIntent.putExtra(
Intent.EXTRA_TEXT,
Html.fromHtml(new StringBuilder()
    .append("<p><b>Some Content</b></p>")
    .append("<small><p>More content</p></small>")
    .toString())
);

Solution 2

Been trying to send html via gmail app for a while, so decided to leave some insight on what I found, just in case someone else is having similar issues.

Seems like no matter what I did, I couldn't get the html to have bold text in it. Then I've tried switching to outlook client and to my surprise it was working just fine. Html markup was also working on other older devices, but not on mine (galaxy s7 API 26), so I figured, that gmail app seems to have dropped support for html syntax that comes from intent or maybe now you're required to provide it in some very specific way which is not clearly documented.

Last gmail version that worked for me was version 6.9.25... on Nexus 5X API 25 emulator (Nougat) And it stopped working starting version 7.5.21... On Nexus 5x API 26 emulator (Oreo)

Solution 3

This was very helpful to me for the HTML, but the ACTION_SENDTO didn't quite work for me as is - I got an "action not supported" message. I found a variant here which does:

http://www.coderanch.com/t/520651/Android/Mobile/no-application-perform-action-when

And here's my code which combines the two together:

String mailId="[email protected]";
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
                                Uri.fromParts("mailto",mailId, null)); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject text here"); 
// you can use simple text like this
// emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,"Body text here"); 
// or get fancy with HTML like this
emailIntent.putExtra(
         Intent.EXTRA_TEXT,
         Html.fromHtml(new StringBuilder()
             .append("<p><b>Some Content</b></p>")
             .append("<a>http://www.google.com</a>")
             .append("<small><p>More content</p></small>")
             .toString())
         );
startActivity(Intent.createChooser(emailIntent, "Send email..."));

Solution 4

I haven't (yet) started Android development, but the documentation for the intent says that if you use EXTRA_TEXT, the MIME type should be text/plain. Seems like if you want to see HTML, you'd have to use EXTRA_STREAM instead...

Share:
57,621
Denis Palnitsky
Author by

Denis Palnitsky

Experienced product engineer, architect, and team lead

Updated on September 27, 2020

Comments

  • Denis Palnitsky
    Denis Palnitsky over 3 years

    i found a way to send plain text email using intent:

    final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    emailIntent.setType("text/plain"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new     
    String[]{"[email protected]"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Test");
    

    But I need to send HTML formatted text.
    Trying to setType("text/html") doesn't work.

  • Denis Palnitsky
    Denis Palnitsky over 14 years
    This works partly. I attached file but it MIME type always text\plain in resulting letter. I tried to set emailIntent.setType("html/text"); with no luck.
  • Denis Palnitsky
    Denis Palnitsky about 13 years
    Has anybody tested that solution? I have no possibility to check it now so please add a comment if it works and I will mark this as right answer.
  • Phil
    Phil almost 13 years
    @Orsol, Yes this works sort of. If you want formatted email, this does work, however I wanted to add a link, which unfortunately did not work:(
  • tos
    tos about 12 years
    Have you tested this ? This looks fine in the native android email client on the emulator (not Gmail) but text does not appear styled when sent to a gmail account. In addition, the linked URL you give isn't visible.
  • glo
    glo over 11 years
    you can add link using the following shareIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(new StringBuilder() .append("</a> <br><br><a href = \"https://example.com\">https://example.com</a>").toString()‌​) );
  • MinceMan
    MinceMan almost 11 years
    glo the problem with that is, while it works with gmail, it doesn't work with every email client. So if you need that link in there and someone other then gmail can grab it then you cannot use your solution.
  • Andrew Arnott
    Andrew Arnott over 10 years
    Agreed. This works if the user picks Gmail to send the message. But the standard Android Mail app just drops the HTML formatting including links. There should be a way to provide both HTML and fallback text for the client. But I don't know how.
  • superlinux
    superlinux almost 10 years
    I noticed that The tag <Table> does not work in both GMAIL app and the standard Android Email app. I mean it does not get formatted as a table.
  • Daniele D.
    Daniele D. about 6 years
    Html.fromHtml is now deprecated in Android N+
  • cV2
    cV2 over 5 years
    Over the years unfortunately all answers about this seem to be outdated.
  • Daniel F
    Daniel F almost 5 years
    It says EXTRA_TEXT is required (Note that you must also supply EXTRA_TEXT). Yet this doesn't work for email.
  • hmac
    hmac almost 4 years
    gmail app seems to be ignoring most tags, including <b></b>