发送电子邮件意向

Send Email Intent

提问人:dira 提问时间:1/2/2012 最后编辑:Ramesh Rdira 更新时间:9/17/2023 访问量:478666

问:

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

上面的代码打开一个对话框,显示以下应用程序:- 蓝牙、Google Docs、Yahoo Mail、Gmail、Orkut、Skype 等。

实际上,我想过滤这些列表选项。我只想显示与电子邮件相关的应用程序,例如 Gmail 和 Yahoo Mail。怎么做?

我在“Android Market”应用程序上看到过这样的例子。

  1. 打开 Android Market 应用
  2. 打开开发人员指定了他/她的电子邮件地址的任何应用程序。(如果您找不到这样的应用程序,请打开我的应用程序:- market://details?id=com.becomputer06.vehicle.diary.free,或按“车辆日记”搜索)
  3. 向下滚动到“开发人员”
  4. 点击“发送电子邮件”

该对话框仅显示电子邮件应用程序,例如 Gmail、Yahoo Mail 等。它不显示蓝牙、Orkut 等。什么代码会产生这样的对话框?

Android 电子邮件 android-intent

评论

4赞 Thommy 1/2/2012
对不起,Intent.ACTION_SEND无法做到这一点。也许它直接适用于gmail-App,但我不知道这是否可能。
22赞 bigstones 8/16/2012
如果有人碰巧在这里了解电子邮件意图,EXTRA_MAIL应该对应于 a ,而不仅仅是此处所示的 a。String[]String
0赞 Sergey Glotov 9/25/2013
通过 gmail 发送电子邮件的可能副本
0赞 A P 2/3/2017
使用 Android Intent.ACTION_SEND发送电子邮件可能重复
0赞 Felix D. 7/27/2017
请参阅此处以获取一些好的建议:medium.com/@cketti/...

答:

1赞 sianis 1/2/2012 #1

也许你应该试试这个:intent.setType("plain/text");

我在这里找到了。我已经在我的应用程序中使用了它,它只显示电子邮件和 Gmail 选项。

评论

2赞 dira 1/2/2012
“纯/文本”显示蓝牙、Skype 等。在 Android Market 应用程序中查看所需的输出。问题中列出了步骤。
1赞 Paul Lammertsma 5/28/2013
使用 MIME 类型执行发送操作是一个坏主意,因为您基本上是在指示 Android 提供支持发送文件类型的应用程序列表,而这甚至不是有效的 MIME 类型。这与发送电子邮件不同。请改用该协议,因为这是电子邮件客户端实际理解的内容。plain/textmailto:
236赞 Padma Kumar 1/2/2012 #2

当您更改 intent.setType 时,如下所示,您将获得

intent.setType("text/plain");

用于仅获取电子邮件客户端列表,而不获取 facebook 或其他应用程序。只是电子邮件客户端。 前任:android.content.Intent.ACTION_SENDTO

new Intent(Intent.ACTION_SENDTO);

我不建议您直接访问电子邮件应用程序。让用户选择他最喜欢的电子邮件应用。不要束缚他。

如果使用 ACTION_SENDTO,则 putExtra 无法向 intent 添加主题和文本。使用 Uri 添加主题和正文文本。

编辑:我们可以使用 MIME 类型来代替。但是,这并不表示“仅提供电子邮件客户端”,而是表示“提供任何支持消息/rfc822 数据的内容”。这很容易包括一些不是电子邮件客户端的应用程序。message/rfc822"text/plain"

message/rfc822支持MIME类型.mhtml, .mht, .mime

评论

7赞 dira 1/2/2012
你能提供一些代码来产生所需的输出吗?
9赞 Padma Kumar 1/3/2012
@becomputer06参考:stackoverflow.com/questions/8284706/send-email-via-gmail
89赞 ffleandro 11/28/2012
当我使用 .我使用的是 Android 4.1.2,并且安装了电子邮件应用程序...no apps installed to perform this intentACTION_SENDTO
4赞 jhabbott 2/13/2013
“正确”的方式是马格努斯的答案。我建议使用原始海报来更改接受的答案。
12赞 Paul Lammertsma 5/28/2013
使用 MIME 类型执行发送操作是一个坏主意,因为您基本上是在指示 Android 提供支持发送文件类型的应用程序列表。这与发送电子邮件不同。请改用该协议,因为这是电子邮件客户端实际理解的内容。message/rfc822mailto:
37赞 Magnus 1/4/2012 #3

尝试:

intent.setType("message/rfc822");

评论

0赞 gurbieta 11/17/2012
他是对的,我试过了并提供 [Drive、Email、Gmail、Skype],这应该是“正确答案”
18赞 Paul Lammertsma 5/28/2013
使用 MIME 类型执行发送操作是一个坏主意,因为您基本上是在指示 Android 提供支持发送文件类型的应用程序列表。这与发送电子邮件不同。请改用该协议,因为这是电子邮件客户端实际理解的内容。message/rfc822mailto:
984赞 thanhbinh84 2/22/2013 #4

更新

官方方法:

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

参考链接

旧答案

接受的答案在 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

评论

8赞 mDroidd 4/1/2013
你是对的,在 4.2 上也没有。所以这其实是唯一正确的答案,谢谢!
13赞 Shaggy 8/17/2013
这是完美的。下面有人提到,指定“mailto”部分是缩小电子邮件客户端可用选项的原因。使用 Uri.fromParts(“mailto”, “”, null) 会将光标放在收件人字段中 - 非常适合我需要的东西。
25赞 thanhbinh84 9/1/2013
试试这个 emailIntent.putExtra(Intent.EXTRA_TEXT, “I'm email body.”);
16赞 Phil 11/13/2013
如果您没有特定的收件人,这也有效:Uri.fromParts("mailto", "", null)
31赞 marcwjj 4/14/2015
这在我的 Android 4.3 上不再有效。请查看官方 Android 文档 关于发送电子邮件作为意图,它运行良好:developer.android.com/guide/components/...
281赞 dira 4/25/2013 #5

主要有三种方法:

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

评论

2赞 Chris Rae 7/9/2013
这对我来说效果更好 - 其他选项弹出了一些直接的东西(例如Skype)作为可能的处理程序。
2赞 Giulio Piancastelli 8/2/2013
如果缓冲区中有符号,则生成的电子邮件中的某些字符将无法正确编码。您需要表演@minipif建议的舞蹈。%Uri.encode
19赞 Hugo 11/10/2014
这是这里最好的答案,不要浪费时间尝试其他人,这里的第二个是我选择的,它运行良好,只显示纯电子邮件应用程序,而不是 gDrive,而不是蓝牙。等。谢谢@becomputer06
7赞 rpattabi 6/22/2016
ShareCompat 几乎可以在所有应用程序中生成,而不仅仅是电子邮件客户端!
4赞 Kirill Karmazin 4/2/2019
第三个选项在选择器对话框(Android 8.1)中给了我太多不相关的选项。好的老方法效果最好!.setType("message/rfc822")Intent.ACTION_SENDTO
10赞 minipif 7/27/2013 #6

编辑:不再适用于新版本的Gmail

这是我当时找到的唯一方法,让它适用于任何角色。

哆啦来梦的答案是正确的,因为它适用于新版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);
}

评论

1赞 Giulio Piancastelli 8/2/2013
+1 是正确的方法。但是,为什么要为主体和身体两次称呼它呢?Uri.encode
0赞 Giulio Piancastelli 8/3/2013
因此,自己进行编码只是一个坏主意。最好使用适当的意图和必要的附加功能,例如 stackoverflow.com/a/15022222
0赞 Egis 4/20/2020
对我来说,这是最好的答案,因为其他解决方案仅适用于某些电子邮件应用程序。这个适用于我测试过的每个电子邮件应用程序。
11赞 Anam Ansari 10/23/2013 #7

以下代码对我有用。

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);
16赞 Addev 2/17/2014 #8

如果您只需要电子邮件客户端,则应与数组一起使用。下面是一个示例: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);

评论

3赞 Dori 6/12/2014
不,仍然会推出许多其他应用程序 - 远远超过ACTION_SENDTO
47赞 Adil Hussain 1/24/2015 #9

这对我有用:

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 设备上尝试过,并且:

  1. 它正确地将选择器弹出窗口限制为仅显示电子邮件应用程序(电子邮件、Gmail、Yahoo Mail 等);和
  2. 它会正确地将电子邮件地址和主题插入到电子邮件中。
9赞 scottt 3/20/2015 #10

这些解决方案都不适合我。这是一个适用于棒棒糖的最小解决方案。在我的设备上,只有 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..."));
120赞 marcwjj 4/14/2015 #11

这是从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);
    }
}

评论

7赞 Mikey 5/1/2015
同意!我很惊讶这样的答案在列表中如此之远。我想这一定是 Android Docs 中相对较新的更改。
1赞 dev_android 9/19/2015
伟大!可靠的一个,它提到了 Android 应用程序开发人员的“圣经”。
1赞 Nigel Crasto 3/17/2016
mailto之后的冒号为我做了伎俩!我使用的是“mailto”而不是“mailto:”
1赞 Juanin 7/2/2016
在 5.1.1 上工作。其他选项对我不起作用。
2赞 Pratik Butani 11/27/2018
EXTRA_EMAIL不适合我,所以我用了Uri.parse("mailto: " + myEmail)
1赞 user3150090 5/26/2015 #12

在电话电子邮件客户端中撰写电子邮件:

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, ""));
37赞 A P 6/5/2015 #13

这是根据 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" );

您已经在问题中添加了此行

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

这将是收件人的地址,这意味着用户将向您(开发人员)发送一封电子邮件。

评论

0赞 A P 3/1/2018
@barnacle.m 谢谢!这也是更简单的方法之一。问题是我的回答没有得到足够的赞成票:(
1赞 barnacle.m 3/1/2018
这是因为有很多类似的答案,但这个答案指出了关于此事的官方 Android 文档。
1赞 Hitesh Bisht 1/11/2020
我无法发送电子邮件地址。我像这样修复它 intent.data = Uri.parse(“mailto:[email protected]")
1赞 Westy92 10/8/2020
直到我更改为 .Intent.ACTION_SENDIntent.ACTION_SENDTO
1赞 ProjectDelta 12/6/2020
我总是忘记“Intent.EXTRA_EMAIL”值必须是数组,否则它不会填充邮件客户端中的“收件人”字段(至少是 Gmail 应用程序客户端,没有测试过其他客户端)
5赞 Suyog Gunjal 12/4/2015 #14

以下代码对我有用!!

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);
5赞 EpicPandaForce 12/22/2015 #15

这对我来说非常有效:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));
110赞 capt.swag 2/3/2016 #16

一个迟到的答案,尽管我想出了一个可以帮助其他人的解决方案:

Java 版本

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

Kotlin 版本

val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
    data = Uri.parse("mailto:[email protected]")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))

这是我的输出(仅建议 Gmail + 收件箱):

my output

我从 Android 开发人员网站获得了这个解决方案。

评论

2赞 AlvaroSantisteban 6/13/2018
对我来说,重要的是和电子邮件之间没有空格:mailtomailto:[email protected]
0赞 Gyan Swaroop Awasthi 6/18/2020
很棒的解决方案,我有同样的要求,非常感谢!!!
2赞 Houman 11/1/2020
优秀的解决方案。如果您能展示如何添加主题和正文,那会很棒。
19赞 Usama Saeed US 3/22/2016 #17

适用于所有安卓版本:

String[] to = {"[email protected]"};
Uri uri = Uri.parse("mailto:[email protected]")
  .buildUpon()
  .appendQueryParameter("subject", "subject")
  .appendQueryParameter("body", "body")
  .build();
Intent emailIntent = new Intent(ACTION_SENDTO, uri);
emailIntent.putExtra(EXTRA_EMAIL, TO);
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

针对 Android 10 进行了更新,现在使用 Kotlin...

fun Context.sendEmail(
  address: String?,
  subject: String?,
  body: String?,
) {
  val recipients = arrayOf(address)
  val uri = address.toUri()
    .buildUpon()
    .appendQueryParameter("subject", subject)
    .appendQueryParameter("body", body)
    .build()
  val emailIntent = Intent(ACTION_SENDTO, uri).apply {
    setData("mailto:$address".toUri());
    putExtra(EXTRA_SUBJECT, subject);
    putExtra(EXTRA_TEXT, body);
    putExtra(EXTRA_EMAIL, recipients)
  }
  val pickerTitle = getString(R.string.some_title)
  ContextCompat.startActivity(this, Intent.createChooser(emailIntent, pickerTitle, null)
}

...更新到 API 30 后,代码没有填充电子邮件客户端(例如 Gmail)的主题和正文。但我在这里找到了答案:

fun Context.sendEmail(
  address: String?,
  subject: String?,
  body: String?,
) {
  val selectorIntent = Intent(ACTION_SENDTO)
    .setData("mailto:$address".toUri())
  val emailIntent = Intent(ACTION_SEND).apply {
    putExtra(EXTRA_EMAIL, arrayOf(address))
    putExtra(EXTRA_SUBJECT, subject)
    putExtra(EXTRA_TEXT, body)
    selector = selectorIntent
  }
  startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email))) 

}

评论

1赞 Adnan Khan 10/5/2016
你的回答帮助了我。谢谢
0赞 larsaars 10/1/2020
在 Java 版本中,Gmail 不接受/空该该死的邮件。
0赞 Usama Saeed US 10/2/2020
不要使用过时的 Java 版本。添加了新的以支持所有 Android 版本。
1赞 Manish 10/24/2016 #18

使用这个:

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'
5赞 Lamine Slimany 2/20/2017 #19

如果要确保仅通过电子邮件应用(而不是其他短信或社交应用)处理您的意图,请使用该操作并包含“mailto:”数据方案。例如:ACTION_SENDTO

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 中发现了这个

评论

0赞 Christian 10/20/2022
对我来说,测试如果 (intent.resolveActivity(getPackageManager()) != null) 总是 null,为什么?
30赞 Ajay Shrestha 6/20/2017 #20

最后想出最好的办法

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

评论

0赞 Prajwal Waingankar 11/9/2021
这是唯一能得到的答案:到、从、主体、正文。
9赞 David Vávra 1/7/2018 #21

这些答案中的大多数仅适用于您不发送附件的简单情况。就我而言,我有时需要发送附件 (ACTION_SEND) 或两个附件 (ACTION_SEND_MULTIPLE)。

所以我从这个线程中采用了最好的方法并将它们组合起来。它使用支持库,但我只显示与“mailto:” uri ACTION_SENDTO匹配的应用程序。这样,我只得到具有附件支持的电子邮件应用程序列表:ShareCompat.IntentBuilder

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
}

评论

0赞 Kyle Humfeld 3/6/2018
这看起来可能很有用;有机会在 Java 中获得它吗?
1赞 David Vávra 3/7/2018
Kotlin 与 Java 非常相似,您应该能够复制粘贴并更改一些东西。
2赞 Omkar T 9/8/2021
由于查询包限制,无法在 Android 11 上运行
0赞 Carl Smith 4/18/2022
@Omkar T 它在 Android 11 上确实对我有用,在我的 Android 清单中有一个提供者标签。文档中有很好的信息。
0赞 Carl Smith 4/18/2022
这种策略的一个巨大好处是,它不仅适用于多个附件,而且是 Activity 的扩展,可以轻松用于多个项目。
2赞 pcodex 2/3/2018 #22

如果您想定位 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")); 
}
3赞 Rami Alloush 8/11/2018 #23

使用 确实有效,但它显示了不一定处理电子邮件的额外应用程序(例如 GDrive)。使用 with 是最好的,但您必须添加才能获得最佳结果(仅限电子邮件应用程序)。完整代码如下:intent.setType("message/rfc822");Intent.ACTION_SENDTOsetType("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"));

评论

0赞 Daxesh V 12/31/2019
完美的灵魂
2赞 Kishan Solanki 9/19/2018 #24

我正在更新 Adil 在 Kotlin 中的答案,

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

评论

0赞 Johann 1/11/2019
即使 Gmail 在应用上,此操作也会失败。
0赞 Kishan Solanki 1/16/2019
@AndroidDev您在哪种设备中遇到问题?
9赞 marvatron 1/8/2019 #25

来自 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);
    }
}
6赞 Mughil 4/16/2019 #26

如果有人在看,请在 Kotlin

val emailArrray:Array<String> = arrayOf("[email protected]")
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);
}
3赞 Tushar Bapte 12/21/2019 #27

请使用以下代码:

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();
}            
2赞 Luchi Parejo Alcazar 10/13/2021 #28

科特林:

val email: String = getEmail()
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:$email" )
startActivity(intent)
2赞 Priyankchoudhary 11/27/2021 #29
String sendEmailTo = "[email protected]";
String subject = "Subject";
String body = "Body";
            
Uri uri = Uri.parse("mailto:"+sendEmailTo+"?subject="+subject+"&body="+body);
    
startActivity(new Intent(Intent.ACTION_VIEW, uri);

这对我有用。这将仅在 intent 选择器中显示邮件应用程序。

此外: 我使用这种方法面临的一个问题是我无法在建议和正文中添加空间。 因此,要在建议或正文文本中放置空格,请将空格替换为%20

3赞 XCarb 2/10/2023 #30

这就是我设法在 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)

希望能帮到你