使用Android Intent.ACTION_SEND发送电子邮件

时间:2011-02-03 06:53:06

标签: android email android-intent

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

17 个答案:

答案 0 :(得分:23)

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

修改
您也可以尝试将类型设置为"message/rfc822"

试试这个......

答案 1 :(得分:21)

我不赞成这个答案,但我相信它给出了这篇文章的最佳答案。

使用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

答案 2 :(得分:19)

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

答案 3 :(得分:16)

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

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

问题是:

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

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

因此Intent.ACTION_SEND允许用户从多个活动中进行选择,即使你设置了类型(“message / rfc822”),因为该应用程序/活动可以管理所有文件类型(简单的GDrive / Dropbox应用程序),甚至可以管理电子邮件消息文件

解决方案在setSelector方法中。 使用此方法,您可以使用Intent.ACTION_SENDTO选择活动,但随后发送Intent.ACTION_SEND意图。

这里是我的解决方案代码(附件来自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);
}

答案 4 :(得分: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 :"));

答案 5 :(得分:7)

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

答案 6 :(得分:6)

我的应用程序遇到了类似的问题。我最近发现这个链接形式的官方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" );

答案 7 :(得分:3)

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

使用Intent.ACTION_SENDintent.setType("message/rfc822")会产生一个选择器,它不仅会显示邮件应用,还会显示所有可以通过邮件/ rfc822处理任何 MIME类型支持的应用,例如: .mhtml.mht.mime。除了邮件应用程序,这可能是 Google云端硬盘,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();
}

答案 8 :(得分:2)

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

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

第二个解决方案:使用package manager查找能够发送消息的所有应用程序,并选择仅使用的那些应用程序。

答案 9 :(得分:2)

感谢开源开发者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是其要旨的链接。

答案 10 :(得分:1)

大声疾呼给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)
    }
}

答案 11 :(得分:0)

尝试使用ACTION_VIEW而不是ACTION_SENDTO,ACTION_VIEW将仅对电子邮件应用程序进行系统调用

Intent emailIntent = new Intent(Intent.ACTION_VIEW);

答案 12 :(得分:0)

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

答案 13 :(得分:0)

这节省了我的一天。它将组合文本消息直接发送到gmail app:

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

答案 14 :(得分:0)

这是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应用程序,如果用户没有它,那么将实现第二种方法。

答案 15 :(得分:0)

限制它仅发送电子邮件的最佳代码。将此类型设置为仅发送电子邮件。 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();
        }

答案 16 :(得分:-1)

这将仅打开安装在Android手机中的“电子邮件”应用。

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