Отправить Намерение Электронной Почты
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".
- Откройте приложение Android Market
- откройте любое приложение, в котором разработчик указал свой адрес электронной почты. (Если вы не можете найти такое приложение, просто откройте мое приложение:- market://details?id=com.becomputer06.транспорт.дневник.бесплатно, или поиск по "автомобиль Дневник")
- прокрутите вниз до "разработчик"
- нажмите на кнопку "Отправить письмо"
в диалоговом окне отображаются только приложения электронной почты, например Gmail, Yahoo Mail и т. д. Он не показывает Bluetooth, Orkut и т. д. Какой код выдает такой диалог?
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 + входящие и ничего больше)
Я получил это решение от сайт разработчиков Google
это работает для меня:
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) }

Comments