Использование Android Intent.ACTION_SEND для отправки электронной почты

Я использую Intent.ACTION_SEND для отправки электронной почты. Однако, когда я вызываю intent, он показывает выбор для отправки сообщения, отправки электронной почты, а также для отправки через Bluetooth. Я хочу, чтобы он показывал только варианты отправки электронной почты. Как я могу это сделать?

Ответ 1

Intent email = new Intent(android.content.Intent.ACTION_SEND);  
                    email.setType("application/octet-stream");    

EDIT:
Вы также можете попробовать установить тип "message/rfc822".

попробуйте это....

Ответ 2

@Ganapathy: попробуйте этот код для отображения gmail

Intent gmail = new Intent(Intent.ACTION_VIEW);
                gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail");
                gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
                gmail.setData(Uri.parse("[email protected]"));
                gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                gmail.setType("plain/text");
                gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!");
                startActivity(gmail);

Ответ 3

Это поможет вам.

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});          
email.putExtra(Intent.EXTRA_SUBJECT, "subject");
email.putExtra(Intent.EXTRA_TEXT, "message");
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));

Ответ 4

Я не беру на себя ответственность за этот ответ, но я считаю, что он дает лучший ответ на этот пост.

Это распространенное заблуждение использовать текст /plain или text/html. Это приведет к запуску любого приложения, которое может обрабатывать простые текстовые файлы или HTML файлы без какого-либо контекста, включая Google Диск, Dropbox, Evernote и Skype.

Вместо этого используйте ACTION_SENDTO, предоставляя mailto: Uri

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));

Затем вы можете продолжить использование выбора, как это предлагается с помощью других ответов.

Отвечено на @PaulLammertsma здесь Выбор электронной почты для Android

Ответ 6

У меня была аналогичная проблема с моим приложением. Недавно я нашел эту ссылку официальным сайтом разработчиков Android, который действительно помогает! Общие намерения: электронная почта

TL; DR:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));

Теперь вам будут показаны только клиенты электронной почты!

Вы можете добавить тему и тело, выполнив следующее:

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body" );

Ответ 7

Первое решение: попробуйте быть более конкретным в ваших параметрах Intent. Добавить получателя сообщения, например

emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});

Второе решение: используйте диспетчер пакетов, чтобы найти все приложения, способные отправить сообщение, и выбрать только те, которые вы хотите использовать.

Ответ 8

Я замечаю, что это довольно старый вопрос, но это первый результат при поиске решения "Отправить почту", и все ответы имеют общую проблему:

Использование Intent.ACTION_SEND и intent.setType("message/rfc822") приведет к выбору, который не только отображает почтовые приложения, но и все приложения, которые могут обрабатывать поддержку любого MIME-типа, посредством сообщения /rfc 822, например. .mhtml, .mht, .mime. Помимо почтовых приложений это может быть Google Диск, Dropbox, Evernote и т.д..

Единственное решение, которое я нашел, чтобы ограничить выбор только почтовыми приложениями, заключается в том, чтобы вместо этого использовать Intent.ACTION_SENDTO:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail");
intent.putExtra(Intent.EXTRA_TEXT   , "My Message");

try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}

Ответ 9

[Решение для API LEVEL >= 15]

Наконец-то мне удалось отправить электронное письмо С вложениями ТОЛЬКО почтовых клиентов. Я пишу это здесь, потому что мне потребовалось много времени, и это может быть полезно для других.

Проблема заключается в следующем:

  • Intent.ACTION_SENDTO принимает URI данных (поэтому вы можете указать "mailto:" схема), но он не принимает Intent: EXTRA_STREAM.

  • Intent.ACTION_SEND принимает намерение: EXTRA_STREAM (так что вы можете добавить ), но для этого требуется только тип (не URI данных), чтобы вы не могли укажите схему "mailto:" ).

Итак, Intent.ACTION_SEND позволяет пользователю выбирать из нескольких Актив, даже если вы устанавливаетеType ( "message/rfc822" ), потому что это приложение/действия может управлять всеми типами файлов (типично GDrive/Dropbox Apps) и, таким образом, даже файлы сообщений электронной почты.

Решение находится в методе setSelector. С помощью этого метода вы можете использовать Intent.ACTION_SENDTO для выбора Activity, но затем отправить Intent.ACTION_SEND Intent.

Здесь мой код решения (вложение пришло из FileProvider, но это мог быть любой файл):

{
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
    emailSelectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    emailIntent.setSelector( emailSelectorIntent );

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile);
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment);

    if( emailIntent.resolveActivity(getPackageManager()) != null )
        startActivity(emailIntent);
}

Ответ 10

Лучший код, чтобы ограничить его отправкой только электронной почты. установите этот тип, чтобы отправить только электронное письмо. i.setType("message/rfc822");

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

Ответ 11

Это комбинация решений Джека Дзилвы и Йиньэша Майяни:

    try
    {
        Intent gmailIntent = new Intent(Intent.ACTION_SEND);
        gmailIntent.setType("text/html");

        final PackageManager pm = _activity.getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0);
        String gmailActivityClass = null;

        for (final ResolveInfo info : matches)
        {
            if (info.activityInfo.packageName.equals("com.google.android.gm"))
            {
                gmailActivityClass = info.activityInfo.name;

                if (gmailActivityClass != null && !gmailActivityClass.isEmpty())
                {
                    break;
                }
            }
        }

        gmailIntent.setClassName("com.google.android.gm", gmailActivityClass);
        gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message");
        gmailIntent.setData(Uri.parse("[email protected]"));
        this._activity.startActivity(gmailIntent);
    }

    catch (Exception e)
    {
        Intent i = new Intent(Intent.ACTION_SEND);
        i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
        i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary
        i.putExtra(Intent.EXTRA_TEXT, "Email message");
        i.setType("plain/text");
        this._activity.startActivity(i);
    }

Итак, сначала он попытается открыть приложение gmail, и в случае, если у пользователя его нет, тогда будет реализован второй подход.

Ответ 12

Это спасло мой день. Он отправляет текстовое сообщение непосредственно в приложение gmail:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                        "mailto","togmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message");
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString());
startActivity(Intent.createChooser(emailIntent, "Send email..."));