Отправить Намерение Электронной Почты



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.транспорт.дневник.бесплатно, или поиск по "автомобиль Дневник")

  3. прокрутите вниз до "разработчик"

  4. нажмите на кнопку "Отправить письмо"


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

941   28  

28 ответов:

когда вы измените ваши намерения.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

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

ссылка

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

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

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

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

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

Это был мой выход (Gmail + входящие и ничего больше)

enter image description here

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

попробуй:

intent.setType("message/rfc822");

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

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

Это способ сделать это в соответствии с Android Developer Docs добавьте в приложение следующие строки кода:

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

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

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

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

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

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

Edit: больше не работает с новыми версиями 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);
}

ни одно из этих решений работал для меня. Вот минимальное решение, которое работает на леденец. На моем устройстве в результирующем списке выбора отображаются только 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..."));

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

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

работает на всех версиях 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..."));

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

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

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

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

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

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

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

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'

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

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

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

этот код работает на моем устройстве!--3-->

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

Если вы хотите настроить таргетинг на 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")); 
}

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

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

используя 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"));

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

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

использовать Anko-kotlin

context.email(email, subject, body)

Comments

    Ничего не найдено.