提问人:dira 提问时间:1/2/2012 最后编辑:Ramesh Rdira 更新时间:9/17/2023 访问量:478666
发送电子邮件意向
Send Email Intent
问:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
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 等。
实际上,我想过滤这些列表选项。我只想显示与电子邮件相关的应用程序,例如 Gmail 和 Yahoo Mail。怎么做?
我在“Android Market”应用程序上看到过这样的例子。
- 打开 Android Market 应用
- 打开开发人员指定了他/她的电子邮件地址的任何应用程序。(如果您找不到这样的应用程序,请打开我的应用程序:- market://details?id=com.becomputer06.vehicle.diary.free,或按“车辆日记”搜索)
- 向下滚动到“开发人员”
- 点击“发送电子邮件”
该对话框仅显示电子邮件应用程序,例如 Gmail、Yahoo Mail 等。它不显示蓝牙、Orkut 等。什么代码会产生这样的对话框?
答:
也许你应该试试这个:intent.setType("plain/text");
我在这里找到了。我已经在我的应用程序中使用了它,它只显示电子邮件和 Gmail 选项。
评论
plain/text
mailto:
当您更改 intent.setType 时,如下所示,您将获得
intent.setType("text/plain");
用于仅获取电子邮件客户端列表,而不获取 facebook 或其他应用程序。只是电子邮件客户端。
前任:android.content.Intent.ACTION_SENDTO
new Intent(Intent.ACTION_SENDTO);
我不建议您直接访问电子邮件应用程序。让用户选择他最喜欢的电子邮件应用。不要束缚他。
如果使用 ACTION_SENDTO,则 putExtra 无法向 intent 添加主题和文本。使用 Uri 添加主题和正文文本。
编辑:我们可以使用 MIME 类型来代替。但是,这并不表示“仅提供电子邮件客户端”,而是表示“提供任何支持消息/rfc822 数据的内容”。这很容易包括一些不是电子邮件客户端的应用程序。message/rfc822
"text/plain"
message/rfc822
支持MIME类型.mhtml, .mht, .mime
评论
no apps installed to perform this intent
ACTION_SENDTO
message/rfc822
mailto:
尝试:
intent.setType("message/rfc822");
评论
message/rfc822
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);
}
}
旧答案
接受的答案在 4.1.2 上不起作用。这应该适用于所有平台:
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","[email protected]", 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
评论
Uri.fromParts("mailto", "", null)
主要有三种方法:
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();
评论
%
Uri.encode
.setType("message/rfc822")
Intent.ACTION_SENDTO
编辑:不再适用于新版本的Gmail
这是我当时找到的唯一方法,让它适用于任何角色。
哆啦来梦的答案是正确的,因为它适用于新版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);
}
评论
Uri.encode
以下代码对我有用。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
如果您只需要电子邮件客户端,则应与数组一起使用。下面是一个示例:android.content.Intent.EXTRA_EMAIL
final Intent result = new Intent(android.content.Intent.ACTION_SEND);
result.setType("plain/text");
result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient });
result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
result.putExtra(android.content.Intent.EXTRA_TEXT, body);
评论
ACTION_SENDTO
这对我有用:
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");
startActivity(Intent.createChooser(intent, "Email via..."));
最重要的是:使用 ACTION_SENDTO 操作而不是 ACTION_SEND 操作。我已经在几台 Android 4.4 设备上尝试过,并且:
- 它正确地将选择器弹出窗口限制为仅显示电子邮件应用程序(电子邮件、Gmail、Yahoo Mail 等);和
- 它会正确地将电子邮件地址和主题插入到电子邮件中。
这些解决方案都不适合我。这是一个适用于棒棒糖的最小解决方案。在我的设备上,只有 Gmail 和原生电子邮件应用会显示在生成的选择器列表中。
Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
Uri.parse("mailto:" + Uri.encode(address)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));
这是从Android官方文档中引用的,我已经在Android 4.4上进行了测试,并且运行良好。在 https://developer.android.com/guide/components/intents-common.html#Email 上查看更多示例
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);
}
}
评论
EXTRA_EMAIL
不适合我,所以我用了Uri.parse("mailto: " + myEmail)
在电话电子邮件客户端中撰写电子邮件:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));
这是根据 Android 开发者官方文档发送电子邮件意图的正确方式
将以下代码行添加到应用:
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[]{"[email protected]"});
这将是收件人的地址,这意味着用户将向您(开发人员)发送一封电子邮件。
评论
Intent.ACTION_SEND
Intent.ACTION_SENDTO
以下代码对我有用!!
import android.support.v4.app.ShareCompat;
.
.
.
.
final Intent intent = ShareCompat.IntentBuilder
.from(activity)
.setType("application/txt")
.setSubject(subject)
.setText("Hii")
.setChooserTitle("Select One")
.createChooserIntent()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivity(intent);
这对我来说非常有效:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("mailto:" + address));
startActivity(Intent.createChooser(intent, "E-mail"));
一个迟到的答案,尽管我想出了一个可以帮助其他人的解决方案:
Java 版本
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:[email protected]"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));
Kotlin 版本
val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:[email protected]")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))
这是我的输出(仅建议 Gmail + 收件箱):
我从 Android 开发人员网站获得了这个解决方案。
评论
适用于所有安卓版本:
String[] to = {"[email protected]"};
Uri uri = Uri.parse("mailto:[email protected]")
.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)的主题和正文。但我在这里找到了答案:
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)))
}
评论
使用这个:
boolean success = EmailIntentBuilder.from(activity)
.to("[email protected]")
.cc("[email protected]")
.subject("Error report")
.body(buildErrorReport())
.start();
使用 build gradle :
compile 'de.cketti.mailto:email-intent-builder:1.0.0'
如果要确保仅通过电子邮件应用(而不是其他短信或社交应用)处理您的意图,请使用该操作并包含“mailto:”数据方案。例如:ACTION_SENDTO
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 中发现了这个
评论
最后想出最好的办法
String to = "[email protected]";
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);
评论
这些答案中的大多数仅适用于您不发送附件的简单情况。就我而言,我有时需要发送附件 (ACTION_SEND) 或两个附件 (ACTION_SEND_MULTIPLE)。
所以我从这个线程中采用了最好的方法并将它们组合起来。它使用支持库,但我只显示与“mailto:” uri ACTION_SENDTO匹配的应用程序。这样,我只得到具有附件支持的电子邮件应用程序列表:ShareCompat.IntentBuilder
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
}
评论
如果您想定位 Gmail,那么您可以执行以下操作。请注意,意向是“ACTION_SENDTO”而不是“ACTION_SEND”,并且 Gmail 不需要额外的意向字段。
String uriText =
"mailto:[email protected]" +
"?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"));
}
使用 确实有效,但它显示了不一定处理电子邮件的额外应用程序(例如 GDrive)。使用 with 是最好的,但您必须添加才能获得最佳结果(仅限电子邮件应用程序)。完整代码如下:intent.setType("message/rfc822");
Intent.ACTION_SENDTO
setType("text/plain")
setData(Uri.parse("mailto:"))
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.setData(Uri.parse("mailto:[email protected]"));
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"));
评论
我正在更新 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) { "[email protected]" })
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)
}
评论
来自 Android 开发者文档:
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);
}
}
如果有人在看,请在 Kotlin 中
val emailArrray:Array<String> = arrayOf("[email protected]")
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);
}
请使用以下代码:
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();
}
科特林:
val email: String = getEmail()
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:$email" )
startActivity(intent)
String sendEmailTo = "[email protected]";
String subject = "Subject";
String body = "Body";
Uri uri = Uri.parse("mailto:"+sendEmailTo+"?subject="+subject+"&body="+body);
startActivity(new Intent(Intent.ACTION_VIEW, uri);
这对我有用。这将仅在 intent 选择器中显示邮件应用程序。
此外:
我使用这种方法面临的一个问题是我无法在建议和正文中添加空间。
因此,要在建议或正文文本中放置空格,请将空格替换为%20
这就是我设法在 kotlin 中做到这一点的方式:
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:")
intent.putExtra(Intent.EXTRA_EMAIL, emailAddress)
intent.putExtra(Intent.EXTRA_SUBJECT, emailSubject)
intent.putExtra(Intent.EXTRA_TEXT, emailBody)
context.startActivity(intent)
希望能帮到你
评论
String[]
String