673 votes

Envoyer l'intention de messagerie électronique

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Sujet");
intent.putExtra(Intent.EXTRA_TEXT, "Corps du message de l'email.");
startActivity(Intent.createChooser(intent, "Envoyer un email"));

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

En fait, je veux filtrer ces options de liste. Je veux afficher uniquement les applications liées aux emails telles que Gmail et Yahoo Mail. Comment faire ?

J'ai vu un exemple similaire 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 email. (Si vous ne trouvez pas une telle application, ouvrez simplement mon application : - market://details?id=com.becomputer06.vehicle.diary.free, ou cherchez par 'Vehicle Diary')
  3. Faites défiler jusqu'à 'DEVELOPER'
  4. Cliquez sur 'Envoyer un email'

La boîte de dialogue affiche uniquement les applications email telles que Gmail, Yahoo Mail, etc. Elle ne montre pas Bluetooth, Orkut, etc. Quel code produit une telle boîte de dialogue ?

4 votes

Désolé, cela n'est pas possible avec Intent.ACTION_SEND. Peut-être que cela fonctionne avec un intent directement vers l'application Gmail mais je ne sais pas si c'est possible.

22 votes

Au cas où quelqu'un apprendrait ici à propos des intentions d'email, EXTRA_MAIL doit correspondre à un String[], et non pas seulement à un String comme indiqué ici.

0 votes

Possible duplicate de Envoyer un e-mail via gmail

974voto

doraemon Points 4099

MISE À JOUR

Démarche officielle:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // seules les applications de messagerie électronique doivent gérer ceci
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Lien de référence

ANCIENNE RÉPONSE

La réponse acceptée ne fonctionne pas sur le 4.1.2. Ceci devrait fonctionner sur toutes les plates-formes:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Sujet");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Corps");
startActivity(Intent.createChooser(emailIntent, "Envoyer un email..."));

Mise à jour: Selon marcwjj, il semble qu'en 4.3, nous devons passer un tableau de chaînes au lieu d'une chaîne pour l'adresse e-mail pour que cela fonctionne. Nous pourrions avoir besoin d'ajouter une autre ligne:

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

8 votes

Vous avez raison, et cela ne fonctionne pas non plus sur 4.2. Donc c'est en fait la seule réponse correcte, merci!

13 votes

C'est parfait. Quelqu'un ci-dessous a mentionné que spécifier la partie "mailto" est ce qui restreint les options disponibles pour les clients de messagerie électronique. Utiliser Uri.fromParts("mailto", "", null) placera le curseur dans le champ du destinataire - parfait pour ce que je voulais.

3 votes

Est-il possible de définir le corps avec ceci ?

281voto

becomputer06 Points 5806

Il existe trois approches principales :

String email = /* Votre adresse e-mail ici */
String subject = /* Votre sujet ici */
String body = /* Votre message ici */
String chooserTitle = /* Votre titre de sélection ici */

1. Uri personnalisé :

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 des extras de 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); //Si vous utilisez du HTML dans votre texte de message

startActivity(Intent.createChooser(emailIntent, "Titre du sélecteur"));

3. Support de la bibliothèque ShareCompat :

Activity activity = /* Votre activité ici */

ShareCompat.IntentBuilder.from(activity)
    .setType("message/rfc822")
    .addEmailTo(email)
    .setSubject(subject)
    .setText(body)
    //.setHtmlText(body) //Si vous utilisez du HTML dans votre texte de message
    .setChooserTitle(chooserTitle)
    .startChooser();

2 votes

Cela a beaucoup mieux fonctionné pour moi - les autres options ont fait apparaître certaines choses étranges (comme Skype, par exemple) comme gestionnaires possibles.

2 votes

Si vous avez un symbole % dans le tampon, certains caractères dans l'e-mail résultant ne seront pas correctement encodés. Vous devez effectuer la danse Uri.encode suggérée par @minipif.

19 votes

Celles-ci sont les meilleures réponses ici, ne perdez pas votre temps à essayer d'autres, la deuxième ici est celle que j'ai choisie et ça fonctionne parfaitement, montrant seulement les applications de messagerie pure, pas gDrive, pas bluetooth.. etc. Merci @becomputer06

236voto

Padma Kumar Points 10698

Quand vous allez changer votre intent.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 électronique, sans facebook ni autres applications. Juste les clients de messagerie électronique. Ex :

new Intent(Intent.ACTION_SENDTO);

Je ne vous recommanderais pas d'accéder directement à l'application de messagerie électronique. Laissez l'utilisateur choisir son application de messagerie électronique préférée. Ne le contraignez pas.

Si vous utilisez ACTION_SENDTO, putExtra ne fonctionne pas pour ajouter le sujet et le texte à l'intent. Utilisez Uri pour ajouter le sujet et le texte du corps.

ÉDITER: Nous pouvons utiliser message/rfc822 au lieu de "text/plain" comme type MIME. Cependant, cela ne signifie pas "offrir uniquement des clients de messagerie électronique" -- cela indique "offrir tout ce qui supporte les données message/rfc822". Cela pourrait inclure facilement certaines applications qui ne sont pas des clients de messagerie électronique.

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

7 votes

Pouvez-vous s'il vous plaît fournir du code pour produire la sortie souhaitée?

9 votes

89 votes

Le sélecteur d'intention dit aucune application installée pour exécuter cette intention lorsque j'utilise ACTION_SENDTO. J'utilise Android 4.1.2 et j'ai une application de messagerie installée...

37voto

Magnus Points 257

Essayer :

intent.setType("message/rfc822");

0 votes

Il a raison, j'ai essayé et il propose [Drive, Email, Gmail, Skype], c'est la "Bonne réponse"

18 votes

En utilisant le type MIME pour effectuer une opération d'envoi est une mauvaise idée, car vous demandez essentiellement à Android de fournir une liste d'applications prenant en charge l'envoi d'un fichier de type message/rfc822. Ce n'est pas la même chose qu'envoyer un e-mail. Utilisez plutôt le protocole mailto:, car c'est ce que les clients de messagerie comprennent réellement.

16voto

Addev Points 4755

Si vous voulez uniquement les clients de messagerie électronique, vous devriez 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);

3 votes

Non, cela fait toujours apparaître beaucoup d'autres applications - beaucoup plus que ACTION_SENDTO

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X