【问题标题】:Using Android Intent.ACTION_SEND for sending email使用 Android Intent.ACTION_SEND 发送电子邮件
【发布时间】:2011-06-20 11:18:43
【问题描述】:

我正在使用Intent.ACTION_SEND 发送电子邮件。但是,当我拨打intent 时,它会显示发送消息、发送电子邮件以及通过蓝牙发送的选项。我希望它只显示发送电子邮件的选项。我怎样才能做到这一点?

【问题讨论】:

    标签: android email android-intent


    【解决方案1】:
    Intent email = new Intent(android.content.Intent.ACTION_SEND);  
    email.setType("application/octet-stream");    
    

    编辑:
    您也可以尝试将类型设置为"message/rfc822"

    试试这个...

    【讨论】:

    • WiFi 和蓝牙仍然可见。
    • 如果我必须为特殊附件类型使用类型?
    • @N-JOY 为什么是“application/octet-stream”,而不是“message/rfc822”?
    • 只要把类型改成email.setType("message/rfc822"); ..它会强迫你做你的工作
    • message/rfc822 支持 .mhtml、.mht、.mime 的 MIME 类型
    【解决方案2】:

    尝试使用 ACTION_VIEW 而不是 ACTION_SENDTO ,ACTION_VIEW 只会对电子邮件应用进行系统调用

    Intent emailIntent = new Intent(Intent.ACTION_VIEW);
    

    【讨论】:

      【解决方案3】:

      感谢 ARLabs 发布了关于如何在 Android 上发送电子邮件的最佳 solution。我刚刚做了一点更新 - 添加多个电子邮件附件的选项。

      fun sendEmail(context: Context, recipients: List<String>?, subject: String?, body: String?, attachments: List<Uri>?) {
          val emailIntent = Intent(Intent.ACTION_SEND_MULTIPLE)
          emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
          emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
          emailIntent.selector = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
      
          if (recipients != null) {
              val recipientsArray = arrayOfNulls<String>(recipients.size)
              ArrayList(recipients).toArray(recipientsArray)
              emailIntent.putExtra(Intent.EXTRA_EMAIL, recipientsArray)
          }
          if (subject != null) {
              emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
          }
          if (body != null) {
              emailIntent.putExtra(Intent.EXTRA_TEXT, body)
          }
          if (attachments?.isNotEmpty() == true) {
              emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(attachments))
          }
      
          if (emailIntent.resolveActivity(context.packageManager) != null) {
              context.startActivity(emailIntent)
          }
      }
      

      【讨论】:

        【解决方案4】:

        感谢开源开发者cketti 分享了这个简洁明了的解决方案。这是唯一对我有用的方法。

        String mailto = "mailto:bob@example.org" +
            "?cc=" + "alice@example.com" +
            "&subject=" + Uri.encode(subject) +
            "&body=" + Uri.encode(bodyText);
        
        Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
        emailIntent.setData(Uri.parse(mailto));
        
        try {
          startActivity(emailIntent);
        } catch (ActivityNotFoundException e) {
          //TODO: Handle case where no email app is available
        }
        

        this 是指向他/她的要点的链接。

        【讨论】:

          【解决方案5】:
          public class MainActivity extends AppCompatActivity {
          
            private EditText edt_email;
            private Button btn_send;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
          
              edt_email = (EditText) findViewById(R.id.edt_email);
              btn_send = (Button) findViewById(R.id.btn_send);
          
              btn_send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
          
                  Intent intent = new Intent(Intent.ACTION_SEND );
                  intent.putExtra(Intent.EXTRA_EMAIL , new String[]{"sanaebadi97@gmail.com"});
                  intent.putExtra(Intent.EXTRA_SUBJECT , "subject");
                  intent.putExtra(Intent.EXTRA_TEXT , "My Email Content");
                  intent.setType("message/rfc822");
                  startActivity(Intent.createChooser(intent , "Choose Your Account : "));
                }
              });
            }
          }
          

          【讨论】:

            【解决方案6】:

            这将只打开您的安卓手机中安装的电子邮件应用程序。

                    Intent intent = new Intent(Intent.ACTION_SENDTO);
                    intent.setData(Uri.parse("mailto:"));
                    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"example@gmail.com"});
                    intent.putExtra(Intent.EXTRA_SUBJECT, "email subject");
                    intent.putExtra(Intent.EXTRA_TEXT, "message body");
            
                    try {
                        startActivity(Intent.createChooser(intent, "send mail"));
                    } catch (ActivityNotFoundException ex) {
                        Toast.makeText(this, "No mail app found!!!", Toast.LENGTH_SHORT);
                    } catch (Exception ex) {
                        Toast.makeText(this, "Unexpected Error!!!", Toast.LENGTH_SHORT);
                    }
            

            【讨论】:

              【解决方案7】:

              这拯救了我的一天。它将撰写的短信直接发送到 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..."));
              

              【讨论】:

                【解决方案8】:

                [API LEVEL >=15 的解决方案]

                我终于成功地向仅向电子邮件客户发送电子邮件发送了电子邮件。 我写在这里是因为它花了我很多时间,它可能对其他人有用。

                问题是:

                • Intent.ACTION_SENDTO 采用数据 URI(因此您可以指定“mailto:” schema) 但它不接受 Intent:EXTRA_STREAM。

                • Intent.ACTION_SEND 接受 Intent:EXTRA_STREAM(因此您可以添加 附件)但它只需要类型(不是数据 URI,所以你不能 指定“mailto:”架构)。

                所以 Intent.ACTION_SEND 允许用户从多个活动中进行选择,即使您设置了类型(“message/rfc822”),因为该应用/活动可以管理所有文件类型(通常是 GDrive/Dropbox 应用)甚至电子邮件文件.

                解决方案在 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[]{"address@mail.com"});
                    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);
                }
                

                【讨论】:

                • 太好了,这是唯一真正有效且不妥协的方法。
                • 获得赏金。很好的答案,从来没有想过将 SEND 和 SENDTO 与选择器结合起来。
                • 我尝试了很多不同的方法,这个是迄今为止最好的。
                • 我花了几天时间试图找出我做错了什么。我认为有几件事,但这个答案是一个很好的答案。对我来说,我相信这是不知道我真的需要 URI 上的 WRITE 权限和设置选择器意图的组合。谢谢!
                • 除了手动检查包管理器之外,您还可以使用较新的选择器,它还可以处理用户没有电子邮件应用程序时的状态。它还将仅显示电子邮件应用程序。 startActivity(Intent.createChooser(emailIntent, null));
                【解决方案9】:

                这是 Jack Dsilva 和 Jignesh Mayani 解决方案的组合:

                    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[] { "yourmail@gmail.com" });
                        gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                        gmailIntent.putExtra(Intent.EXTRA_CC, "cc@gmail.com"); // if necessary
                        gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message");
                        gmailIntent.setData(Uri.parse("yourmail@gmail.com"));
                        this._activity.startActivity(gmailIntent);
                    }
                
                    catch (Exception e)
                    {
                        Intent i = new Intent(Intent.ACTION_SEND);
                        i.putExtra(Intent.EXTRA_EMAIL, new String[] { "yourmail@gmail.com" });
                        i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                        i.putExtra(Intent.EXTRA_CC, "cc@gmail.com"); // if necessary
                        i.putExtra(Intent.EXTRA_TEXT, "Email message");
                        i.setType("plain/text");
                        this._activity.startActivity(i);
                    }
                

                所以,首先它会尝试打开 gmail 应用程序,如果用户没有它,那么将实施第二种方法。

                【讨论】:

                  【解决方案10】:

                  我的应用也遇到了类似的问题。我最近发现这个链接来自官方的 android 开发者网站,真的很有帮助! Common Intents: Email

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

                  【讨论】:

                    【解决方案11】:

                    我注意到,这是一个相当古老的问题,但它是搜索“发送邮件”解决方案时的第一个结果,并且所有答案都有一个共同问题:

                    使用Intent.ACTION_SENDintent.setType("message/rfc822") 将导致选择器不仅显示邮件应用程序,还显示所有可以处理消息/rfc822 支持的任何 MIME 类型的应用程序,例如.mhtml.mht.mime。除了邮件应用,这可能是 Google Drive、Dropbox、Evernote 等

                    我发现将选择器仅限于邮件应用程序的唯一解决方案是改用 Intent.ACTION_SENDTO:

                    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","address@example.com", 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();
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      将其限制为仅发送电子邮件的最佳代码。将此类型设置为仅发送电子邮件。 i.setType("message/rfc822");

                              Intent i = new Intent(Intent.ACTION_SEND);
                              i.setType("message/rfc822");
                              i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"skapis1@outlook.com"});
                              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();
                              }
                      

                      【讨论】:

                        【解决方案13】:

                        我不认为这个答案是我的功劳,但我相信它为这篇文章提供了最好的答案。

                        使用 text/plain 或 text/html 是一种常见的误解。这将触发任何可以在没有任何上下文的情况下处理纯文本或 HTML 文本文件的应用程序,包括 Google Drive、Dropbox、Evernote 和 Skype。

                        改为使用ACTION_SENDTO,提供mailto: Uri

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

                        然后,您可以按照其他答案的建议继续使用选择器。

                        @PaulLammertsma 在这里回答 Android email chooser

                        【讨论】:

                        • 完美!这应该是公认的答案,因为它完全符合 OP 的要求。仅供参考:如果还使用了 setType(),这将不起作用。
                        • Intent.ACTION_SENDTO 不支持附件。
                        • 完美且非常简单
                        【解决方案14】:

                        这会对你有所帮助。

                        On your button click : 
                        
                        Intent email = new Intent(Intent.ACTION_SEND);
                        email.putExtra(Intent.EXTRA_EMAIL, new String[]{"youremail@yahoo.com"});          
                        email.putExtra(Intent.EXTRA_SUBJECT, "subject");
                        email.putExtra(Intent.EXTRA_TEXT, "message");
                        email.setType("message/rfc822");
                        startActivity(Intent.createChooser(email, "Choose an Email client :"));
                        

                        【讨论】:

                        • 请停止要求人们投票/接受您的帖子。很确定我之前已经要求你停止这个。谢谢!
                        • 此消息类型包括 google drive 和 skype 等应用。有没有在不创建选择器的情况下过滤掉那些?
                        【解决方案15】:

                        使用此处指出的message/rfc822 类型:ACTION_SEND force sending with email 解决了问题。

                        【讨论】:

                          【解决方案16】:

                          @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[] { "jckdsilva@gmail.com" });
                                          gmail.setData(Uri.parse("jckdsilva@gmail.com"));
                                          gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something");
                                          gmail.setType("plain/text");
                                          gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!");
                                          startActivity(gmail);
                          

                          【讨论】:

                          • 请注意,这仅在设备安装了 Gmail 时才有效。在非 Google 设备(例如拥有自己的电子邮件客户端的 Kindle Fire)上,它会失败。
                          • 如何在不创建选择器的情况下过滤掉所有期望使用电子邮件和 gmail 的应用程序?
                          【解决方案17】:

                          第一个解决方案:尝试在您的 Intent 参数中更加具体。例如添加消息收件人

                          emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"user@example.com"});
                          

                          第二种解决方案:使用package manager 查找所有能够发送消息的应用程序,然后只选择您要使用的那些。

                          【讨论】:

                          • 但我不想将电子邮件发送到必须由用户选择的特定邮件。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-01-03
                          • 2016-12-20
                          • 2017-10-17
                          相关资源
                          最近更新 更多