Der beste (und einfachste) Weg ist die Verwendung eines 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();}
Andernfalls müssen Sie Ihren eigenen Client schreiben.
Im obigen Code gibt es keine Absender-E-Mail-ID. Wie wird die Nachricht dann gesendet?
KIRAN KJ
38
KIRAN: Sie müssen untersuchen, wie Absichten funktionieren, um dies zu verstehen. Grundsätzlich wird eine E-Mail-Anwendung geöffnet, in der Empfänger, Betreff und Text bereits ausgefüllt sind. Es liegt an der E-Mail-App, das Senden durchzuführen.
Jeremy Logan
8
Die E-Mail wird beim Starten der Aktivität nicht im Feld "TO" angezeigt. weiß jemand?
Hamza Waqas
11
Der große Beitrag dieses Kommentars ist: Nachricht / rfc822
Guilherme Oliveira
22
Fügen Sie diese hinzu, um sicherzustellen, dass die Auswahl nur E-Mail-Apps anzeigt: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris
194
Verwenden Sie .setType("message/rfc822")oder die Auswahl zeigt Ihnen alle (vielen) Anwendungen, die die Sendeabsicht unterstützen.
Schön, das sollte mehr Stimmen haben. Sie werden keine Tests auf dem Emulator bemerken, aber wenn Sie "Text / Plain" auf einem realen Gerät senden, erhalten Sie eine Liste mit mehr als 15 Apps! Daher wird "message / rfc822" definitiv empfohlen (der E-Mail-Standard).
Blundell
7
@Blundell Hallo, aber ich habe keinen Unterschied gesehen, nachdem ich zumessage/rfc822
Draw
2
Können Sie Bluetooth aus der Liste entfernen? Dies zeigt sich auch bei diesem Typ. +1 aber, ordentlicher Trick!
Ingh.am
4
Hat unseren Speck gerettet. Ich kann mir nicht vorstellen, dem Kunden zu erklären, dass der Benutzer Supportanfragen twittern könnte, anstatt sie per E-Mail zu versenden.
Kevin Galligan
1
+1111111 Dies verdient endlose +1, damit andere dies sehen können. Ich habe diesen Teil verpasst und musste mich eine Weile mit diesem Problem befassen!
ChallengeAccepted
89
Ich benutze dies seit langer Zeit und es scheint gut, dass keine Nicht-E-Mail-Apps angezeigt werden. Nur eine andere Möglichkeit, eine E-Mail-Absicht zu senden:
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);
Nicht unterstützte Aktion: Diese Aktion wird derzeit nicht unterstützt
erdomester
4
lgor G-> plz wechselt von setType "(plain / text") zu setType ("text / plain")
sachit
2
.setType ("message / rfc822") nicht text / plain
Der hungrige Androider
1
Dieser Code wird E-Mail-Absicht öffnen? Wie kann ich eine E-Mail senden, ohne dem Benutzer @yuku die Absicht zu zeigen? Ich möchte ein Passwort an die E-Mail senden
Ich habe etwas in Anlehnung an die aktuell akzeptierte Antwort verwendet, um E-Mails mit einer angehängten binären Fehlerprotokolldatei zu senden. GMail und K-9 senden es einwandfrei und es kommt auch einwandfrei auf meinem Mailserver an. Das einzige Problem war mein Mail-Client der Wahl Thunderbird, der Probleme beim Öffnen / Speichern der angehängten Protokolldatei hatte. Tatsächlich hat es die Datei einfach überhaupt nicht gespeichert, ohne sich zu beschweren.
Ich habe mir einen der Quellcodes dieser Mail angesehen und festgestellt, dass der Protokolldateianhang (verständlicherweise) den MIME-Typ hat message/rfc822. Natürlich ist dieser Anhang keine angehängte E-Mail. Aber Thunderbird kann diesen winzigen Fehler nicht anmutig bewältigen. Das war also eine Art Mist.
Nach ein wenig Recherche und Experimentieren habe ich die folgende Lösung gefunden:
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"));
Wie Sie sehen können, kann die Methode createEmailOnlyChooserIntent problemlos mit der richtigen Absicht und dem richtigen MIME-Typ eingegeben werden.
Anschließend wird die Liste der verfügbaren Aktivitäten durchgearbeitet, die auf eine ACTION_SENDTO- mailtoProtokollabsicht reagieren (bei der es sich nur um E-Mail-Apps handelt), und eine Auswahl basierend auf dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Absicht mit dem richtigen MIME-Typ erstellt.
Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt ist (was zufällig auf den MIME-Typ rfc822 reagiert).
Ich habe gerade Ihr Code-Snippet eingefügt und es funktioniert gut. Bevor Apps wie Google Drive, Skype usw. aufgelistet wurden. Gibt es jedoch keine Möglichkeit, eine E-Mail aus der Anwendung zu senden, ohne eine andere Anwendung aufzurufen? Ich habe gerade den Artikel über den E-Mail-Client gelesen, den @Rene oben postet, aber er scheint zu kompliziert zu sein, um nur eine einfache E-Mail zu senden
Alex Cio
Hervorragende Antwort. Ich hatte auch Skype und Google Drive ACTION_SENDund das macht es wunderbar.
Darrenp
1
Die oben genannte beliebteste Lösung gibt auch Skype und Vkontakte zurück. Diese Lösung ist besser.
Denis Kutlubaev
Was ist CrashLogFile? Wo wurde es initialisiert? Bitte angeben
Noufal
@ Noufal Dies ist nur ein Rest meiner eigenen Codebasis. Es ist eine FileInstanz, die auf eine Absturzprotokolldatei verweist, die meine Android-Apps im Hintergrund erstellen, falls es eine nicht erfasste Ausnahme gab. Dieses Beispiel soll nur veranschaulichen, wie ein E-Mail-Anhang hinzugefügt wird. Sie können auch jede andere Datei aus dem externen Speicher anhängen (z. B. ein Image). Sie können diese Zeile auch mit entfernen, crashLogFileum ein funktionierendes Beispiel zu erhalten.
Tiguchi
37
Um E-Mail-Apps einfach zuzulassen , um Ihre Absicht zu lösen, müssen Sie ACTION_SENDTO als Aktion und mailto als Daten angeben.
Das wichtigste ist die Flagge: es ist ACTION_SENDTOund nichtACTION_SEND
Die andere wichtige Linie ist
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
Übrigens, wenn Sie ein leeres senden Extra, if()funktioniert das am Ende nicht und die App startet den E-Mail-Client nicht.
Laut Android-Dokumentation. Wenn Sie sicherstellen möchten, dass Ihre Absicht nur von einer E-Mail-App (und nicht von anderen Textnachrichten oder sozialen Apps) verarbeitet wird, verwenden Sie die ACTION_SENDTOAktion und fügen Sie das mailto:Datenschema " " hinzu. Zum Beispiel:
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);}}
Die Strategie, Apps zu verwenden .setType("message/rfc822")oder ACTION_SENDzu passen, die keine E-Mail-Clients sind, wie Android Beam und Bluetooth .
Die Verwendung von ACTION_SENDTOund eines mailto:URI scheint einwandfrei zu funktionieren und wird in der Entwicklerdokumentation empfohlen . Wenn Sie dies jedoch auf den offiziellen Emulatoren tun und keine E-Mail-Konten eingerichtet sind (oder keine E-Mail-Clients vorhanden sind), wird die folgende Fehlermeldung angezeigt:
Wenn Sie möchten, dass Ihre App dies umgeht, damit es auch auf den offiziellen Emulatoren ordnungsgemäß funktioniert, können Sie dies überprüfen, bevor Sie versuchen, die E-Mail zu senden:
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();}
Das Senden von E-Mails kann mit Absichten erfolgen, für die keine Konfiguration erforderlich ist. Dann ist jedoch eine Benutzerinteraktion erforderlich, und das Layout ist etwas eingeschränkt.
Um eine komplexere E-Mail ohne Benutzerinteraktion zu erstellen und zu senden, müssen Sie Ihren eigenen Client erstellen. Das erste ist, dass die Sun Java-API für E-Mails nicht verfügbar ist. Ich hatte Erfolg damit, die Apache Mime4j-Bibliothek zum Erstellen von E-Mails zu nutzen. Alles basierend auf den Dokumenten bei nilvec .
Hier ist der Beispielarbeitscode, der die E-Mail-Anwendung auf dem Android-Gerät öffnet und automatisch mit An Adresse und Betreff in der verfassten E-Mail gefüllt wird .
Vielen Dank. Im Vergleich zu einer Lösung von @Avi Parshan setzen Sie eine E-Mail ein setData()und Avi setzt ein putExtra(). Beide Varianten funktionieren. Aber wenn nur entfernen setDataund verwenden intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});, würde es eine geben ActivityNotFoundException.
CoolMind
5
Ich verwende den folgenden Code in meinen Apps. Dies zeigt genau E-Mail-Client-Apps wie Google Mail.
Schöne Lösung! Es werden viele ungeeignete Anwendungen vermieden (meistens als "Teilen" verwendet). Fügen Sie intent.type = "message/rfc822"; intent.type = "text/html";hier nicht hinzu , da dies zu Ausnahmen führen kann.
Diese Funktion leitet zuerst Absichts-Google Mail zum Senden von E-Mails. Wenn Google Mail nicht gefunden wird, fördern Sie die Absichtsauswahl. Ich habe diese Funktion in vielen kommerziellen Apps verwendet und sie funktioniert einwandfrei. Hoffe es wird dir helfen:
Wie ist das besser als die Antworten, die es bereits gab, als Sie dies gepostet haben? Es sieht aus wie eine Kopie der akzeptierten Antwort, die in eine Aktivität eingeschlossen ist.
@ PedroVarela können wir immer überprüfen, Aktivität nicht Ausnahme gefunden.
Silentsudo
1
Ja wir können. Aber Ihre Lösung ist nicht die richtige. In der Android-Dokumentation wird klar angegeben, was Sie tun müssen, um nur E-Mail-Apps in der Absichtsauswahl anzuzeigen. Sie haben geschrieben "Angenommen, auf dem größten Teil des Android-Geräts ist die Google Mail-App bereits installiert"; Was ist, wenn es sich um ein gerootetes Gerät handelt und der Benutzer den Google Mail-Client löscht? Angenommen, Sie erstellen Ihre eigene E-Mail-App. Wenn ein Benutzer eine E-Mail senden möchte, wird Ihre App nicht in dieser Liste aufgeführt. Was passiert, wenn Google Mail den Paketnamen ändert? Wirst du deine App aktualisieren?
/**
* 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}
Der obige Code öffnet den bevorzugten E-Mail-Client des Benutzers, der mit der E-Mail gefüllt ist, die zum Senden bereit ist.
Antworten:
Der beste (und einfachste) Weg ist die Verwendung eines
Intent
:Andernfalls müssen Sie Ihren eigenen Client schreiben.
quelle
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Verwenden Sie
.setType("message/rfc822")
oder die Auswahl zeigt Ihnen alle (vielen) Anwendungen, die die Sendeabsicht unterstützen.quelle
message/rfc822
Ich benutze dies seit langer Zeit und es scheint gut, dass keine Nicht-E-Mail-Apps angezeigt werden. Nur eine andere Möglichkeit, eine E-Mail-Absicht zu senden:
quelle
Ich habe etwas in Anlehnung an die aktuell akzeptierte Antwort verwendet, um E-Mails mit einer angehängten binären Fehlerprotokolldatei zu senden. GMail und K-9 senden es einwandfrei und es kommt auch einwandfrei auf meinem Mailserver an. Das einzige Problem war mein Mail-Client der Wahl Thunderbird, der Probleme beim Öffnen / Speichern der angehängten Protokolldatei hatte. Tatsächlich hat es die Datei einfach überhaupt nicht gespeichert, ohne sich zu beschweren.
Ich habe mir einen der Quellcodes dieser Mail angesehen und festgestellt, dass der Protokolldateianhang (verständlicherweise) den MIME-Typ hat
message/rfc822
. Natürlich ist dieser Anhang keine angehängte E-Mail. Aber Thunderbird kann diesen winzigen Fehler nicht anmutig bewältigen. Das war also eine Art Mist.Nach ein wenig Recherche und Experimentieren habe ich die folgende Lösung gefunden:
Es kann wie folgt verwendet werden:
Wie Sie sehen können, kann die Methode createEmailOnlyChooserIntent problemlos mit der richtigen Absicht und dem richtigen MIME-Typ eingegeben werden.
Anschließend wird die Liste der verfügbaren Aktivitäten durchgearbeitet, die auf eine ACTION_SENDTO-
mailto
Protokollabsicht reagieren (bei der es sich nur um E-Mail-Apps handelt), und eine Auswahl basierend auf dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Absicht mit dem richtigen MIME-Typ erstellt.Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt ist (was zufällig auf den MIME-Typ rfc822 reagiert).
quelle
ACTION_SEND
und das macht es wunderbar.File
Instanz, die auf eine Absturzprotokolldatei verweist, die meine Android-Apps im Hintergrund erstellen, falls es eine nicht erfasste Ausnahme gab. Dieses Beispiel soll nur veranschaulichen, wie ein E-Mail-Anhang hinzugefügt wird. Sie können auch jede andere Datei aus dem externen Speicher anhängen (z. B. ein Image). Sie können diese Zeile auch mit entfernen,crashLogFile
um ein funktionierendes Beispiel zu erhalten.Um E-Mail-Apps einfach zuzulassen , um Ihre Absicht zu lösen, müssen Sie ACTION_SENDTO als Aktion und mailto als Daten angeben.
quelle
Ich habe dieses Problem mit einfachen Codezeilen gelöst, wie in der Android-Dokumentation erläutert.
( https://developer.android.com/guide/components/intents-common.html#Email )
Das wichtigste ist die Flagge: es ist
ACTION_SENDTO
und nichtACTION_SEND
Die andere wichtige Linie ist
Übrigens, wenn Sie ein leeres senden
Extra
,if()
funktioniert das am Ende nicht und die App startet den E-Mail-Client nicht.Laut Android-Dokumentation. Wenn Sie sicherstellen möchten, dass Ihre Absicht nur von einer E-Mail-App (und nicht von anderen Textnachrichten oder sozialen Apps) verarbeitet wird, verwenden Sie die
ACTION_SENDTO
Aktion und fügen Sie dasmailto:
Datenschema " " hinzu. Zum Beispiel:quelle
Die Strategie, Apps zu verwenden
.setType("message/rfc822")
oderACTION_SEND
zu passen, die keine E-Mail-Clients sind, wie Android Beam und Bluetooth .Die Verwendung von
ACTION_SENDTO
und einesmailto:
URI scheint einwandfrei zu funktionieren und wird in der Entwicklerdokumentation empfohlen . Wenn Sie dies jedoch auf den offiziellen Emulatoren tun und keine E-Mail-Konten eingerichtet sind (oder keine E-Mail-Clients vorhanden sind), wird die folgende Fehlermeldung angezeigt:Wie nachfolgend dargestellt:
Es stellt sich heraus, dass die Emulatoren die Absicht in eine aufgerufene Aktivität auflösen
com.android.fallback.Fallback
, die die obige Meldung anzeigt. Anscheinend ist dies beabsichtigt.Wenn Sie möchten, dass Ihre App dies umgeht, damit es auch auf den offiziellen Emulatoren ordnungsgemäß funktioniert, können Sie dies überprüfen, bevor Sie versuchen, die E-Mail zu senden:
Weitere Informationen finden Sie in der Entwicklerdokumentation .
quelle
Das Senden von E-Mails kann mit Absichten erfolgen, für die keine Konfiguration erforderlich ist. Dann ist jedoch eine Benutzerinteraktion erforderlich, und das Layout ist etwas eingeschränkt.
Um eine komplexere E-Mail ohne Benutzerinteraktion zu erstellen und zu senden, müssen Sie Ihren eigenen Client erstellen. Das erste ist, dass die Sun Java-API für E-Mails nicht verfügbar ist. Ich hatte Erfolg damit, die Apache Mime4j-Bibliothek zum Erstellen von E-Mails zu nutzen. Alles basierend auf den Dokumenten bei nilvec .
quelle
Hier ist der Beispielarbeitscode, der die E-Mail-Anwendung auf dem Android-Gerät öffnet und automatisch mit An Adresse und Betreff in der verfassten E-Mail gefüllt wird .
quelle
setData()
und Avi setzt einputExtra()
. Beide Varianten funktionieren. Aber wenn nur entfernensetData
und verwendenintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
, würde es eine gebenActivityNotFoundException
.Ich verwende den folgenden Code in meinen Apps. Dies zeigt genau E-Mail-Client-Apps wie Google Mail.
quelle
Dies zeigt Ihnen nur die E-Mail-Clients (sowie PayPal aus einem unbekannten Grund).
quelle
intent.type = "message/rfc822"; intent.type = "text/html";
hier nicht hinzu , da dies zu Ausnahmen führen kann.So habe ich es gemacht. Schön und einfach.
quelle
Diese Funktion leitet zuerst Absichts-Google Mail zum Senden von E-Mails. Wenn Google Mail nicht gefunden wird, fördern Sie die Absichtsauswahl. Ich habe diese Funktion in vielen kommerziellen Apps verwendet und sie funktioniert einwandfrei. Hoffe es wird dir helfen:
quelle
versuchen Sie es einfach
quelle
Andere Lösung kann sein
Angenommen, auf dem größten Teil des Android-Geräts ist die GMail-App bereits installiert.
quelle
Verwenden Sie dies zum Senden von E-Mails ...
benutze Build Gradle:
quelle
Ich habe diesen Code zum Senden von E-Mails verwendet, indem ich den Standardabschnitt zum Erstellen von E-Mail-Apps direkt gestartet habe.
quelle
Diese Methode funktioniert bei mir. Es öffnet die Google Mail-App (falls installiert) und setzt mailto.
quelle
quelle
quelle
Versuche dies:
Der obige Code öffnet den bevorzugten E-Mail-Client des Benutzers, der mit der E-Mail gefüllt ist, die zum Senden bereit ist.
Quelle
quelle