Отправить письмо Намерение

588
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 и т. Д. Какой код создает такой диалог?

Dira
источник
4
К сожалению, это невозможно с Intent.ACTION_SEND. Может быть, это работает с намерением непосредственно в gmail-App, но я не знаю, возможно ли это.
Томми
19
В случае, если кто-то узнает здесь о намерениях электронной почты, EXTRA_MAIL должен соответствовать a String[], а не просто Stringкак показано здесь.
большие камни
Возможные дубликаты Отправить письмо по электронной почте
Сергей Глотов
Смотрите здесь для некоторых полезных советов: medium.com/@cketti/…
Феликс Д.

Ответы:

218

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

intent.setType("text/plain");

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

new Intent(Intent.ACTION_SENDTO);

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

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

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

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

Падма Кумар
источник
7
Можете ли вы предоставить код для получения желаемого результата?
Дира
9
@ becomputer06 см. это: stackoverflow.com/questions/8284706/send-email-via-gmail
Падма Кумар
76
Выбор намерения говорит, no apps installed to perform this intentкогда я использую ACTION_SENDTO. Я использую Android 4.1.2, и у меня установлено приложение электронной почты ...
ffleandro
4
«Правильный» путь - это ответ Магнуса. Я рекомендую оригинальный постер, чтобы изменить принятый ответ.
Джабботт
8
Использование MIME-типа для выполнения операции отправки - плохая идея, потому что вы в основном инструктируете Android предоставить список приложений, которые поддерживают отправку файла типа message/rfc822. Это не то же самое, что отправка электронного письма. mailto:Вместо этого используйте протокол, потому что именно это понимают почтовые клиенты.
Пол Ламмерцма
872

Принятый ответ не работает на 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

Ссылка

thanhbinh84
источник
7
Вы правы, и это не так на 4.2. Так что это на самом деле единственный правильный ответ, спасибо!
mDroidd
12
Это потрясающе. Кто-то ниже упомянул, что указание части mailto - это то, что сужает доступные опции для почтовых клиентов. Использование Uri.fromParts ("mailto", "", null) поместит курсор в поле получателя - идеально для того, что мне нужно.
Лохматый
24
Попробуйте этот emailIntent.putExtra (Intent.EXTRA_TEXT, «Я - тело письма»);
thanhbinh84
15
Если у вас нет конкретного получателя, это также работает:Uri.fromParts("mailto", "", null)
Фил
25
Это больше не работает на моем Android 4.3. Пожалуйста, ознакомьтесь с официальным документом Android по отправке электронной почты с намерением, которое отлично работает: developer.android.com/guide/components/…
marcwjj
244

Есть три основных подхода:

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();
Dira
источник
1
Для меня это сработало намного лучше - другие варианты выдвинули некоторые прямые вещи (например, Skype) в качестве возможных обработчиков.
Крис Рей
1
Если у вас есть %символ в буфере, некоторые символы в получающемся электронном письме не будут правильно закодированы. Вы должны выполнить Uri.encodeтанец, предложенный @minipif.
Джулио Пьянкастелли
12
Это лучшие ответы здесь, не тратьте свое время на попытки других, второй здесь - это то, что я выбрал, и он отлично работает, показывая только чистые почтовые приложения, а не gDrive, не bluetooth и т. Д. Спасибо @ becomputer06
Hugo
1
Будьте осторожны с символом «&». Если у вас есть символ & в теле письма, этот метод обрежет тело после &. Например, если вы отправите тело типа «Я есть и образец тела», вы получите просто «Я есть»
Эмре Коч
4
Результатом ShareCompat являются практически все приложения, а не только почтовые клиенты!
rpattabi
111

Это цитата из официального документа 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);
    }
}
marcwjj
источник
6
Согласовано! Я удивлен ответом, как это так далеко внизу списка. Я думаю, это было относительно недавнее изменение в Android Docs.
Майки
Большой! надежный, он ссылался на «Библию» разработчиков приложений для Android.
dev_android
1
Двоеточие после mailto помогло мне! Я использовал «mailto» вместо «mailto:»
Найджел Красто
1
Работаю на 5.1.1. Другие варианты не работают для меня.
Хуанин
1
EXTRA_EMAILне работает для меня, поэтому я использовалUri.parse("mailto: " + myEmail)
Пратик Бутани
89

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

Версия на Java

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


Котлин версия

val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
    data = Uri.parse("mailto:abc@xyz.com")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))


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

мой вывод

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

capt.swag
источник
2
Для меня было важно, чтобы между mailtoэлектронной почтой и пробелом не было места :mailto:abc@xyz.com
AlvaroSantisteban
Это правильный ответ.
Ниббана
36

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

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 и т. Д.), И корректно вставляет адрес электронной почты и тему в сообщение.

Адиль Хуссейн
источник
35

Пытаться:

intent.setType("message/rfc822");
Магнус
источник
Он прав, я попробовал это и предлагает [Drive, Email, Gmail, Skype], это должен быть «Правильный ответ»
gurbieta
18
Использование MIME-типа для выполнения операции отправки - плохая идея, потому что вы в основном инструктируете Android предоставить список приложений, которые поддерживают отправку файла типа message/rfc822. Это не то же самое, что отправка электронного письма. mailto:Вместо этого используйте протокол, потому что именно это понимают почтовые клиенты.
Пол Ламмерцма
34

Это правильный способ отправки электронной почты в соответствии с официальной документацией разработчика 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" );

Вы уже добавили эту строку, но приятно иметь новых пользователей

intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"youremailaddress@aviparshan.com"});

Это будет адрес получателя, то есть пользователь отправит вам (разработчику) электронное письмо.

Ави Паршан
источник
@ barnacle.m Спасибо! Это также один из самых простых методов. Проблема в том, что мой ответ не получает достаточного количества голосов :(
Ави Паршан
1
Это потому, что есть много похожих ответов, но этот указывает на официальную документацию Android по этому вопросу.
barnacle.m
1
Мне не удалось отправить адрес электронной почты. Я исправил это как этот intent.data = Uri.parse ("mailto: somemail@xyz.com")
Хитеш Бишт
18

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

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);
Аджай Шреста
источник
Ты классный, чувак.
Ашик
Без проблем чувак
Ajay Shrestha
2
Работает отлично.
Соланки
Проверьте эту статью, которая описывает это подробно: medium.com/@cketti/…
Bruno Bieri
работает хорошо, так держать
Jacks
15

Если вам нужны только почтовые клиенты, вы должны использовать 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);
Addev
источник
3
Нет, Стилл выводит множество других приложений - намного больше, чемACTION_SENDTO
Дори
10

Следующий код работает для меня нормально.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
Анам ансари
источник
8

От разработчиков документов для Android :

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);
    }
}
marvatron
источник
8

Изменить: больше не работает с новыми версиями Gmail

Тогда это был единственный способ заставить его работать с любыми персонажами.

Ответ doreamon - правильный путь, так как он работает со всеми персонажами в новых версиях Gmail.

Старый ответ:


Вот мой. Кажется, он работает на всех версиях Android, с поддержкой темы и тела сообщения и полной поддержкой символов utf-8:

public static void email(Context context, String to, String subject, String body) {
    StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to));
    if (subject != null) {
        builder.append("?subject=" + Uri.encode(Uri.encode(subject)));
        if (body != null) {
            builder.append("&body=" + Uri.encode(Uri.encode(body)));
        }
    }
    String uri = builder.toString();
    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
    context.startActivity(intent);
}
minipif
источник
1
+1 Uri.encodeправильный путь. Но зачем называть это дважды для предмета и тела?
Джулио Пьянкастелли
Так что делать кодирование самостоятельно - это просто плохая идея. Лучше использовать правильное намерение с необходимыми дополнениями, см., Например, stackoverflow.com/a/15022222
Джулио Пьянкастелли
Для меня это лучший ответ, потому что другие решения корректно работают только с некоторыми приложениями электронной почты. Это работает с каждым приложением электронной почты, которое я тестировал.
Egis
7

Ни одно из этих решений не помогло мне. Вот минимальное решение, которое работает на Lollipop. На моем устройстве в результирующем списке выбора отображаются только Gmail и собственные почтовые приложения.

Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
                                Uri.parse("mailto:" + Uri.encode(address)));

emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));
scottt
источник
7

Работает на всех версиях Android:

String[] TO = {"email@server.com"};
    Uri uri = Uri.parse("mailto:email@server.com")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
Усама Саид США
источник
Ваш ответ помог мне. Спасибо
Аднан Хан
5

Следующий Кодекс работал для меня!

import android.support.v4.app.ShareCompat;
    .
    .
    .
    .
final Intent intent = ShareCompat.IntentBuilder
                        .from(activity)
                        .setType("application/txt")
                        .setSubject(subject)
                        .setText("Hii")
                        .setChooserTitle("Select One")
                        .createChooserIntent()
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

activity.startActivity(intent);
Суйог Гунджал
источник
5

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

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));
EpicPandaForce
источник
5

Если вы хотите, чтобы ваше намерение обрабатывалось только почтовым приложением (а не другими текстовыми сообщениями или социальными приложениями), используйте это ACTION_SENDTOдействие и включите схему данных «mailto:». Например:

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);
    }
}

Я нашел это в https://developer.android.com/guide/components/intents-common.html#Email

Ламин Слиманы
источник
5

в Котлине, если кто-то смотрит

val emailArrray:Array<String> = arrayOf("travelagentsupport@kkk.com")
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, emailArrray)
intent.putExtra(Intent.EXTRA_SUBJECT, "Inquire about travel agent")
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
mughil
источник
4

Большинство из этих ответов работают только для простого случая, когда вы не отправляете вложение . В моем случае мне иногда нужно отправить вложение (ACTION_SEND) или два вложения (ACTION_SEND_MULTIPLE).

Поэтому я взял лучшие подходы из этой темы и объединил их. Он использует библиотеку поддержки, ShareCompat.IntentBuilderно я показываю только те приложения, которые соответствуют ACTION_SENDTO с "mailto:" uri. Таким образом, я получаю только список почтовых приложений с поддержкой вложений:

fun Activity.sendEmail(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
    val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
    val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
    val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
    val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
    val targetedIntents = originalIntentResults
            .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
            .map {
                createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
            }
            .toMutableList()
    val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
    finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
    startActivity(finalIntent)
}

private fun Activity.createEmailShareIntent(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
    val builder = ShareCompat.IntentBuilder.from(this)
            .setType("message/rfc822")
            .setEmailTo(recipients.toTypedArray())
            .setStream(file)
            .setSubject(subject)
    if (secondFile != null) {
        builder.addStream(secondFile)
    }
    if (text != null) {
        builder.setText(text)
    }
    return builder.intent
}
Давид Вавра
источник
Похоже, это может быть полезно; есть ли шанс получить его на Java?
Кайл Хумфельд
1
Kotlin очень похож на Java, вы должны быть в состоянии скопировать вставить и просто изменить несколько вещей.
Давид Вавра
3

Использование intent.setType("message/rfc822");работает, но показывает дополнительные приложения, которые не обязательно обрабатывают электронную почту (например, GDrive). Использование Intent.ACTION_SENDTOс setType("text/plain")является лучшим, но вы должны добавить, setData(Uri.parse("mailto:"))чтобы получить лучшие результаты (только приложения электронной почты). Полный код выглядит следующим образом:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.setData(Uri.parse("mailto:IT@RMAsoft.NET"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Email from My app");
intent.putExtra(Intent.EXTRA_TEXT, "Place your email message here ...");
startActivity(Intent.createChooser(intent, "Send Email"));
Рами Аллоуш
источник
Идеальная душа
Дакеш Векария
2

Если вы хотите настроить таргетинг на Gmail, сделайте следующее. Обратите внимание, что целью является "ACTION_SENDTO", а не "ACTION_SEND", и дополнительные поля намерения не являются обязательными для Gmail.

String uriText =
    "mailto:youremail@gmail.com" + 
    "?subject=" + Uri.encode("your subject line here") + 
    "&body=" + Uri.encode("message body here");

Uri uri = Uri.parse(uriText);

Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
if (sendIntent.resolveActivity(getPackageManager()) != null) {
   startActivity(Intent.createChooser(sendIntent, "Send message")); 
}
pcodex
источник
2

Я обновляю ответ Адиля в Котлине,

val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, Array(1) { "test@email.com" })
intent.putExtra(Intent.EXTRA_SUBJECT, "subject")
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    showSnackBar(getString(R.string.no_apps_found_to_send_mail), this)
}
Кишан Соланки
источник
Это не удается, даже если Gmail находится в приложении.
AndroidDev
@AndroidDev в каком устройстве вы столкнулись с проблемой?
Кишан Соланки
2

Пожалуйста, используйте код ниже:

                try {

                    String uriText =
                            "mailto:emailid" +
                                    "?subject=" + Uri.encode("Feedback for app") +
                                    "&body=" + Uri.encode(deviceInfo);
                    Uri uri = Uri.parse(uriText);
                    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
                    emailIntent.setData(uri);
                    startActivity(Intent.createChooser(emailIntent, "Send email using..."));
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(ContactUsActivity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
                }
Тушар Бапте
источник
1

Может быть, вы должны попробовать это: intent.setType("plain/text");

Я нашел это здесь . Я использовал его в своем приложении, и он показывает только параметры электронной почты и Gmail.

sianis
источник
2
«Обычный / текстовый» показывает Bluetooth, Skype и т. д. Проверьте желаемый вывод в приложении Android Market. Шаги перечислены в вопросе.
Дира
1
Использование MIME-типа для выполнения операции отправки - плохая идея, потому что вы в основном инструктируете Android предоставить список приложений, которые поддерживают отправку файла типа plain/text, а это даже не допустимый тип MIME. Это не то же самое, что отправка электронного письма. mailto:Вместо этого используйте протокол, потому что именно это понимают почтовые клиенты.
Пол Ламмерцма
1

Составьте письмо в почтовом клиенте телефона:

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

источник
1

Использовать этот:

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

используйте build gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
Manish
источник
1

Это то, что я использую, и это работает для меня:

//variables
String subject = "Whatever subject you want";
String body = "Whatever text you want to put in the body";
String intentType = "text/html";
String mailToParse = "mailto:";

//start Intent
Intent variableName = new Intent(Intent.ACTION_SENDTO);
variableName.setType(intentType);
variableName.setData(Uri.parse(mailToParse));
variableName.putExtra(Intent.EXTRA_SUBJECT, subject);
variableName.putExtra(Intent.EXTRA_TEXT, body);

startActivity(variableName);

Это также позволит пользователю выбрать предпочитаемое приложение электронной почты. Единственное, что вам не разрешено делать, - это задать адрес электронной почты получателя.

кузнечик
источник
Вам не хватает "на 2-й строке.
Тим
1

Этот код работает в моем устройстве

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"mahendrarajdhami@gmail.com"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));
Mahen
источник
он только открывает Gmail и Email в моем устройстве
Магена
1
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", email, null));
if (emailIntent.resolveActivity(context.getPackageManager()) != null) {
    context.startActivity(Intent.createChooser(emailIntent, "Send Email..."));
} else {
    Toast.makeText(context, "No apps can perform this action.", Toast.LENGTH_SHORT).show();
}
Ахамадулла Сайкат
источник