Отправить задание электронной почты

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
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 и т.д. Какой код создает такой диалог?

Ответ 1

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

intent.setType("text/plain");

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

new Intent(Intent.ACTION_SENDTO);

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

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

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

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

Ответ 2

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

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","[email protected]", 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

Ссылка ссылки

Ответ 3

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

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

Ответ 4

Это цитируется официальным документом 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);
    }
}

Ответ 5

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

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:[email protected]"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));

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

my output

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

Ответ 6

Попробуйте:

intent.setType("message/rfc822");

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

Если вам нужны только клиенты электронной почты, вы должны использовать 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);

Ответ 10

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

    String to = "[email protected]";
    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);

Ответ 11

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

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);

Ответ 12

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

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

doreamon answer - правильный путь, так как он работает со всеми символами в новых версиях 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);
}

Ответ 13

Ни одно из этих решений не работало для меня. Здесь минимальное решение, которое работает на 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..."));

Ответ 14

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

String[] TO = {"[email protected]"};
    Uri uri = Uri.parse("mailto:[email protected]")
            .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..."));

Ответ 15

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

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

Ответ 16

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

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));

Ответ 17

Если вы хотите, чтобы ваше намерение обрабатывалось только приложением электронной почты (а не другими приложениями для обмена текстовыми сообщениями или социальными приложениями), то используйте действие 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

Ответ 18

Большинство из этих ответов работают только для простого случая, когда вы не отправляете вложение. В моем случае мне иногда нужно отправить вложение (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
}

Ответ 19

От разработчиков документов для 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);
    }
}

Ответ 20

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

String uriText =
    "mailto:[email protected]" + 
    "?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")); 
}

Ответ 21

в котлин если кто смотрит

            val emailArrray:Array<String> = arrayOf("[email protected]")
            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);
            }

Ответ 22

Возможно, вам стоит попробовать: intent.setType("plain/text");

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

Ответ 23

Используйте это:

boolean success = EmailIntentBuilder.from(activity)
        .to("[email protected]")
        .cc("[email protected]")
        .subject("Error report")
        .body(buildErrorReport())
        .start();

использовать build gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'

Ответ 24

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

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

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

Ответ 25

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

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"[email protected]"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));

Ответ 26

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

Ответ 27

Использование 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:[email protected]"));
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"));

Ответ 28

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

val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, Array(1) { "[email protected]" })
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)
}

Ответ 29

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

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

Ответ 30

использовать анко - котлин

context.email(email, subject, body)