我对 Android 编写应用程序。如何从其发送一封电子邮件?

2010-02-04 06:22:12
问题评论:

简单的 ShareBuilder gist.github.com/gelldur/9c199654c91b13478979

回答:

最好 (最简单) 的方法是使用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();
}

否则,您需要编写自己的客户端。

在上面的代码中,没有任何发件人的电子邮件 id。然后,该消息的发送方式?

KIRAN︰ 您将需要研究方法的工作原理要理解这一点。基本上,它将打开电子邮件应用程序与收件人、 主题和正文已经填写了。这取决于如何发送该电子邮件应用程序。

电子邮件未显示在"收件人"字段由启动该活动。任何人都知道吗?

是...这有效工作的完美,直到 Skype 还决定以"支持"消息/rfc822-现在,Skype 弹出列表中也。该公司真正成为邪恶...

此注释的卓越贡献是︰ 邮件/rfc822

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

不错,这应该有更多选票 tbh 向上。您可能会发现在模拟器上进行测试,但去发送"纯文本"在实际设备上时它将为您提供一份 15 + 应用程序!!因此"消息/rfc822"明确建议 (电子邮件标准)。

@Blundell 你,但我没有看到任何差异更改为message/rfc822之后

您可以从列表中删除蓝牙吗?这也会出现这种类型。+ 1,巧妙的技巧 !

保存我们建。不能设想向客户解释用户可能 tweet 的支持请求,而不是通过电子邮件发送它们。

+1111111 这值得无限 + 1,以便其他人可以看到这。我错过了这一部分,不得不处理这个问题一段时间 !

我一直使用这以前的很长时间以来,它看起来很好,显示没有非电子邮件应用程序。发送发送电子邮件的意图只是另一种方法︰

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

Unsopported 操作︰ 当前不支持此操作

出现错误︰ ActivityNotFoundException︰ 无活动找到用于处理目的 {act=android.intent.action.SENDTO typ = 明文/flg = 0x10000000}

lgor G-> 请从 setType"(plain/text") 到 setType("text/plain") 的变化

.setType("message/rfc822") 不纯文本

此代码将打开电子邮件的意图?我如何可以发送电子邮件我想将密码发送给电子邮件而不是显示为用户 @yuku 的意图

我使用的一些沿行目前接受的答案要将电子邮件发送与附加二进制错误日志文件。GMail 和 K-9 发送很正常,其也到达正常我的邮件服务器。唯一的问题是我的邮件客户端选择 Thunderbird 具有与打开 / 保存附加的日志文件问题。事实上它只是没有保存的文件根本不抱怨。

我利用一下这些邮件的来源代码之一,并注意到日志文件附件 (理解) 有message/rfc822mime 类型。当然该附件是不连接的电子邮件。但 Thunderbird 无法从容应对的微小错误。因此,这是什么样的 bummer。

经过一定的研究和试验我想出了下面的解决方案︰

    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 方法可以很容易地送入与正确的意图和正确的 mime 类型。

然后经历可用的活动,以响应 ACTION_SENDTO mailto协议意向 (它们是电子邮件应用程序) 的列表,并构造基于该列表的活动和原来的 ACTION_SEND 意图具有正确的 mime 类型的选择器。

另一个优点是,Skype 未列出了 (这正好响应 rfc822 mime 类型)。

我刚插入您的代码段,它工作正常。之前已经列出的应用程序,像 Google 驱动器,Skype 等。但是,没有一种方法,而无需调用另一个应用程序发送的邮件从应用程序呢?我刚阅读上面的 @Rene postet 的电子邮件客户端有关的文章,但似乎只是发送一封简单的电子邮件太复杂

极好的回答。我有 Skype,Google 也提出与ACTION_SEND的驱动器并这它精心。

最流行的解决方案上面也返回 Skype 和 Vkontakte。此解决方案是更好。

什么是 crashLogFile? 在它未初始化? pease sepecify

这只是的 @Noufal 一些余数从我自己的代码库。它是指向我的 Android 应用程序没有捕获的异常的情况下在后台创建崩溃日志文件File实例。该示例只应说明如何添加一个电子邮件附件。您还可以从外部存储器 (例如图像) 附加任何其他文件。为了获得一个工作示例,还可以删除该行与crashLogFile

只是让电子邮件应用程序来解决您的意图需要指定操作和数据作为邮寄地址为 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();
    }

}
请输入您的翻译

How can I send emails from my Android application?

确认取消