Отправить письмо Намерение - PullRequest
520 голосов
/ 02 января 2012
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");

startActivity(Intent.createChooser(intent, "Send Email"));

Приведенный выше код открывает диалоговое окно, в котором отображаются следующие приложения: - Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype и т. Д.

На самом деле я хочу отфильтровать эти параметры списка.Я хочу показывать только приложения, связанные с электронной почтой, например, Gmail, Yahoo Mail.Как это сделать?

Я видел такой пример в приложении «Android Market».

  1. Открыть приложение Android Market
  2. Откройте любое приложение, в котором разработчик указал свой адрес электронной почты.(Если вы не можете найти такое приложение, просто откройте мое приложение: - market: // details? Id = com.becomputer06.vehicle.diary.free, ИЛИ поиск по «Дневнику автомобиля»)
  3. Прокрутите вниз до«РАЗРАБОТЧИК»
  4. Нажмите «Отправить электронную почту»

В этом диалоговом окне отображаются только приложения электронной почты, например, Gmail, Yahoo Mail и т. Д. Он не показывает Bluetooth, Orkut и т. Д. Какой код создает такойдиалог?

Ответы [ 31 ]

829 голосов
/ 22 февраля 2013

Принятый ответ не работает на 4.1.2.Это должно работать на всех платформах:

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..."));

Надеюсь, это поможет.

Обновление: в соответствии с marcwjj кажется, что на 4.3 нам нужно передать массив строк вместо строки для адреса электронной почты, чтобы он работал.Возможно, нам потребуется добавить еще одну строку:

intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses

Ссылка

214 голосов
/ 25 апреля 2013

Существует три основных подхода:

String email = /* Your email address here */
String subject = /* Your subject here */
String body = /* Your body here */
String chooserTitle = /* Your chooser title here */

1.Пользовательский 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.Используя Intent дополнительные функции:

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 text

startActivity(Intent.createChooser(emailIntent, "Chooser Title"));

3.Библиотека поддержки 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();
194 голосов
/ 02 января 2012

когда вы измените свой intent.setType, как показано ниже, вы получите

intent.setType("text/plain");

Используйте android.content.Intent.ACTION_SENDTO, чтобы получить только список почтовых клиентов, без facebook или других приложений. Просто почтовые клиенты. Пример:

new Intent(Intent.ACTION_SENDTO);

Я бы не советовал вам напрямую обращаться к почтовому приложению. Позвольте пользователю выбрать свое любимое почтовое приложение. Не сдерживайте его.

Если вы используете ACTION_SENDTO, putExtra не работает для добавления темы и текста в намерение. Используйте Uri, чтобы добавить тему и основной текст.

EDIT: Мы можем использовать message/rfc822 вместо "text/plain" в качестве типа MIME. Однако это не означает «предлагать только почтовые клиенты» - это означает «предлагать что-либо, поддерживающее данные message / rfc822». Это может легко включать некоторые приложения, которые не являются почтовыми клиентами.

message/rfc822 поддерживает MIME-типы .mhtml, .mht, .mime

93 голосов
/ 13 апреля 2015

Это цитата из официального документа Android, я тестировал его на Android 4.4 и отлично работает.См. Больше примеров на https://developer.android.com/guide/components/intents-common.html#Email

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);
    }
}
73 голосов
/ 03 февраля 2016

Поздний ответ, хотя я нашел решение, которое могло бы помочь другим:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:abc@xyz.com"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));

Это был мой вывод (предлагается только Gmail + Входящие):

my output

Я получил это решение с сайта разработчиков Android .

33 голосов
/ 04 января 2012

Попробуйте:

intent.setType("message/rfc822");
29 голосов
/ 24 января 2015

Это работает для меня:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL  , new String[] { "me@somewhere.com" });
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");

startActivity(Intent.createChooser(intent, "Email via..."));

т.е. используйте действие ACTION_SENDTO вместо действия ACTION_SEND.Я пробовал его на нескольких устройствах Android 4.4, и он ограничивает всплывающее окно выбора, отображающее только приложения электронной почты (электронная почта, Gmail, Yahoo Mail и т. Д.), И корректно вставляет адрес электронной почты и тему в сообщение.

23 голосов
/ 05 июня 2015

Это способ сделать в соответствии с Документами для разработчиков Android , добавив в приложение следующие строки кода:

Intent intent = new Intent(Intent.ACTION_SEND);//common intent 
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Если вы хотите добавить текст и тему, добавьтеэто

intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here");
intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" );
13 голосов
/ 17 февраля 2014

Если вам нужны только почтовые клиенты, вы должны использовать android.content.Intent.EXTRA_EMAIL с массивом.Вот пример:

final Intent result = new Intent(android.content.Intent.ACTION_SEND);
result.setType("plain/text");
result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient });
result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
result.putExtra(android.content.Intent.EXTRA_TEXT, body);
9 голосов
/ 19 июня 2017

Наконец, придумайте лучший способ сделать

    String to = "test@gmail.com";
    String subject= "Hi I am subject";
    String body="Hi I am test body";
    String mailTo = "mailto:" + to +
            "?&subject=" + Uri.encode(subject) +
            "&body=" + Uri.encode(body);
    Intent emailIntent = new Intent(Intent.ACTION_VIEW);
    emailIntent.setData(Uri.parse(mailTo));
    startActivity(emailIntent);
...