做商业项目的时候,应用往往需要提供一些用户的反馈渠道,尽管现在有微信公众号、微博等等方便快捷的途径可以与应用开发者取得联系,但邮箱也是不可或缺的一种反馈途径。

在应用开发中,我们时常会拉起邮箱应用来完成发送邮件的操作,同时还会自动帮用户填写部分信息,减少用户的操作步骤,今天就教大家在 Android 开发中如何实现这一操作。

前提是手机需要安装并登录邮箱客户端,你可以使用一些邮箱服务商提供的官方应用,比如『Gmail』、『QQMail』等等,也可以使用手机内置的邮箱应用,具体配置操作可参考『用好手机系统自带的邮件客户端』。

最简单的场景,我们只需要给指定的官方邮箱发送一些文本内容,可以这么写:

object EmailSender {
    fun mailToOne(context: Context) {
        val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:foo@bar.com"))
        intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
        intent.putExtra(Intent.EXTRA_TEXT, "这是内容")
        context.startActivity(intent);
    }
}

这里用到了 Activity 的隐式启动,首先需要把 Intentaction 设置为 Intent.ACTION_SENDTO,再将 data 设置为 mailto: 开头的 Uri,并在后面拼接邮箱地址,这样就只有邮箱应用才能够响应我们的 Intent。如果需要设置主题和内容,可以填充 Intent.EXTRA_SUBJECTIntent.EXTRA_TEXT 这两个字段。

效果如下:

发送给单一收件人

邮件不仅支持发送给单一收件人,我们可以指定多个收件人,还支持抄送、密送。

object EmailSender {
    fun mailToMultiple(context: Context) {
        val intent = Intent(Intent.ACTION_SENDTO)
        intent.setData(Uri.parse("mailto:"))
        intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("foo@bar.com", "bar@foo.com"))
        intent.putExtra(Intent.EXTRA_CC, arrayOf("cc@bar.com"))     // 抄送
        intent.putExtra(Intent.EXTRA_BCC, arrayOf("bcc@bar.com"))   // 密送
        intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
        intent.putExtra(Intent.EXTRA_TEXT, "这是内容")
        context.startActivity(intent)
    }
}

action 的配置与上文一致,但是 data 不需要拼接收件人的邮箱地址,而是改成在 Intent.EXTRA_EMAIL 字段传入,抄送和密送的邮箱地址则分别在 Intent.EXTRA_CCIntent.EXTRA_BCC 字段传入,这三个字段都接收字符串类型的数组,也就意味着我们可以填充多个邮箱地址。

效果如下:

发送给多个收件人

邮件同时还能上传附件,我们可以这么写:

object EmailSender {
    fun mailAttachments(context: Context) {
        val file = File(PathUtils.getInternalAppFilesPath(), "screenshot.png")
        val intent = Intent(Intent.ACTION_SEND_MULTIPLE)
        intent.selector = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("foo@bar.com"))
        intent.putExtra(Intent.EXTRA_SUBJECT, "这是主题")
        intent.putExtra(Intent.EXTRA_STREAM, arrayListOf(UriUtils.file2Uri(file)))
        context.startActivity(intent)
    }
}

这里将 action 改成 Intent.ACTION_SEND_MULTIPLE,如果仅仅是这样修改,除了邮箱应用外,许多应用都能够响应我们的 Intent,因此还需要调用 setSelector() 方法,为此 Intent 设置选择器。最后再向 Intent.EXTRA_STREAM 字段传入附件的 Uri,它也接收数组,意味着我们可以传输多个附件。

效果如下:

发送附件