Отправить письмо по электронной почте - PullRequest
25 голосов
/ 27 ноября 2011

У меня есть код, предназначенный для отправки электронной почты

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_EMAIL,
                new String[] { to });
i.putExtra(Intent.EXTRA_SUBJECT, subject);
i.putExtra(Intent.EXTRA_TEXT, msg);
try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(Start.this,
                    "There are no email clients installed.",
                    Toast.LENGTH_SHORT).show();
}

Но когда это намерение срабатывает, я вижу в списке многие элементы, такие как приложение sms, приложение gmail, приложение facebook и т. Д.

Как я могу отфильтровать это и включить только приложение Gmail (или, может быть, только приложения электронной почты)?

Ответы [ 6 ]

80 голосов
/ 27 ноября 2011

Используйте android.content.Intent.ACTION_SENDTO (new Intent(Intent.ACTION_SENDTO);), чтобы получить только список почтовых клиентов, без facebook или других приложений.Только почтовые клиенты.

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

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

Пример

Intent send = new Intent(Intent.ACTION_SENDTO);
String uriText = "mailto:" + Uri.encode("email@gmail.com") + 
          "?subject=" + Uri.encode("the subject") + 
          "&body=" + Uri.encode("the body of the message");
Uri uri = Uri.parse(uriText);

send.setData(uri);
startActivity(Intent.createChooser(send, "Send mail..."));
21 голосов
/ 22 февраля 2013

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

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "EXTRA_SUBJECT");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

Надеюсь, это поможет.

13 голосов
/ 15 января 2013

Ответ Игоря Попова на 100% правильный, но если вы хотите использовать запасной вариант, я использую этот метод:

public static Intent createEmailIntent(final String toEmail, 
                                       final String subject, 
                                       final String message)
{
    Intent sendTo = new Intent(Intent.ACTION_SENDTO);
    String uriText = "mailto:" + Uri.encode(toEmail) +
            "?subject=" + Uri.encode(subject) +
            "&body=" + Uri.encode(message);
    Uri uri = Uri.parse(uriText);
    sendTo.setData(uri);

    List<ResolveInfo> resolveInfos = 
        getPackageManager().queryIntentActivities(sendTo, 0);

    // Emulators may not like this check...
    if (!resolveInfos.isEmpty())
    {
        return sendTo;
    }

    // Nothing resolves send to, so fallback to send...
    Intent send = new Intent(Intent.ACTION_SEND);

    send.setType("text/plain");
    send.putExtra(Intent.EXTRA_EMAIL,
               new String[] { toEmail });
    send.putExtra(Intent.EXTRA_SUBJECT, subject);
    send.putExtra(Intent.EXTRA_TEXT, message);

    return Intent.createChooser(send, "Your Title Here");
}
7 голосов
/ 14 апреля 2015

Это цитата из официального документа 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);
        }
    }
6 голосов
/ 10 ноября 2012

Заменить

i.setType("text/plain");

с

// need this to prompts email client only
i.setType("message/rfc822");
0 голосов
/ 07 декабря 2016
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                    "mailto","opinions@gmail.com.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "IndiaTV News - Mobile App Feedback");
emailIntent.putExtra(Intent.EXTRA_TEXT,Html.fromHtml(Settings.this.getString(R.string.MailContent)));
startActivityForResult(Intent.createChooser(emailIntent, "Send email..."),0);
...