La meilleure (et la plus simple) méthode consiste à utiliser Intent:
Intent i =newIntent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL ,newString[]{"[email protected]"});
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();}
Dans le code ci-dessus, il n'y a pas d'ID e-mail d'expéditeur. Comment envoyer le message?
KIRAN KJ
38
KIRAN: Vous aurez besoin de regarder comment les intentions fonctionnent pour comprendre cela. Il ouvrira essentiellement une application de messagerie avec le destinataire, l'objet et le corps déjà remplis. C'est à l'application de messagerie de faire l'envoi.
Jeremy Logan
8
L'e-mail n'apparaît pas dans le champ "À" au démarrage de l'activité. quelqu'un sait?
Hamza Waqas
11
la grande contribution de ce commentaire est: message / rfc822
Guilherme Oliveira
22
ajoutez-les pour être sûr que le sélecteur n'affiche que les applications de messagerie: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris
194
Utilisez .setType("message/rfc822")ou le sélecteur vous montrera toutes les (nombreuses) applications qui prennent en charge l'intention d'envoi.
Bien, cela devrait avoir plus de votes positifs. Vous ne remarquerez pas les tests sur l'émulateur, mais lorsque vous allez envoyer "text / plain" sur un appareil réel, il vous donnera une liste de 15+ applications !! donc "message / rfc822" est définitivement recommandé (la norme de messagerie).
Blundell
7
@Blundell salut, mais je n'ai vu aucune différence après avoir changé pourmessage/rfc822
dessiner
2
Pouvez-vous supprimer le bluetooth de la liste? Cela apparaît également avec ce type. +1 cependant, astuce intéressante!
ingh.am
4
Sauvé notre bacon. Je ne peux pas imaginer expliquer au client que l'utilisateur peut tweeter les demandes d'assistance au lieu de lui envoyer un e-mail.
Kevin Galligan
1
+1111111 Cela mérite d'innombrables +1 pour que les autres puissent le voir. J'ai raté cette portion et j'ai dû faire face à ce problème pendant un certain temps!
Challenge
89
J'utilise cela depuis longtemps et cela semble bien, aucune application non-email n'apparaît. Juste une autre façon d'envoyer une intention d'envoi d'e-mail:
Intent intent =newIntent(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:[email protected]"));// 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);
Action non signalée: cette action n'est pas prise en charge actuellement
erdomester
4
lgor G-> plz passe de setType "(plain / text") à setType ("text / plain")
sachit
2
.setType ("message / rfc822") pas text / plain
The Hungry Androider
1
ce code ouvrira-t-il l'intention de l'email? comment envoyer un e-mail sans montrer l'intention à l'utilisateur @yuku je veux envoyer un mot de passe à un e
J'utilisais quelque chose dans le sens de la réponse actuellement acceptée afin d'envoyer des e-mails avec un fichier journal d'erreur binaire joint. GMail et K-9 l'envoient très bien et il arrive également très bien sur mon serveur de messagerie. Le seul problème était mon client de messagerie de choix Thunderbird qui avait des problèmes avec l'ouverture / l'enregistrement du fichier journal joint. En fait, il n'a tout simplement pas enregistré le fichier sans se plaindre.
J'ai jeté un coup d'œil à l'un des codes source de ces messages et j'ai remarqué que la pièce jointe du fichier journal avait (naturellement) le type MIME message/rfc822. Bien sûr, cette pièce jointe n'est pas un e-mail joint. Mais Thunderbird ne peut pas gérer cette petite erreur avec élégance. C'était donc une sorte de déception.
Après un peu de recherche et d'expérimentation, j'ai trouvé la solution suivante:
Intent i =newIntent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL,newString[]{
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"));
Comme vous pouvez le voir, la méthode createEmailOnlyChooserIntent peut être facilement alimentée avec l'intention correcte et le type MIME correct.
Il passe ensuite en revue la liste des activités disponibles qui répondent à une mailtointention de protocole ACTION_SENDTO (qui sont uniquement des applications de messagerie) et construit un sélecteur basé sur cette liste d'activités et l'intention ACTION_SEND d'origine avec le type MIME correct.
Un autre avantage est que Skype n'est plus répertorié (ce qui correspond au type mime rfc822).
Je viens de vous insérer un extrait de code et cela fonctionne très bien. Avant qu'il n'y ait des applications répertoriées comme Google Drive, Skype, etc. Mais n'y a-t-il pas un moyen d'envoyer un courrier électronique hors de l'application sans appeler une autre application? je viens de lire l'article sur le client de messagerie que @Rene postet ci-dessus mais semble trop compliqué pour simplement envoyer un simple e
Alex Cio
Excellente réponse. J'avais également Skype et Google Drive à venir ACTION_SENDet cela résout à merveille.
darrenp
1
La solution la plus populaire ci-dessus renvoie également Skype et Vkontakte. Cette solution est meilleure.
Denis Kutlubaev
qu'est-ce que crashLogFile? où a-t-il été initialisé? pease sepecify
Noufal
@Noufal Ceci est juste un reste de ma propre base de code. C'est une Fileinstance pointant vers un fichier journal de plantage que mes applications Android créent en arrière-plan au cas où il y aurait une exception non interceptée. Cet exemple devrait simplement illustrer comment ajouter une pièce jointe à un e-mail. Vous pouvez également joindre tout autre fichier du stockage externe (une image par exemple). Vous pouvez également supprimer cette ligne avec crashLogFilepour obtenir un exemple de travail.
tiguchi
37
Pour JUSTE LAISSER LES APPLICATIONS PAR EMAIL pour résoudre votre intention, vous devez spécifier ACTION_SENDTO comme Action et mailto comme Données.
Le plus important est le drapeau: il l'est ACTION_SENDTOet nonACTION_SEND
L'autre ligne importante est
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
Soit dit en passant, si vous envoyez un message vide Extra, la if()fin ne fonctionnera pas et l'application ne lancera pas le client de messagerie.
Selon la documentation Android. Si vous souhaitez vous assurer que votre intention n'est gérée que par une application de messagerie (et non par d'autres applications de messagerie texte ou sociales), utilisez l' ACTION_SENDTOaction et incluez le mailto:schéma de données " ". Par exemple:
publicvoid composeEmail(String[] addresses,String subject){Intent intent =newIntent(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);}}
La stratégie d'utilisation .setType("message/rfc822")ou ACTION_SENDsemble également correspondre à des applications qui ne sont pas des clients de messagerie, telles que Android Beam et Bluetooth .
L'utilisation d' ACTION_SENDTOun et d'un mailto:URI semble fonctionner parfaitement et est recommandée dans la documentation du développeur . Cependant, si vous faites cela sur les émulateurs officiels et qu'aucun compte de messagerie n'est configuré (ou qu'il n'y a pas de clients de messagerie), vous obtenez l'erreur suivante:
Action non prise en charge
Cette action n'est actuellement pas prise en charge.
Si vous souhaitez que votre application contourne cela afin qu'elle fonctionne également correctement sur les émulateurs officiels, vous pouvez le vérifier avant d'essayer d'envoyer l'e-mail:
privatevoid sendEmail(){Intent intent =newIntent(Intent.ACTION_SENDTO).setData(newUri.Builder().scheme("mailto").build()).putExtra(Intent.EXTRA_EMAIL,newString[]{"John Smith <[email protected]>"}).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 matchedIntent 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();}
L'envoi d'e-mails peut se faire avec Intents qui ne nécessitera aucune configuration. Mais cela nécessitera une interaction de l'utilisateur et la mise en page sera un peu restreinte.
Créer et envoyer un e-mail plus complexe sans interaction avec l'utilisateur implique de créer votre propre client. La première chose est que l'API Sun Java pour le courrier électronique n'est pas disponible. J'ai réussi à tirer parti de la bibliothèque Apache Mime4j pour créer des e-mails. Tous basés sur les documents de nilvec .
Voici l'exemple de code de travail qui ouvre l' application de messagerie dans l'appareil Android et remplie automatiquement avec l' adresse et l' objet dans le courrier de composition.
Merci. Par rapport à une solution de @Avi Parshan, vous définissez un e-mail setData()et Avi s'installe putExtra(). Les deux variantes fonctionnent. Mais si vous supprimez setDataet utilisez uniquement intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});, il y aurait un ActivityNotFoundException.
CoolMind
5
J'utilise le code ci-dessous dans mes applications. Cela montre exactement les applications client de messagerie, telles que Gmail.
Bonne solution! Il évite de nombreuses applications inadaptées (principalement utilisées comme "Partager"). N'ajoutez pas intent.type = "message/rfc822"; intent.type = "text/html";ici car cela entraînerait une exception.
Cette fonction dirige d'abord Gmail d'intention pour l'envoi d'e-mails.Si Gmail n'est pas trouvé, promouvez le sélecteur d'intention. J'ai utilisé cette fonction dans de nombreuses applications commerciales et cela fonctionne bien. J'espère que cela vous aidera:
Comment est-ce mieux que les réponses qui existaient déjà lorsque vous avez posté cela? Cela ressemble à une copie de la réponse acceptée enveloppée dans une activité.
@PedroVarela nous pouvons toujours vérifier l'exception d'activité non trouvée.
silentsudo
1
Oui nous pouvons. Mais votre solution n'est pas la bonne. La documentation Android indique clairement ce que vous devez faire pour afficher uniquement les applications de messagerie dans le sélecteur d'intention. Vous avez écrit "En supposant que la plupart des appareils Android ont déjà installé l'application Gmail"; Que faire s'il s'agit d'un appareil rooté et que l'utilisateur supprime le client Gmail?. Supposons que vous créez votre propre application de messagerie électronique?, Si un utilisateur envoie un e-mail, votre application ne figurera pas dans cette liste. Que se passe-t-il si gmail change le nom du package? Allez-vous mettre à jour votre application?
/**
* 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.
*/publicstaticvoid sendEmail(Context context,String[] emails,String subject,boolean forceGmail){Intent i =newIntent(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.
*/publicstaticboolean isPackageInstalled(@NonNullContext context,@NonNullString packageName){PackageManager pm = context.getPackageManager();if(pm !=null){try{
pm.getPackageInfo(packageName,0);returntrue;}catch(PackageManager.NameNotFoundException e){
e.printStackTrace();}}returnfalse;}
Intent emailIntent =newIntent(Intent.ACTION_SENDTO,Uri.fromParts("mailto","[email protected]",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**
String mailto ="mailto:[email protected]"+"?cc="+"[email protected]"+"&subject="+Uri.encode(subject)+"&body="+Uri.encode(bodyText);Intent emailIntent =newIntent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));try{
startActivity(emailIntent);}catch(ActivityNotFoundException e){//TODO: Handle case where no email app is available}
Le code ci-dessus ouvrira le client de messagerie préféré des utilisateurs prérempli avec le courrier électronique prêt à être envoyé.
Réponses:
La meilleure (et la plus simple) méthode consiste à utiliser
Intent
:Sinon, vous devrez écrire votre propre client.
la source
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Utilisez
.setType("message/rfc822")
ou le sélecteur vous montrera toutes les (nombreuses) applications qui prennent en charge l'intention d'envoi.la source
message/rfc822
J'utilise cela depuis longtemps et cela semble bien, aucune application non-email n'apparaît. Juste une autre façon d'envoyer une intention d'envoi d'e-mail:
la source
J'utilisais quelque chose dans le sens de la réponse actuellement acceptée afin d'envoyer des e-mails avec un fichier journal d'erreur binaire joint. GMail et K-9 l'envoient très bien et il arrive également très bien sur mon serveur de messagerie. Le seul problème était mon client de messagerie de choix Thunderbird qui avait des problèmes avec l'ouverture / l'enregistrement du fichier journal joint. En fait, il n'a tout simplement pas enregistré le fichier sans se plaindre.
J'ai jeté un coup d'œil à l'un des codes source de ces messages et j'ai remarqué que la pièce jointe du fichier journal avait (naturellement) le type MIME
message/rfc822
. Bien sûr, cette pièce jointe n'est pas un e-mail joint. Mais Thunderbird ne peut pas gérer cette petite erreur avec élégance. C'était donc une sorte de déception.Après un peu de recherche et d'expérimentation, j'ai trouvé la solution suivante:
Il peut être utilisé comme suit:
Comme vous pouvez le voir, la méthode createEmailOnlyChooserIntent peut être facilement alimentée avec l'intention correcte et le type MIME correct.
Il passe ensuite en revue la liste des activités disponibles qui répondent à une
mailto
intention de protocole ACTION_SENDTO (qui sont uniquement des applications de messagerie) et construit un sélecteur basé sur cette liste d'activités et l'intention ACTION_SEND d'origine avec le type MIME correct.Un autre avantage est que Skype n'est plus répertorié (ce qui correspond au type mime rfc822).
la source
ACTION_SEND
et cela résout à merveille.File
instance pointant vers un fichier journal de plantage que mes applications Android créent en arrière-plan au cas où il y aurait une exception non interceptée. Cet exemple devrait simplement illustrer comment ajouter une pièce jointe à un e-mail. Vous pouvez également joindre tout autre fichier du stockage externe (une image par exemple). Vous pouvez également supprimer cette ligne aveccrashLogFile
pour obtenir un exemple de travail.Pour JUSTE LAISSER LES APPLICATIONS PAR EMAIL pour résoudre votre intention, vous devez spécifier ACTION_SENDTO comme Action et mailto comme Données.
la source
J'ai résolu ce problème avec de simples lignes de code comme l'explique la documentation Android.
( https://developer.android.com/guide/components/intents-common.html#Email )
Le plus important est le drapeau: il l'est
ACTION_SENDTO
et nonACTION_SEND
L'autre ligne importante est
Soit dit en passant, si vous envoyez un message vide
Extra
, laif()
fin ne fonctionnera pas et l'application ne lancera pas le client de messagerie.Selon la documentation Android. Si vous souhaitez vous assurer que votre intention n'est gérée que par une application de messagerie (et non par d'autres applications de messagerie texte ou sociales), utilisez l'
ACTION_SENDTO
action et incluez lemailto:
schéma de données " ". Par exemple:la source
La stratégie d'utilisation
.setType("message/rfc822")
ouACTION_SEND
semble également correspondre à des applications qui ne sont pas des clients de messagerie, telles que Android Beam et Bluetooth .L'utilisation d'
ACTION_SENDTO
un et d'unmailto:
URI semble fonctionner parfaitement et est recommandée dans la documentation du développeur . Cependant, si vous faites cela sur les émulateurs officiels et qu'aucun compte de messagerie n'est configuré (ou qu'il n'y a pas de clients de messagerie), vous obtenez l'erreur suivante:Comme indiqué ci-dessous:
Il s'avère que les émulateurs résolvent l'intention d'une activité appelée
com.android.fallback.Fallback
, qui affiche le message ci-dessus. Apparemment, c'est par conception.Si vous souhaitez que votre application contourne cela afin qu'elle fonctionne également correctement sur les émulateurs officiels, vous pouvez le vérifier avant d'essayer d'envoyer l'e-mail:
Trouvez plus d'informations dans la documentation du développeur .
la source
L'envoi d'e-mails peut se faire avec Intents qui ne nécessitera aucune configuration. Mais cela nécessitera une interaction de l'utilisateur et la mise en page sera un peu restreinte.
Créer et envoyer un e-mail plus complexe sans interaction avec l'utilisateur implique de créer votre propre client. La première chose est que l'API Sun Java pour le courrier électronique n'est pas disponible. J'ai réussi à tirer parti de la bibliothèque Apache Mime4j pour créer des e-mails. Tous basés sur les documents de nilvec .
la source
Voici l'exemple de code de travail qui ouvre l' application de messagerie dans l'appareil Android et remplie automatiquement avec l' adresse et l' objet dans le courrier de composition.
la source
setData()
et Avi s'installeputExtra()
. Les deux variantes fonctionnent. Mais si vous supprimezsetData
et utilisez uniquementintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
, il y aurait unActivityNotFoundException
.J'utilise le code ci-dessous dans mes applications. Cela montre exactement les applications client de messagerie, telles que Gmail.
la source
Cela ne vous montrera que les clients de messagerie (ainsi que PayPal pour une raison inconnue)
la source
intent.type = "message/rfc822"; intent.type = "text/html";
ici car cela entraînerait une exception.Voilà comment je l'ai fait. Agréable et simple.
la source
Cette fonction dirige d'abord Gmail d'intention pour l'envoi d'e-mails.Si Gmail n'est pas trouvé, promouvez le sélecteur d'intention. J'ai utilisé cette fonction dans de nombreuses applications commerciales et cela fonctionne bien. J'espère que cela vous aidera:
la source
essayez simplement celui-ci
la source
Une autre solution peut être
En supposant que la plupart des appareils Android ont déjà installé l'application GMail.
la source
Utilisez-le pour envoyer un e-mail ...
utilisez build gradle:
la source
J'ai utilisé ce code pour envoyer du courrier en lançant directement la section de composition de l'application de messagerie par défaut.
la source
Cette méthode fonctionne pour moi. Il ouvre l'application Gmail (si elle est installée) et définit mailto.
la source
la source
la source
Essaye ça:
Le code ci-dessus ouvrira le client de messagerie préféré des utilisateurs prérempli avec le courrier électronique prêt à être envoyé.
La source
la source