做商业项目的时候,应用往往需要提供一些用户的反馈渠道,尽管现在有微信公众号、微博等等方便快捷的途径可以与应用开发者取得联系,但邮箱也是不可或缺的一种反馈途径。
在应用开发中,我们时常会拉起邮箱应用来完成发送邮件的操作,同时还会自动帮用户填写部分信息,减少用户的操作步骤,今天就教大家在 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
的隐式启动,首先需要把 Intent
的 action
设置为 Intent.ACTION_SENDTO
,再将 data
设置为 mailto:
开头的 Uri
,并在后面拼接邮箱地址,这样就只有邮箱应用才能够响应我们的 Intent
。如果需要设置主题和内容,可以填充 Intent.EXTRA_SUBJECT
和 Intent.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_CC
和 Intent.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
,它也接收数组,意味着我们可以传输多个附件。
效果如下:
