我怎样才能从我的Android应用程序发送电子邮件?

我正在为Android编写一个应用程序。 我怎样才能从它发送电子邮件?

最好的(也是最简单的)方法是使用一个Intent

 Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.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(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } 

否则,你将不得不编写自己的客户端。

使用.setType("message/rfc822")或者select器会显示所有支持发送意图的(许多)应用程序。

我很久以前就一直在使用它,看起来不错,没有非电子邮件应用程序出现。 另一种发送发送电子邮件意向的方式是:

 Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email"); intent.putExtra(Intent.EXTRA_TEXT, "Body of email"); intent.setData(Uri.parse("mailto:default@recipient.com")); // or just "mailto:" for blank intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app. startActivity(intent); 

我正在使用当前接受的答案,以发送电子邮件附加的二进制错误日志文件的东西。 GMail和K-9发送它就好,它也到我的邮件服务器罚款。 唯一的问题是我的邮件客户端select雷鸟有麻烦打开/保存附加的日志文件。 实际上它根本没有保存文件而没有抱怨。

我看了一下这些邮件的源代码,注意到日志文件附件(可以理解)是mimetypes的message/rfc822 。 当然,这个附件不是附加的电子邮件。 但雷鸟无法妥善处理这个微小的错误。 所以这是一个无赖。

经过一番研究和实验后,我想出了以下解决scheme:

  public Intent createEmailOnlyChooserIntent(Intent source, CharSequence chooserTitle) { Stack<Intent> intents = new Stack<Intent>(); Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "info@domain.com", null)); List<ResolveInfo> activities = getPackageManager() .queryIntentActivities(i, 0); for(ResolveInfo ri : activities) { Intent target = new Intent(source); target.setPackage(ri.activityInfo.packageName); intents.add(target); } if(!intents.isEmpty()) { Intent chooserIntent = Intent.createChooser(intents.remove(0), chooserTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[intents.size()])); return chooserIntent; } else { return Intent.createChooser(source, chooserTitle); } } 

它可以使用如下:

  Intent i = new Intent(Intent.ACTION_SEND); i.setType("*/*"); i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile)); i.putExtra(Intent.EXTRA_EMAIL, new String[] { ANDROID_SUPPORT_EMAIL }); i.putExtra(Intent.EXTRA_SUBJECT, "Crash report"); i.putExtra(Intent.EXTRA_TEXT, "Some crash report details"); startActivity(createEmailOnlyChooserIntent(i, "Send via email")); 

正如你所看到的,createEmailOnlyChooserIntent方法可以很容易地用正确的意图和正确的MIMEtypes提供。

然后,它会遍历响应ACTION_SENDTO mailto协议意图(仅限电子邮件应用程序)的可用活动列表,并根据活动列表和原始ACTION_SEND意图构build一个具有正确MIMEtypes的select器。

另一个好处是,Skype不再列出(这正好响应rfc822 MIMEtypes)。

仅仅使用电子邮件应用程序来解决您的意图,您需要将ACTION_SENDTO指定为“操作”并将“mailto”指定为“数据”。

 private void sendEmail(){ Intent emailIntent = new Intent(Intent.ACTION_SENDTO); emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com")); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body"); try { startActivity(Intent.createChooser(emailIntent, "Send email using...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show(); } } 

使用.setType("message/rfc822")ACTION_SEND似乎也匹配非电子邮件客户端的应用程序,例如Android BeamBluetooth

使用ACTION_SENDTOmailto: URI似乎完美,并且在开发者文档中被推荐 。 但是,如果您在官方模拟器上执行此操作,并且没有设置任何电子邮件帐户(或者没有任何邮件客户端),则会出现以下错误:

不支持的行动

该行动目前不受支持。

如下所示:

不支持的操作:该操作当前不受支持。

事实certificate,模拟器parsing了一个名为com.android.fallback.Fallback的活动,它显示了上面的消息。 显然这是devise。

如果你想要你的应用程序绕过这个,所以它也可以在官方模拟器上正常工作,你可以在尝试发送电子邮件之前检查它:

 private void sendEmail() { Intent intent = new Intent(Intent.ACTION_SENDTO) .setData(new Uri.Builder().scheme("mailto").build()) .putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith <johnsmith@yourdomain.com>" }) .putExtra(Intent.EXTRA_SUBJECT, "Email subject") .putExtra(Intent.EXTRA_TEXT, "Email body") ; ComponentName emailApp = intent.resolveActivity(getPackageManager()); ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback"); if (emailApp != null && !emailApp.equals(unsupportedAction)) try { // Needed to customise the chooser dialog title since it might default to "Share with" // Note that the chooser will still be skipped if only one app is matched Intent chooser = Intent.createChooser(intent, "Send email with"); startActivity(chooser); return; } catch (ActivityNotFoundException ignored) { } Toast .makeText(this, "Couldn't find an email app and account", Toast.LENGTH_LONG) .show(); } 

在开发人员文档中查找更多信息。

发送电子邮件可以用Intents完成,不需要configuration。 但是,这将需要用户交互,布局将会受到一些限制。

在没有用户交互的情况下构build和发送更复杂的电子邮件需要构build自己的客户端。 首先,用于电子邮件的Sun Java API不可用。 我已经成功利用Apache Mime4j库来构build电子邮件。 全部基于nilvec的文档。

我使用android文档解释的简单代码行解决了这个问题。

https://developer.android.com/guide/components/intents-common.html#Email

最重要的是标志:它是ACTION_SENDTO ,而不是ACTION_SEND

另一条重要路线是

 intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this*** 

顺便说一句,如果你发送一个空的Extra ,最后的if()将不起作用,应用程序将不会启动电子邮件客户端。

这对我有用。 根据Android文档。 如果您想确保您的意图仅由电子邮件应用程序(而不是其他文本消息或社交应用程序)处理,则使用ACTION_SENDTO操作并包含“mailto:”数据scheme。 例如:

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

简单的试试这个

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonSend = (Button) findViewById(R.id.buttonSend); textTo = (EditText) findViewById(R.id.editTextTo); textSubject = (EditText) findViewById(R.id.editTextSubject); textMessage = (EditText) findViewById(R.id.editTextMessage); buttonSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String to = textTo.getText().toString(); String subject = textSubject.getText().toString(); String message = textMessage.getText().toString(); Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, new String[] { to }); // email.putExtra(Intent.EXTRA_CC, new String[]{ to}); // email.putExtra(Intent.EXTRA_BCC, new String[]{to}); email.putExtra(Intent.EXTRA_SUBJECT, subject); email.putExtra(Intent.EXTRA_TEXT, message); // need this to prompts email client only email.setType("message/rfc822"); startActivity(Intent.createChooser(email, "Choose an Email client :")); } }); } 

我在我的应用程序中使用下面的代码。 这显示了电子邮件客户端应用程序,如Gmail。

  Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null)); contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject)); startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser))); 

用这个发送电子邮件…

 boolean success = EmailIntentBuilder.from(activity) .to("support@example.org") .cc("developer@example.org") .subject("Error report") .body(buildErrorReport()) .start(); 

使用build gradle:

 compile 'de.cketti.mailto:email-intent-builder:1.0.0' 

这个函数首先直接使用intent gmail发送邮件,如果没有findgmail则提示intent chooser。 我在许多商业应用程序中使用这个function,它工作正常。 希望它能帮助你:

 public static void sentEmail(Context mContext, String[] addresses, String subject, String body) { try { Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW); sendIntentGmail.setType("plain/text"); sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses))); sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses); if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject); if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body); mContext.startActivity(sendIntentGmail); } catch (Exception e) { //When Gmail App is not installed or disable Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND); sendIntentIfGmailFail.setType("*/*"); sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses); if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject); if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body); if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) { mContext.startActivity(sendIntentIfGmailFail); } } } 

其他解决scheme可以

 Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); emailIntent.setType("plain/text"); emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"someone@gmail.com"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi"); startActivity(emailIntent); 

假设大部分Android设备已经安装了GMail应用程序。

我就是这么做的 好而简单。

 String emailUrl = "mailto:email@example.com?subject=Subject Text&body=Body Text"; Intent request = new Intent(Intent.ACTION_VIEW); request.setData(Uri.parse(emailUrl)); startActivity(request); 

这将只显示您的电子邮件客户端(以及贝宝为某些未知的原因)

  public void composeEmail() { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"}); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body"); try { startActivity(Intent.createChooser(intent, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } }