Отправить письмо Намерение
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.
- Откройте приложение Android Market
- Откройте любое приложение, в котором разработчик указал свой адрес электронной почты. (Если вы не можете найти такое приложение, просто откройте мое приложение:- market://details? Id=com.becomputer06.vehicle.diary.free, ИЛИ поиск по "Дневнику автомобиля")
- Прокрутите вниз до "РАЗРАБОТЧИК"
- Нажмите "Отправить письмо"
В диалоговом окне отображаются только приложения электронной почты, например, Gmail, Yahoo Mail и т. Д. В нем не отображаются Bluetooth, Orkut и т. Д. Какой код создает такой диалог?
41 ответ
Когда вы измените ваш 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
Принятый ответ не работает на 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
Есть три основных подхода:
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
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: abc@xyz.com"));
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[] { "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 и т. Д.), И корректно вставляет адрес электронной почты и тему в сообщение.
Это способ сделать это в соответствии с Документами разработчика 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" );
Наконец придумать лучший способ сделать
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);
Работает на всех версиях 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..."));
Если вы хотите только почтовые клиенты, вы должны использовать 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);
Изменить: больше не работает с новыми версиями 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);
}
Ни одно из этих решений не помогло мне. Вот минимальное решение, которое работает на 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..."));
Большинство из этих ответов работают только для простого случая, когда вы не отправляете вложение. В моем случае мне иногда нужно отправить вложение (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
}
От разработчиков документов для 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);
}
}
В котлин если кто смотрит
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);
}
Следующий Кодекс работал для меня!
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);
Если вы хотите, чтобы ваши намерения обрабатывались только почтовым приложением (а не другими текстовыми сообщениями или социальными приложениями), используйте 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
Это прекрасно работает для меня:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("mailto:" + address));
startActivity(Intent.createChooser(intent, "E-mail"));
С помощью 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"));
Вот как мне это удается сделать в kotlin:
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:")
intent.putExtra(Intent.EXTRA_EMAIL, emailAddress)
intent.putExtra(Intent.EXTRA_SUBJECT, emailSubject)
intent.putExtra(Intent.EXTRA_TEXT, emailBody)
context.startActivity(intent)
Надеюсь, это может помочь
Пожалуйста, используйте приведенный ниже код:
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();
}
Котлин:
val email: String = getEmail()
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:$email" )
startActivity(intent)
Я обновляю ответ Адиля в Котлине,
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, сделайте следующее. Обратите внимание, что целью является "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"));
}
String sendEmailTo = "abc@xyz.com";
String subject = "Subject";
String body = "Body";
Uri uri = Uri.parse("mailto:"+sendEmailTo+"?subject="+subject+"&body="+body);
startActivity(new Intent(Intent.ACTION_VIEW, uri);
Это сработало для меня. Это покажет только почтовое приложение в окне выбора намерений.
Кроме того: одна проблема, с которой я столкнулся при использовании этого метода, заключается в том, что я не смог добавить пробел в предложения и основной текст. Итак, чтобы поставить пробелы в предложении или основном тексте, замените пробел на
%20
ОТПРАВИТЬ ТОЛЬКО ПОЧТОВЫМ КЛИЕНТАМ - С НЕСКОЛЬКИМИ ПРИЛОЖЕНИЯМИ
Есть много решений, но все работают частично.
mailto правильно фильтрует почтовые приложения, но не может отправлять потоки / файлы.
message / rfc822 открывает адские приложения и почтовые клиенты
Итак, решение для этого заключается в использовании обоих.
- Сначала разрешите действия намерения, используя mailto намерение
- Затем установите данные для каждого действия, разрешенного для отправки необходимых данных.
private void share()
{
Intent queryIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
Intent dataIntent = getDataIntent();
Intent targetIntent = getSelectiveIntentChooser(context, queryIntent, dataIntent);
startActivityForResult(targetIntent);
}
Создайте требуемую цель данных, которая заполнена необходимыми данными для обмена
private Intent getDataIntent()
{
Intent dataIntent = buildIntent(Intent.ACTION_SEND, null, "message/rfc822", null);
// Set subject
dataIntent.putExtra(Intent.EXTRA_SUBJECT, title);
//Set receipient list.
dataIntent.putExtra(Intent.EXTRA_EMAIL, toRecipients);
dataIntent.putExtra(Intent.EXTRA_CC, ccRecipients);
dataIntent.putExtra(Intent.EXTRA_BCC, bccRecipients);
if (hasAttachments())
{
ArrayList<Uri> uris = getAttachmentUriList();
if (uris.size() > 1)
{
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
dataIntent.putExtra(Intent.EXTRA_STREAM, uris);
}
else
{
dataIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris.get(0));
}
}
return dataIntent;
}
protected ArrayList<Uri> getAttachmentUriList()
{
ArrayList<Uri> uris = new ArrayList();
for (AttachmentInfo eachAttachment : attachments)
{
uris.add(eachAttachment.uri);
}
return uris;
}
Класс Utitlity для фильтрации требуемых намерений на основе намерения запроса
// Placed in IntentUtil.java
public static Intent getSelectiveIntentChooser(Context context, Intent queryIntent, Intent dataIntent)
{
List<ResolveInfo> appList = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY);
Intent finalIntent = null;
if (!appList.isEmpty())
{
List<android.content.Intent> targetedIntents = new ArrayList<android.content.Intent>();
for (ResolveInfo resolveInfo : appList)
{
String packageName = resolveInfo.activityInfo != null ? resolveInfo.activityInfo.packageName : null;
Intent allowedIntent = new Intent(dataIntent);
allowedIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
allowedIntent.setPackage(packageName);
targetedIntents.add(allowedIntent);
}
if (!targetedIntents.isEmpty())
{
//Share Intent
Intent startIntent = targetedIntents.remove(0);
Intent chooserIntent = android.content.Intent.createChooser(startIntent, "");
chooserIntent.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
chooserIntent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION);
finalIntent = chooserIntent;
}
}
if (finalIntent == null) //As a fallback, we are using the sent data intent
{
finalIntent = dataIntent;
}
return finalIntent;
}
Это то, что я использую, и это работает для меня:
//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);
Это также позволит пользователю выбрать предпочитаемое приложение электронной почты. Единственное, что вам не разрешено делать, - это задать адрес электронной почты получателя.
Я почти использовал все ответы здесь на android 11, но они не работали должным образом. некоторые из них не помещают mailto в обязательное поле, а некоторые вообще не работают. поэтому я прочитал новую документацию и обнаружил, что электронные письма mailto должны быть в массиве, так что то, что сработало для меня, наконец, здесь. В любом случае спасибо за все ответы, в конце концов, они помогли.
//mail me
findViewById<TextView>(R.id.mailme).setOnTouchListener { _, _ ->
try {
val mail: Array<String> = arrayOf("somemail@cc.com")
val mailme = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:")
putExtra(Intent.EXTRA_EMAIL, mail)
putExtra(Intent.EXTRA_TEXT, "Hey We Need Your Help With This Issue.")
putExtra(Intent.EXTRA_SUBJECT, "At Logs Calculator, We Need Your Help !")
}
startActivity(mailme)
} catch (e: Exception) {
e.printStackTrace()
}
true
}