如何从我的Android应用程序发送电子邮件?

Rak*_*esh 505 email android

我正在为Android编写应用程序.我该如何发送电子邮件?

Jer*_*gan 953

最好(也是最简单)的方法是使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • KIRAN:您需要了解Intents如何理解这一点.它基本上会打开一个电子邮件应用程序,收件人,主题和正文已经填写完毕.由电子邮件应用程序来完成发送. (35认同)
  • 添加这些以确保选择器仅显示电子邮件应用程序:`Intent i = new Intent(Intent.ACTION_SENDTO);``i.setType("message/rfc822");``i.setData(Uri.parse("mailto: "));` (22认同)
  • 这个评论的重要贡献是:message/rfc822 (11认同)
  • 通过启动活动,电子邮件不会出现在"收件人"字段中.有谁知道? (8认同)
  • 在上面的代码中,没有发件人电子邮件ID.那么邮件如何发送? (6认同)
  • 是的......这很完美,直到Skype还决定"支持"消息/ rfc822 - 现在Skype也在列表中弹出.那家公司真的变得邪恶...... (4认同)
  • RFC822:ARPA Internet文本消息标准http://www.w3.org/Protocols/rfc822/ (4认同)
  • 什么是**rfc822**?? (3认同)
  • 来自[官方Android文档](http://developer.android.com/reference/android/content/Intent.html#ACTION_CHOOSER):"何时不使用它[`Intent.createChooser`]的例子是用户点击"mailto:"链接.他们自然希望直接转到他们的邮件应用程序,因此应直接调用startActivity():它将启动当前首选应用程序,或者设置允许用户选择的对话框一个应用程序,可以使用并可选择标记为首选." (3认同)
  • 除非您确切知道用​​户想要使用哪个应用,否则您无法"强迫"它成为电子邮件应用. (2认同)

小智 192

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

  • @Blundell嗨,但在更改为`message/rfc822`后我没有看到任何差异 (7认同)
  • 很好,这应该有更多的投票tbh.您不会注意到在模拟器上进行测试,但是当您在真实设备上发送"text/plain"时,它会为您提供15个以上应用程序的列表!所以肯定推荐"message/rfc822"(电子邮件标准). (5认同)
  • 保存了我们的培根.无法想象向客户解释用户可能会发送支持请求而不是通过电子邮件发送它们. (4认同)
  • 你能从列表中删除蓝牙吗?这也出现在这种类型中.虽然+1,整洁的技巧! (2认同)

Ran*_*ku' 82

我很久以前就一直在使用它,它似乎很好,没有非电子邮件应用程序出现.发送电子邮件意图的另一种方法:

Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
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);
Run Code Online (Sandbox Code Playgroud)

  • lgor G-> plz从setType"(plain/text")更改为setType("text/plain") (4认同)
  • 不支持的操作:当前不支持此操作 (2认同)
  • .setType("message/rfc822")不是text/plain (2认同)
  • 这个答案是[非常有影响力的](https://www.google.com/?q="这+ + + + + + + +当+用户+返回+ +你的+应用+ +你的+应用+是+ +显示,+而不是+ +中+电子邮件+应用 "&gws_rd = CR EI = BWXHWOqDNoStsAHp-634BA#newwindow = 1&q =" 这+会+使+等+是+当用户+收益+以+你+应用+您的应用程序+ + +是显示,+ + +的电子邮件应用+")而不是+.:) (2认同)

tig*_*chi 51

我正在使用当前接受的答案的某些内容,以便发送附带二进制错误日志文件的电子邮件.GMail和K-9发送它很好,它也可以在我的邮件服务器上正常运行.唯一的问题是我选择Thunderbird的邮件客户端,它在打开/保存附加的日志文件时遇到了麻烦.事实上,它根本没有保留文件,没有抱怨.

我看了一下这些邮件的源代码,发现日志文件附件(可以理解)是mime类型message/rfc822.当然,附件不是附加的电子邮件.但是Thunderbird无法优雅地应对这个微小的错误.所以这有点令人失望.

经过一些研究和实验,我想出了以下解决方案:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以使用如下:

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"));
Run Code Online (Sandbox Code Playgroud)

如您所见,createEmailOnlyChooserIntent方法可以很容易地使用正确的意图和正确的mime类型.

然后,它会查看响应ACTION_SENDTO mailto协议意图(仅限电子邮件应用程序)的可用活动列表,并根据该活动列表和具有正确mime类型的原始ACTION_SEND意图构建选择器.

另一个优点是Skype不再被列出(这恰好响应了rfc822 mime类型).


小智 34

为了只是让电子邮件应用解决你的意图,你需要指定ACTION_SENDTO的行动和作为上一篇的数据.

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

}
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 19

使用.setType("message/rfc822")ACTION_SEND似乎也匹配不是电子邮件客户端的应用程序的策略,例如Android Beam蓝牙.

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

不支持的行动

目前不支持该操作.

如下所示:

不支持的操作:目前不支持该操作.

事实证明,模拟器将意图解析为被调用的活动com.android.fallback.Fallback,该活动显示上述消息.显然这是设计的.

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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


Ped*_*ela 19

我用简单的代码行解决了这个问题,正如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***
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你发送一个空的Extra,if()最后将无法正常工作,应用程序将无法启动电子邮件客户端.

根据Android文档.如果您想确保您的意图仅由电子邮件应用程序处理(而不是其他文本消息或社交应用程序),请使用该ACTION_SENDTO操作并包含" 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ren*_*ene 12

发送电子邮件可以使用Intents完成,无需配置.但随后它将需要用户交互,布局将受到一定限制.

无需用户交互即可构建和发送更复杂的电子邮件,这需要构建自己的客户端.第一件事是Sun Java API for email不可用.我已成功利用Apache Mime4j库来构建电子邮件.全部基于nilvec的文档.


Sri*_*lam 7

这是示例工作代码,它在 android 设备中打开邮件应用程序并在撰写邮件中自动填充收件人地址主题

protected void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:feedback@gmail.com"));
    intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)


lom*_*mza 5

我在我的应用程序中使用以下代码。这准确地显示了电子邮件客户端应用程序,例如 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)));
Run Code Online (Sandbox Code Playgroud)


Avi*_*han 5

这将仅显示电子邮件客户端(以及出于某种未知原因的 PayPal)

 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();
    }
}
Run Code Online (Sandbox Code Playgroud)