web-dev-qa-db-ja.com

電子メールの送信

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

上記のコードは、次のアプリを表示するダイアログを開きます。 - Bluetooth、Google Docs、Yahoo Mail、Gmail、Orkut、Skypeなど。

実際には、私はこれらのリストオプションをフィルタリングしたいです。メール関連のアプリのみを表示したいGmail、Yahoo Mail。どうやってするの?

私は「Androidマーケット」アプリケーションでそのような例を見ました。

  1. Androidマーケットアプリを開く
  2. 開発者が自分のメールアドレスを指定したアプリケーションを開きます。 (そのようなアプリが見つからない場合は、自分のアプリを開くだけです。 - market:// details?id = com.becomputer06.vehicle.diary.free、ORで「Vehicle Diary」を検索)
  3. 'DEVELOPER'までスクロールします
  4. 「メールを送る」をクリック

ダイアログにはメールアプリのみが表示されます。 Gmail、Yahoo Mailなど、Bluetooth、Orkutなどは表示されません。このようなダイアログを生成するコードは何ですか?

510
Dipesh Rathod

あなたが以下のようにあなたのintent.setTypeを変えるとき、あなたは得るでしょう

intent.setType("text/plain");

Facebookや他のアプリを使わずに、電子メールクライアントのリストだけを取得するにはAndroid.content.Intent.ACTION_SENDTOを使用します。メールクライアントだけ。例:

new Intent(Intent.ACTION_SENDTO);

私はあなたが直接メールアプリにアクセスすることをお勧めしません。ユーザーに自分のお気に入りのメールアプリを選択させます。彼を拘束しないでください。

ACTION_SENDTOを使用した場合、putExtraは件名とテキストを意図に追加するようには機能しません。件名と本文を追加するには、Uriを使用します。

編集: MIMEタイプとしてmessage/rfc822の代わりに"text/plain"を使うことができます。ただし、それは「電子メールクライアントのみを提供する」という意味ではなく、「message/rfc822データをサポートするものをすべて提供する」という意味です。それは電子メールクライアントではないいくつかのアプリケーションをすぐに含むかもしれません。

message/rfc822.mhtml, .mht, .mimeのMIMEタイプをサポートします

192
Padma Kumar

承認された回答は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では、メールアドレスを表す文字列の代わりに文字列配列を渡す必要があるようです。もう1行追加する必要があります。

intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses

参照リンク

813
thanhbinh84

主なアプローチは3つあります。

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();
208
Dipesh Rathod

これはAndroidの公式ドキュメントから引用したものです。Android4.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);
    }
}
92
marcwjj

私は他の人を助けることができる解決策を考え出したけれども、遅い答え、。

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:[email protected]"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));

これは私の出力でした(Gmail + Inboxのみ推奨):

my output

私は Android Developers サイトからこの解決策を得ました。

69
capt.swag

試してください:

intent.setType("message/rfc822");
33
Magnus

これは私のために働く:

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など)だけを表示するためにチューザポップアップを制限します、そしてそれは正しく電子メールアドレスと件名を挿入します。

29
Adil Hussain

これは、 Android Developer Docs に従って次のようにコードを追加する方法です。

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" );
23
Avi Parshan

メールクライアントだけが欲しいなら、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);
13
Addev

やっと最善の方法を思いつく

    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);
9
Ajay Shrestha

次のコードは私にはうまくいきます。

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);
8
Anam Ansari

編集:Gmailの新しいバージョンではもう動作しません

これが私がその時に見つけた唯一の方法で、どんなキャラクターでも動作するようになりました。

doreamonの答えは、新しいバージョンのGmailのすべての文字で機能するため、今すぐ正しい方法です。

古い答え:


これが私のものです。件名とメッセージ本文をサポートし、UTF-8文字を完全にサポートすることで、すべてのAndroidバージョンで動作するようです。

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

すべてのAndroidのバージョンで動作します:

String[] TO = {"[email protected]"};
    Uri uri = Uri.parse("mailto:[email protected]")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
5
Usama Saeed US

これらの解決策のどれも私のために働いていませんでした。これがLollipopで動く最小の解決策です。私のデバイスでは、結果の選択リストには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..."));
4
scottt

これは私にとってはまったく問題ありません。

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));
4
EpicPandaForce

次のコードは私のために働いた!

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);
4
Suyog Gunjal

あなたの意図がEメールアプリ(そして他のテキストメッセージングやソーシャルアプリではない)によってのみ扱われることを確実にしたいなら、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);
    }
}

私はこれを見つけました https://developer.Android.com/guide/components/intents-common.html#Email

3
Lamine Slimany

あなたが attachment を送っていないとき、これらの答えのほとんどは単純な場合のためにだけ働きます。私の場合は、添付ファイル(ACTION_SEND)または2つの添付ファイル(ACTION_SEND_MULTIPLE)を送信する必要があります。

だから私はこのスレッドから最良のアプローチを取り、それらを組み合わせました。サポートライブラリのShareCompat.IntentBuilderを使用していますが、ACTION_SENDTOと "mailto:" uriが一致するアプリケーションのみを示しています。このように私は添付ファイルをサポートしているEメールアプリのリストだけを取得します。

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
}
2
David Vávra

Gmailをターゲットにしたい場合は、次のようにします。意図は「ACTION_SEND」ではなく「ACTION_SENDTO」であり、追加の意図フィールドは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")); 
}
2
Prabhu M

このコードは私の端末で機能しています

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"[email protected]"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));
1
Mahen

KotlinでAdilの答えを更新しています、

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

in 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);
            }
1
mughil

From 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);
    }
}
1
marvatron

これは私が使用しているものであり、それは私のために働きます:

//variables
String subject = "Whatever subject you want";
String body = "Whatever text you want to put in the body";
String intentType = "text/html";
String mailToParse = "mailto:";

//start Intent
Intent variableName = new Intent(Intent.ACTION_SENDTO);
variableName.setType(intentType);
variableName.setData(Uri.parse(mailToParse));
variableName.putExtra(Intent.EXTRA_SUBJECT, subject);
variableName.putExtra(Intent.EXTRA_TEXT, body);

startActivity(variableName);

これにより、ユーザーは好みの電子メールアプリを選択することもできます。これができない唯一のことは受信者のEメールアドレスを設定することです。

1
grasshopper

たぶん、あなたはこれを試してみるべきです:intent.setType("plain/text");

私はそれを見つけました ここ 。私は自分のアプリでそれを使用しました、そしてそれはEメールとGmailオプションだけを示しています。

1
sianis

これを使って:

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'
1
Manish

ankoを使う - kotlin

context.email(email, subject, body)
0
Ali hasan
            Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                    "mailto", email, null));
            if (emailIntent.resolveActivity(context.getPackageManager()) != null) {
                context.startActivity(Intent.createChooser(emailIntent, "Send Email..."));
            } else {
                Toast.makeText(context, "No apps can perform this action.", Toast.LENGTH_SHORT).show();
            }
0

電話のEメールクライアントでEメールを作成します。

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, ""));
0
user3150090

intent.setType("message/rfc822");を使用しても機能しますが、必ずしもEメールを処理するとは限らない追加のアプリケーション(GDriveなど)が表示されます。 setType("text/plain")Intent.ACTION_SENDTOを使用するのが最善ですが、最良の結果を得るには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"));
0
Rami Alloush