Androidアプリケーションからメールを送信するにはどうすればよいですか?


回答:


978

最高の(かつ簡単な)方法は、使用することです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();
}

それ以外の場合は、独自のクライアントを作成する必要があります。


6
上記のコードでは、送信者の電子メールIDはありません。メッセージはどのように送信されますか?
KIRAN KJ

38
キラン:これを理解するには、インテントのしくみを調べる必要があります。基本的には、受信者、件名、および本文がすでに入力されている電子メールアプリケーションを開きます。送信はメールアプリ次第です。
ジェレミーローガン

8
アクティビティを開始しても、[TO]フィールドにメールが表示されません。誰か知ってる?
Hamza Waqas

11
このコメントの大きな貢献は次のとおりです。message/ rfc822
ギルヘルメオリヴェイラ

22
チューのみが表示されたアプリを電子メールで送信してくださいということに、これらを追加します Intent i = new Intent(Intent.ACTION_SENDTO); i.setType("message/rfc822"); i.setData(Uri.parse("mailto:"));
Edris

194

.setType("message/rfc822")またはチューザーを使用すると、送信インテントをサポートする(多くの)アプリケーションがすべて表示されます。


5
いいですね、これはもっと多くの賛成票を持つべきです。エミュレータでのテストには気付かないでしょうが、実際のデバイスで「text / plain」を送信しようとすると、15以上のアプリのリストが表示されます。したがって、 "message / rfc822"は間違いなく推奨されます(電子メール標準)。
Blundell '23

7
@Blundellこんにちは、に変更した後、私は何の違いも見ませんでしたmessage/rfc822
描画

2
リストからBluetoothを削除できますか?これはこのタイプでも発生します。+1しかし、きちんとしたトリック!
ingh.am

4
私たちのベーコンを保存しました。ユーザーがサポートリクエストをメールで送信する代わりにツイートする可能性があることをクライアントに説明することは想像できません。
ケビンガリガン

1
+1111111これは無限の+1に値するので、他の人はこれを見ることができます。私はこの部分を逃して、しばらくの間この問題に対処しなければなりませんでした!
チャレンジ

89

私はこれをずっと前から使用しており、メール以外のアプリが表示されないようです。メール送信インテントを送信する別の方法:

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

1
サポートされていないアクション:このアクションは現在サポートされていません
erdomester 2012年

4
lgor G-> plzがsetType "(plain / text")からsetType( "text / plain")に変更されました
sachit

2
.setType( "message / rfc822")not text / plain
The Hungry

1
このコードは電子メールの意図を開きますか?ユーザー@yukuにインテントを表示せずにメールを送信する方法メールにパスワードを送信したい
Erum

2
この答えは非常に影響力があります。:)
Nick Volynkin 2017年

54

バイナリエラーログファイルが添付された電子メールを送信するために、現在受け入れられている回答に沿って何かを使用していました。GMailとK-9は問題なく送信し、メールサーバーにも正常に到着します。唯一の問題は、私の選択したThunderbirdのメールクライアントで、添付のログファイルを開いたり保存したりするときに問題が発生しました。実際、文句を言わずにファイルをまったく保存しませんでした。

私はこれらのメールのソースコードの1つを見て、ログファイルの添付ファイルに(当然のことながら)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);
    }
}

次のように使用できます。

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タイプでセレクターを作成します。

もう1つの利点は、Skypeがリストされなくなったことです(rfc822 MIMEタイプに応答することになります)。


1
コードスニペットを挿入したところ、問題なく動作しました。Googleドライブ、Skypeなどのアプリがリストされる前に、他のアプリケーションを呼び出さずにアプリケーションからメールを送信する方法はありませんか?上記の@Rene postetというメールクライアントに関する記事を読んだだけですが、単純なメールを送信するだけでは複雑すぎるようです
Alex Cio

すばらしい答えです。SkypeとGoogleドライブACTION_SENDも思いついたので、これで美しく整理できました。
darrenp

1
上記の最も一般的なソリューションは、SkypeとVkontakteも返します。このソリューションの方が優れています。
Denis Kutlubaev 2013

crashLogFileとは何ですか?どこで初期化されましたか?pease sepecify
Noufal

@Noufalこれは私自身のコードベースの残りの一部です。これFileは、キャッチされない例外が発生した場合にAndroidアプリがバックグラウンドで作成するクラッシュログファイルを指すインスタンスです。その例では、電子メールの添付ファイルを追加する方法を説明するだけです。外部ストレージから他のファイル(画像など)を添付することもできます。crashLogFile実際の例を得るために、その行を削除することもできます。
tiguchi 14

37

JUST LETのEMAIL APPSあなたは、データとしてのアクションとして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();
    }

}

23

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:」データスキームを含めます。例えば:

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

21

Android BeamBluetoothなど、メールクライアントではないアプリを使用する、.setType("message/rfc822")またはACTION_SEND一致させると思われる戦略。

使用する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();
}

詳細については、開発者向けドキュメントをご覧ください。


13

メールの送信は、設定を必要としないインテントを使用して行うことができます。ただし、ユーザーの操作が必要になり、レイアウトが少し制限されます。

ユーザーの操作なしでより複雑なメールを作成して送信するには、独自のクライアントを作成する必要があります。まず、電子メール用のSun Java APIが利用できないことです。私は、Apache Mime4jライブラリを利用してメールを作成することに成功しました。すべてnilvecのドキュメントに基づいています。


6

これは、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);
    }
}

ありがとう。@Avi Parshanのソリューションと比較して、メールをsetData()に設定し、Aviをに設定しputExtra()ます。どちらのバリアントも機能します。削除した場合でもsetData、使用するだけでintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});、存在することになりますActivityNotFoundException
CoolMind 2018

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

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

1
素敵な解決策!多くの不適切なアプリケーション(主に「共有」として使用される)を回避します。intent.type = "message/rfc822"; intent.type = "text/html";例外が発生するため、ここに追加しないでください。
CoolMind 2018

3

これは私がやった方法です。素敵でシンプル。

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

3

この機能は、まずメールを送信するためにインテントGmailを誘導します。Gmailが見つからない場合は、インテントチューザーをプロモートします。私は多くの商用アプリでこの機能を使用しましたが、うまく機能しています。それがあなたを助けることを願っています:

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

1
どうもありがとう。私の命を救う
androCoder-BD 2017

2

これを試してみてください

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

        }
    });
}

3
これは、これを投稿したときにすでに存在していた回答よりも優れていますか?アクティビティにラップされた承認済みの回答のコピーのように見えます。
サム・

2

他の解決策は

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アプリがすでにインストールされていると仮定します。


@PedroVarela私たちは常にアクティビティが見つからない例外を確認できます。
silentsudo 2016

1
はい、できます。しかし、あなたの解決策は正しいものではありません。Androidのドキュメントには、インテントチューザーにメールアプリのみを表示するために必要な操作が明確に記載されています。「ほとんどのAndroidデバイスにGmailアプリがすでにインストールされていると想定しています」と書いています。ルート権限を取得されたデバイスであり、ユーザーがGmailクライアントを削除した場合はどうなりますか?独自のメールアプリを作成しているとしましょう。ユーザーがメールを送信しようとすると、アプリはそのリストに含まれません。Gmailがパッケージ名を変更するとどうなりますか?アプリを更新しますか?
Pedro Varela

2

これをメールの送信に使用...

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

ビルドグラドルを使用します。

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

2

このコードを使用して、デフォルトのメールアプリの作成セクションを直接起動してメールを送信しました。

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setType("message/rfc822"); 
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"test@gmail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    i.putExtra(Intent.EXTRA_TEXT   , "body of email");
    try {
        startActivity(Intent.createChooser(i, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }

1

この方法でうまくいきます。Gmailアプリ(インストールされている場合)を開き、mailtoを設定します。

public void openGmail(Activity activity) {
    Intent emailIntent = new Intent(Intent.ACTION_VIEW);
    emailIntent.setType("text/plain");
    emailIntent.setType("message/rfc822");
    emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
    final PackageManager pm = activity.getPackageManager();
    final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
    ResolveInfo best = null;
    for (final ResolveInfo info : matches)
        if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
            best = info;
    if (best != null)
        emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
    activity.startActivity(emailIntent);
}

1
/**
 * Will start the chosen Email app
 *
 * @param context    current component context.
 * @param emails     Emails you would like to send to.
 * @param subject    The subject that will be used in the Email app.
 * @param forceGmail True - if you want to open Gmail app, False otherwise. If the Gmail
 *                   app is not installed on this device a chooser will be shown.
 */
public static void sendEmail(Context context, String[] emails, String subject, boolean forceGmail) {

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL, emails);
    i.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (forceGmail && isPackageInstalled(context, "com.google.android.gm")) {
        i.setPackage("com.google.android.gm");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(Intent.createChooser(i, "Send mail..."));
        } catch (ActivityNotFoundException e) {
            Toast.makeText(context, "No email app is installed on your device...", Toast.LENGTH_SHORT).show();
        }
    }
}

/**
 * Check if the given app is installed on this devuice.
 *
 * @param context     current component context.
 * @param packageName The package name you would like to check.
 * @return True if this package exist, otherwise False.
 */
public static boolean isPackageInstalled(@NonNull Context context, @NonNull String packageName) {
    PackageManager pm = context.getPackageManager();
    if (pm != null) {
        try {
            pm.getPackageInfo(packageName, 0);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
    return false;
}

1
 Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","ebgsoldier@gmail.com", null));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Forgot Password");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "Write your Pubg user name or Phone Number");
    startActivity(Intent.createChooser(emailIntent, "Send email..."));**strong text**

1

これを試して:

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
    startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
    //TODO: Handle case where no email app is available
}

上記のコードは、送信する準備ができた電子メールが事前に入力されたユーザーのお気に入りの電子メールクライアントを開きます。

ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.