【问题标题】:Send Email Intent发送电子邮件意图
【发布时间】:2012-01-31 20:45:41
【问题描述】:
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"));

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

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

我在“Android Market”应用程序中看到了这样的示例。

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

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

【问题讨论】:

标签: android email android-intent


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    科特林:

    val email: String = getEmail()
    val intent = Intent(Intent.ACTION_SENDTO)
    intent.data = Uri.parse("mailto:$email" )
    startActivity(intent)
    

    【讨论】:

      【解决方案3】:

      适用于所有安卓版本:

      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(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)的主题和正文。但我找到了答案here

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

      【讨论】:

      • 您的回答帮助了我。谢谢
      • 该死的邮件在 java 版本的 gmail 中不被接受/为空。
      • 不要使用过时的java版本。添加了新功能以支持所有 android 版本。
      【解决方案4】:

      按照这封信,你应该没有问题

      https://developer.android.com/guide/components/intents-common#ComposeEmail

      确保在使用 ACTION_SENDTO 时在 EXTRA_EMAIL 字段中传递一个数组

      【讨论】:

        【解决方案5】:

        我几乎在 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
            }
        

        【讨论】:

          【解决方案6】:

          更新

          官方做法:

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

          Ref link

          老答案

          接受的答案不适用于 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
          

          【讨论】:

          • 你是对的,它在 4.2 上也没有。所以这实际上是唯一正确的答案,谢谢!
          • 这是完美的。下面有人提到,指定“mailto”部分是缩小电子邮件客户端可用选项的原因。使用 Uri.fromParts("mailto", "", null) 会将光标放在收件人字段中 - 非常适合我的需要。
          • 试试这个 emailIntent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");
          • 如果您没有特定的收件人,这也可以:Uri.fromParts("mailto", "", null)
          • 这不再适用于我的 Android 4.3。请查看 Android 官方文档,了解如何将电子邮件作为 Intent 发送,该文档非常有效:developer.android.com/guide/components/…
          【解决方案7】:

          ACTION_VIEW 也有一个简单的解决方案:

            Intent intent = new Intent(Intent.ACTION_VIEW);
                  Uri data = Uri.parse("mailto:customer@something.com?subject=Feedback");
                  intent.setData(data);
                  startActivity(intent);
          

          【讨论】:

            【解决方案8】:

            这是根据Android Developer Official Documentation发送电子邮件意图的正确方法

            将这些代码行添加到您的应用中:

            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[]{"donotemail-stack-overflow@unitmeasure-app.xyzed"});
            

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

            【讨论】:

            • @barnacle.m 谢谢!这也是比较简单的方法之一。问题是我的回答没有得到足够的支持:(
            • 因为有很多类似的答案,但是这个指出了Android官方文档关于此事。
            • 我无法发送电子邮件地址。我像这样修复它 intent.data = Uri.parse("mailto:somemail@xyz.com")
            • 直到我将 Intent.ACTION_SEND 更改为 Intent.ACTION_SENDTO 后,这才起作用。
            • 我总是忘记'Intent.EXTRA_EMAIL'值必须是一个数组,否则它不会填充邮件客户端中的“收件人”字段(至少Gmail App客户端无论如何,没有' t 测试其他人)
            【解决方案9】:

            有时您需要打开默认电子邮件应用来查看收件箱而不创建新信件,在这种情况下会有所帮助:

            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_APP_EMAIL);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            }
            

            【讨论】:

              【解决方案10】:

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

              Java 版本

              Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
              emailIntent.setData(Uri.parse("mailto:abc@xyz.com"));
              startActivity(Intent.createChooser(emailIntent, "Send feedback"));
              

              Kotlin 版本

              val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
                  data = Uri.parse("mailto:abc@xyz.com")
              }
              startActivity(Intent.createChooser(emailIntent, "Send feedback"))
              

              这是我的输出(仅建议使用 Gmail + Inbox):

              我从Android Developers 网站获得了这个解决方案。

              【讨论】:

              • 对我来说,mailto 和电子邮件之间没有空格很重要:mailto:abc@xyz.com
              • 很好的解决方案,我也有同样的要求,非常感谢!!!!
              • 优秀的解决方案。如果您也可以展示如何添加主题和正文,您会很棒吗?
              【解决方案11】:

              编辑:不再使用新版本的 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);
              }
              

              【讨论】:

              • +1 Uri.encode 是正确的方法。但是为什么要为主题和主体调用两次呢?
              • 因此,自己进行编码只是个坏主意。更好地使用适当的 Intent 和必要的附加功能,参见例如stackoverflow.com/a/15022222
              • 对我来说这是最好的答案,因为其他解决方案仅适用于某些电子邮件应用程序。这个适用于我测试过的每个电子邮件应用程序。
              【解决方案12】:

              终于想出了最好的办法

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

              【讨论】:

              • 这是唯一能得到的答案:To、From、Subject、Body。
              【解决方案13】:

              如果有人在看,请在 Kotlin

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

              【讨论】:

                【解决方案14】:

                使用 Kotlin,可以使用 Gmail:

                val i = Intent(Intent.ACTION_SENDTO).apply {
                    type = "text/html"
                    data = Uri.parse("mailto:")
                    putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
                    putExtra(Intent.EXTRA_SUBJECT, subject)
                    putExtra(Intent.EXTRA_TITLE, subject)
                }
                if (packageManager != null && i.resolveActivity(packageManager) != null) {
                    startActivity(i)
                }
                

                如果有人也找到了显示消息的解决方案...

                【讨论】:

                  【解决方案15】:

                  请使用以下代码:

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

                  【讨论】:

                    【解决方案16】:

                    使用 intent.setType("message/rfc822"); 确实有效,但它显示了不一定处理电子邮件的额外应用程序(例如 GDrive)。使用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: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"));
                    

                    【讨论】:

                    • 完美灵魂
                    【解决方案17】:
                    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();
                    }
                    

                    【讨论】:

                      【解决方案18】:

                      仅向电子邮件客户发送 - 带有多个附件

                      有很多解决方案,但都是部分工作。

                      ma​​ilto 正确过滤电子邮件应用程序,但无法不发送流/文件。

                      message/rfc822 与电子邮件客户端一起打开了地狱般的应用程序

                      所以,解决方案是同时使用两者。

                      1. 首先使用 mailto Intent 解决 Intent 活动
                      2. 然后将数据设置为解析为发送所需数据的每个活动
                      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;
                      }
                      

                      根据查询意图过滤所需意图的实用程序类

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

                      【讨论】:

                      • 非常感谢您的回答,这是唯一一个对我有用的还包括附件的答案。不知道为什么这种情况下投反对票,因为我在这里投了赞成票。
                      【解决方案19】:

                      来自Android developers docs

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

                      【讨论】:

                        【解决方案20】:

                        我正在更新 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) { "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 在应用程序上也会失败。
                        • @AndroidDev 您在哪个设备上遇到问题?
                        【解决方案21】:

                        使用 Anko - kotlin

                        context.email(email, subject, body)
                        

                        【讨论】:

                          【解决方案22】:

                          如果您想定位 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")); 
                          }
                          

                          【讨论】:

                            【解决方案23】:

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

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

                            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
                            }
                            

                            【讨论】:

                            • 这看起来很有用;有机会在 Java 中获得它吗?
                            • Kotlin 与 Java 非常相似,你应该可以复制粘贴,只需更改一些内容。
                            • 由于查询包限制,无法在 android 11 上运行
                            【解决方案24】:

                            当你像下面这样改变你的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 类型。但是,这并不表示“只提供电子邮件客户端”——它表示“提供任何支持消息/rfc822 数据的东西”。这可能很容易包括一些不是电子邮件客户端的应用程序。

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

                            【讨论】:

                            • 您能否提供一些代码来产生所需的输出?
                            • 当我使用ACTION_SENDTO 时,意图选择器显示no apps installed to perform this intent。我使用的是 Android 4.1.2,并且我安装了一个电子邮件应用程序...
                            • “正确”的方法是 Magnus 的答案。我建议原始海报更改接受的答案。
                            • 使用 MIME 类型执行发送操作是个坏主意,因为您基本上是在指示 Android 提供支持发送 message/rfc822 类型文件的应用列表。这与发送电子邮件相同。请改用mailto: 协议,因为这是电子邮件客户端真正理解的内容。
                            【解决方案25】:

                            这对我有用:

                            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 等),并且它正确地将电子邮件地址和主题插入到电子邮件中。

                            【讨论】:

                              【解决方案26】:

                              此代码在我的设备中运行

                              Intent mIntent = new Intent(Intent.ACTION_SENDTO);
                              mIntent.setData(Uri.parse("mailto:"));
                              mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"mahendrarajdhami@gmail.com"});
                              mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
                              startActivity(Intent.createChooser(mIntent, "Send Email Using..."));
                              

                              【讨论】:

                              • 它只在我的设备中打开 Gmail 和电子邮件
                              【解决方案27】:

                              如果您想确保您的意图仅由电子邮件应用程序(而不是其他短信或社交应用程序)处理,请使用 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找到了这个

                              【讨论】:

                                【解决方案28】:

                                这是我使用的,它对我有用:

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

                                这也将让用户选择他们喜欢的电子邮件应用程序。唯一不允许您做的事情是设置收件人的电子邮件地址。

                                【讨论】:

                                • 您在第二行缺少"
                                【解决方案29】:

                                使用这个:

                                boolean success = EmailIntentBuilder.from(activity)
                                        .to("support@example.org")
                                        .cc("developer@example.org")
                                        .subject("Error report")
                                        .body(buildErrorReport())
                                        .start();
                                

                                使用构建等级:

                                compile 'de.cketti.mailto:email-intent-builder:1.0.0'
                                

                                【讨论】:

                                  【解决方案30】:

                                  主要有三种方法:

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

                                  【讨论】:

                                  • 这对我来说效果更好 - 其他选项会弹出一些直接的东西(例如 Skype)作为可能的处理程序。
                                  • 如果缓冲区中有% 符号,则生成的电子邮件中的某些字符将无法正确编码。您需要表演@minipif 建议的Uri.encode 舞蹈。
                                  • 这是最好的答案,不要浪费你的时间去尝试别人,这里的第二个是我选择的,它工作得很好,只显示纯电子邮件应用程序,而不是 gDrive,而不是蓝牙。 . 等等谢谢@becomputer06
                                  • ShareCompat 结果几乎适用于所有应用程序,而不仅仅是电子邮件客户端!
                                  • .setType("message/rfc822") 的第三个选项在选择器对话框(Android 8.1)中给了我太多不相关的选项。旧的 Intent.ACTION_SENDTO 方法效果最好!
                                  猜你喜欢
                                  • 2013-02-21
                                  • 1970-01-01
                                  • 2011-09-12
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2014-06-06
                                  • 2013-12-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多