web-dev-qa-db-fra.com

Envoyer un courriel

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

Le code ci-dessus ouvre une boîte de dialogue indiquant les applications suivantes: - Bluetooth, Google Documents, Yahoo Mail, Gmail, Orkut, Skype, etc.

En fait, je veux filtrer ces options de liste. Je souhaite afficher uniquement les applications liées au courrier électronique, par exemple. Gmail, Yahoo Mail. Comment faire?

J'ai vu un tel exemple sur l'application 'Android Market'. 

  1. Ouvrez l'application Android Market 
  2. Ouvrez n’importe quelle application où le développeur a spécifié son adresse électronique. (Si vous ne trouvez pas cette application, ouvrez simplement mon application: - marché: // détails? Id = com.becomputer06.vehicle.diary.free, recherche OR par "Journal du véhicule")
  3. Faites défiler jusqu'à 'DÉVELOPPEUR'
  4. Cliquez sur 'Envoyer un email'

La boîte de dialogue affiche uniquement les applications de messagerie, par ex. Gmail, Yahoo Mail, etc. Il ne montre pas Bluetooth, Orkut, etc. Quel code produit un tel dialogue?

499
Dipesh Rathod

lorsque vous modifierez votre intention.setType comme ci-dessous, vous obtiendrez

intent.setType("text/plain");

Utilisez Android.content.Intent.ACTION_SENDTO pour obtenir uniquement la liste des clients de messagerie, sans facebook ni aucune autre application. Juste les clients de messagerie . Ex:

new Intent(Intent.ACTION_SENDTO);

Je ne suggérerais pas que vous obteniez directement à l'application de messagerie. Laissez l'utilisateur choisir son application de messagerie préférée. Ne le contraignez pas.

Si vous utilisez ACTION_SENDTO, putExtra ne permet pas d'ajouter un sujet et du texte à l'intention. Utilisez Uri pour ajouter le sujet et le corps du texte.

EDIT: Nous pouvons utiliser message/rfc822 au lieu de "text/plain" comme type MIME. Cependant, cela n'indique pas "offrir uniquement des clients de messagerie" - mais "offrir tout ce qui prend en charge les données de message/rfc822". Cela pourrait facilement inclure des applications qui ne sont pas des clients de messagerie. 

message/rfc822 prend en charge les types MIME de .mhtml, .mht, .mime

189
Padma Kumar

La réponse acceptée ne fonctionne pas sur le 4.1.2. Cela devrait fonctionner sur toutes les plateformes: 

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

J'espère que cela t'aides. 

Mise à jour: Selon marcwjj , il semble que, pour la version 4.3, nous devons passer un tableau de chaînes de caractères au lieu d’une chaîne pour l’adresse électronique pour que cela fonctionne. Nous aurons peut-être besoin d'ajouter une ligne supplémentaire: 

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

Lien de référence

805
thanhbinh84

Il y a trois approches principales:

String email = /* Your email address here */
String subject = /* Your subject here */
String body = /* Your body here */
String chooserTitle = /* Your chooser title here */

1. Personnalisé 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. Utilisation de Intent extras:

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. Bibliothèque de support 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();
205
Dipesh Rathod

Cité dans la documentation officielle d'Android, je l'ai testé sous Android 4.4 et fonctionne parfaitement. Voir d'autres exemples à 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);
    }
}
90
marcwjj

Une réponse tardive, même si j'ai trouvé une solution qui pourrait aider les autres:

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

Ce fut ma sortie (seulement Gmail + Boîte de réception suggéré):

 my output

J'ai eu cette solution du Développeurs Android site.

58
capt.swag

Essayer: 

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

Cela fonctionne pour moi:

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

c'est-à-dire utiliser l'action ACTION_SENDTO plutôt que l'action ACTION_SEND. Je l'ai essayé sur quelques appareils Android 4.4 et cela limite le menu contextuel du sélecteur d'afficher uniquement des applications de messagerie (Email, Gmail, Yahoo Mail, etc.) et insère correctement l'adresse électronique et le sujet dans l'email.

28
Adil Hussain

Voici comment procéder selon Documents de développement Android Ajoutez ces lignes de code à votre application: 

Intent intent = new Intent(Intent.ACTION_SEND);//common intent 
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Si vous voulez ajouter le corps et le sujet, ajoutez ceci

intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here");
intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" );
23
Avi Parshan

Si vous souhaitez uniquement les clients de messagerie, vous devez utiliser Android.content.Intent.EXTRA_EMAIL avec un tableau. Voici un exemple:

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

Enfin trouver la meilleure façon de faire

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

Le code suivant fonctionne bien pour moi.

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

Edit: ne fonctionne plus avec les nouvelles versions de Gmail

C'était le seul moyen que j'avais trouvé à l'époque pour que cela fonctionne avec n'importe quel personnage.

la réponse de doreamon est la bonne solution, car elle fonctionne avec tous les personnages des nouvelles versions de Gmail.

Ancienne réponse:


Voici le mien. Il semble fonctionner sur toutes les versions d'Android, avec une prise en charge du sujet et du corps du message et une prise en charge complète des caractères utf-8:

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

Aucune de ces solutions ne fonctionnait pour moi. Voici une solution minimale qui fonctionne sur Lollipop. Sur mon appareil, seules les applications de messagerie natives Gmail et apparaissent dans la liste de choix résultante.

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

Cela fonctionne parfaitement pour moi:

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

Suivre le code a fonctionné pour moi !!

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

Fonctionne sur toutes les versions 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..."));
4
Usama Saeed US

Si vous voulez vous assurer que votre intention est gérée uniquement par une application de messagerie (et non par d'autres applications de messagerie texte ou sociales), utilisez l'action ACTION_SENDTO et incluez le schéma de données "mailto:". Par exemple:

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

J'ai trouvé cela dans https://developer.Android.com/guide/components/intents-common.html#Email

3
Lamine Slimany

La plupart de ces réponses ne fonctionnent que dans un cas simple où vous n'envoyez pas pièce jointe . Dans mon cas, j'ai parfois besoin d'envoyer une pièce jointe (ACTION_SEND) ou deux pièces jointes (ACTION_SEND_MULTIPLE). 

J'ai donc pris les meilleures approches de ce fil et les ai combinées. Il utilise le ShareCompat.IntentBuilder de la bibliothèque de support, mais je ne montre que les applications qui correspondent à ACTION_SENDTO avec "mailto:" uri. Ainsi, je ne reçois que la liste des applications de messagerie avec prise en charge des pièces jointes:

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

Si vous souhaitez cibler Gmail, vous pouvez procéder comme suit. Notez que l'intention est "ACTION_SENDTO" et non "ACTION_SEND" et que les champs d'intention supplémentaires ne sont pas nécessaires pour 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
Prab

Ce code fonctionne dans mon appareil

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

J'actualise la réponse d'Adil dans Kotlin,

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
KishanSolanki124

in Kotlin si quelqu'un cherche

            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

C'est ce que j'utilise et ça marche pour moi:

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

Cela permettra également à l'utilisateur de choisir son application de messagerie préférée. La seule chose que cela ne vous permet pas de faire est de définir l'adresse e-mail du destinataire.

1
grasshopper

Peut-être devriez-vous essayer ceci: intent.setType("plain/text");

Je l'ai trouvé ici . Je l'ai utilisé dans mon application et il ne montre que les options de messagerie électronique et Gmail.

1
sianis

Utilisez ceci:

boolean success = EmailIntentBuilder.from(activity)
        .to("[email protected]")
        .cc("[email protected]")
        .subject("Error report")
        .body(buildErrorReport())
        .start();

utiliser le gradé de construction:

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

utiliser Anko - kotlin

context.email(email, subject, body)
0
Ali hasan

De Documentation développeurs 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);
    }
}
0
marvatron
            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
Ahamadullah Saikat

Composez un email dans le client email du téléphone:

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

Utiliser intent.setType("message/rfc822"); fonctionne, mais il affiche des applications supplémentaires qui ne gèrent pas nécessairement les emails (par exemple, GDrive). Utiliser Intent.ACTION_SENDTO avec setType("text/plain") est la meilleure solution, mais vous devez ajouter setData(Uri.parse("mailto:")) pour obtenir les meilleurs résultats (applications de messagerie uniquement). Le code complet est comme suit:

    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