Najlepszym (i najłatwiejszym) sposobem jest użycie 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();}
W przeciwnym razie będziesz musiał napisać własnego klienta.
W powyższym kodzie nie ma identyfikatora e-mail nadawcy. W jaki sposób wiadomość zostanie wysłana?
KIRAN KJ
38
KIRAN: Musisz zrozumieć, jak działają intencje, aby to zrozumieć. Zasadniczo otworzy aplikację e-mail z odbiorcą, tematem i treścią już wypełnionymi. Wysyłanie wiadomości zależy od aplikacji e-mail.
Jeremy Logan,
8
Wiadomość e-mail nie pojawia się w polu „DO” po rozpoczęciu działania. ktokolwiek wie?
Hamza Waqas
11
wielki wkład tego komentarza to: wiadomość / rfc822
Guilherme Oliveira
22
dodaj te, aby mieć pewność, że selektor wyświetla tylko aplikacje e-mail: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris,
194
Użyj .setType("message/rfc822")lub selektor pokaże wszystkie (wiele) aplikacji, które obsługują zamiar wysyłania.
Fajnie, to powinno mieć więcej głosów w górę. Nie zauważysz testowania na emulatorze, ale kiedy prześlesz „tekst / zwykły” na prawdziwym urządzeniu, otrzymasz listę ponad 15 aplikacji !! więc zdecydowanie zaleca się „wiadomość / rfc822” (standard e-mail).
Blundell,
7
@Blundell cześć, ale nie zauważyłem żadnej różnicy po zmianie namessage/rfc822
zremisowałem
2
Czy możesz usunąć bluetooth z listy? To również pojawia się w przypadku tego typu. +1 jednak, fajna sztuczka!
ingh.am
4
Uratowałem nasz bekon. Nie wyobrażam sobie, by wyjaśniać klientowi, że użytkownik może tweetować żądania pomocy technicznej zamiast wysyłać je pocztą elektroniczną.
Kevin Galligan
1
+1111111 Zasługuje na nieskończone +1, aby inni mogli to zobaczyć. Brakowało mi tej części i przez jakiś czas musiałem sobie z tym poradzić!
Wyzwanie
89
Używam tego od dawna i wydaje się to dobre, nie pojawiają się żadne aplikacje inne niż e-mail. Kolejny sposób wysłania zamiaru wysłania e-maila:
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);
Użyłem czegoś podobnego do obecnie akceptowanej odpowiedzi, aby wysłać e-maile z dołączonym plikiem dziennika błędów binarnych. GMail i K-9 wysyłają to dobrze, a także trafia dobrze na mój serwer pocztowy. Jedynym problemem był mój klient poczty Thunderbird, który miał problemy z otwieraniem / zapisywaniem załączonego pliku dziennika. W rzeczywistości po prostu nie zapisał pliku bez narzekań.
Spojrzałem na jeden z tych kodów źródłowych poczty i zauważyłem, że załącznik pliku dziennika ma (co zrozumiałe) typ MIME message/rfc822. Oczywiście ten załącznik nie jest załączonym adresem e-mail. Ale Thunderbird nie potrafi z wdziękiem poradzić sobie z tym drobnym błędem. To było trochę kłopotliwe.
Po kilku badaniach i eksperymentach wymyśliłem następujące rozwiązanie:
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"));
Jak widać, metodę createEmailOnlyChooserIntent można łatwo podać z prawidłową intencją i odpowiednim typem MIME.
Następnie przechodzi przez listę dostępnych działań, które odpowiadają celom mailtoprotokołu ACTION_SENDTO (które są tylko aplikacjami e-mail) i konstruuje selektor na podstawie tej listy działań i pierwotnego celu ACTION_SEND z odpowiednim typem MIME.
Kolejną zaletą jest to, że Skype nie jest już wymieniony na liście (co dzieje się w odpowiedzi na typ MIME rfc822).
właśnie wstawiłem fragment kodu i działa dobrze. Zanim pojawiły się na liście aplikacje, takie jak Dysk Google, Skype itp. Ale czy nie ma sposobu, aby wysłać pocztę z aplikacji bez wywoływania innej aplikacji? Właśnie przeczytałem artykuł o kliencie e-mail, który post @Rene powyżej, ale wydaje się być zbyt skomplikowany, aby wysłać zwykłą wiadomość e
Alex Cio
Doskonała odpowiedź. Wymyśliłem też Skype'a i Dysk Google, ACTION_SENDco pięknie to rozwiązuje.
darrenp
1
Najpopularniejsze powyższe rozwiązanie zwraca również Skype i Vkontakte. To rozwiązanie jest lepsze.
Denis Kutlubaev
co to jest crashLogFile? gdzie się zainicjował? pease sepecify
Noufal
@Noufal To tylko część z mojej własnej bazy kodu. Jest to Fileinstancja wskazująca na plik dziennika awarii, który moje aplikacje na Androida tworzą w tle na wypadek, gdyby wystąpił wyjątek. Ten przykład powinien tylko zilustrować sposób dodawania załącznika e-mail. Możesz także dołączyć dowolny inny plik z pamięci zewnętrznej (na przykład obraz). Możesz również usunąć tę linię za pomocą crashLogFile, aby uzyskać działający przykład.
tiguchi
37
Do PO PROSTU POZWALIĆ APLIKACJOM E-MAIL, aby rozwiązać Twój zamiar, musisz określić ACTION_SENDTO jako Działanie i mailto jako Dane.
Najważniejsza jest flaga: jest ACTION_SENDTOi nie jestACTION_SEND
Drugą ważną linią jest
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
Nawiasem mówiąc, jeśli wyślesz pusty Extra,if() na końcu nie będzie działać, a aplikacja nie uruchomi klienta poczty e-mail.
Według dokumentacji Androida. Jeśli chcesz mieć pewność, że twoje zamiary są obsługiwane tylko przez aplikację e-mail (a nie inne wiadomości tekstowe lub aplikacje społecznościowe), użyj ACTION_SENDTOakcji i dołącz mailto:schemat danych. Na przykład:
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);}}
Strategia używania .setType("message/rfc822")lub ACTION_SENDwydaje się pasować również do aplikacji, które nie są klientami poczty e-mail, takich jak Android Beam i Bluetooth .
Użycie ACTION_SENDTOi mailto:identyfikator URI wydaje się działać idealnie i jest zalecane w dokumentacji dla programistów . Jeśli jednak zrobisz to na oficjalnych emulatorach i nie ma żadnych skonfigurowanych kont e-mail (lub nie ma żadnych klientów poczty), pojawi się następujący błąd:
Jeśli chcesz, aby Twoja aplikacja to obchodziła, aby działała poprawnie również w oficjalnych emulatorach, możesz to sprawdzić przed próbą wysłania wiadomości 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();}
Wysyłanie wiadomości e-mail może odbywać się przy użyciu zamiarów, które nie wymagają konfiguracji. Ale wtedy będzie to wymagało interakcji użytkownika, a układ będzie nieco ograniczony.
Budowanie i wysyłanie bardziej złożonych wiadomości e-mail bez interakcji użytkownika wiąże się z budowaniem własnego klienta. Pierwszą rzeczą jest to, że Sun Java API dla poczty e-mail jest niedostępny. Odniosłem sukces wykorzystując bibliotekę Apache Mime4j do tworzenia wiadomości e-mail. Wszystko oparte na dokumentacji w Nilvec .
Oto przykładowy działający kod, który otwiera aplikację pocztową na urządzeniu z Androidem i automatycznie wypełnia adres Do oraz Temat w tworzonej wiadomości.
Dzięki. Porównując z rozwiązaniem @Avi Parshan, ustawiasz wiadomość e-mail setData(), a Avi włącza się putExtra(). Oba warianty działają. Ale jeśli usuniesz setDatai użyjesz tylko intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});, będzie ActivityNotFoundException.
CoolMind 16.04.18
5
Używam poniższy kod w moich aplikacjach. To pokazuje dokładnie aplikacje klienckie, takie jak Gmail.
Fajne rozwiązanie! Pozwala to uniknąć wielu nieodpowiednich aplikacji (najczęściej używanych jako „Udostępnij”). Nie dodawaj intent.type = "message/rfc822"; intent.type = "text/html";tutaj, ponieważ spowoduje to wyjątek.
Ta funkcja jest pierwszym bezpośrednim zamiarem Gmaila do wysyłania wiadomości e-mail, jeśli Gmail nie zostanie znaleziony, promuj wybór zamiaru. Użyłem tej funkcji w wielu aplikacjach komercyjnych i działa dobrze. Mam nadzieję, że pomoże ci to:
@PedroVarela zawsze możemy sprawdzić aktywność, nie znaleziono wyjątku.
silentsudo
1
Tak możemy. Ale twoje rozwiązanie nie jest właściwe. Dokumentacja Androida jasno określa, co musisz zrobić, aby wyświetlić tylko aplikacje pocztowe w wybranym narzędziu. Napisałeś „Zakładając, że większość urządzeń z Androidem ma już zainstalowaną aplikację Gmail”; Co jeśli jest to zrootowane urządzenie, a użytkownik usuwa klienta Gmaila ?. Załóżmy, że tworzysz własną aplikację e-mail ?, jeśli użytkownik zamierza wysłać wiadomość e-mail, aplikacji nie będzie na tej liście. Co się stanie, jeśli Gmail zmieni nazwę pakietu? Czy zamierzasz zaktualizować swoją aplikację?
/**
* 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}
Powyższy kod otworzy ulubionego klienta poczty e-mail wypełnionego e-mailem gotowym do wysłania.
Odpowiedzi:
Najlepszym (i najłatwiejszym) sposobem jest użycie
Intent
:W przeciwnym razie będziesz musiał napisać własnego klienta.
źródło
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Użyj
.setType("message/rfc822")
lub selektor pokaże wszystkie (wiele) aplikacji, które obsługują zamiar wysyłania.źródło
message/rfc822
Używam tego od dawna i wydaje się to dobre, nie pojawiają się żadne aplikacje inne niż e-mail. Kolejny sposób wysłania zamiaru wysłania e-maila:
źródło
Użyłem czegoś podobnego do obecnie akceptowanej odpowiedzi, aby wysłać e-maile z dołączonym plikiem dziennika błędów binarnych. GMail i K-9 wysyłają to dobrze, a także trafia dobrze na mój serwer pocztowy. Jedynym problemem był mój klient poczty Thunderbird, który miał problemy z otwieraniem / zapisywaniem załączonego pliku dziennika. W rzeczywistości po prostu nie zapisał pliku bez narzekań.
Spojrzałem na jeden z tych kodów źródłowych poczty i zauważyłem, że załącznik pliku dziennika ma (co zrozumiałe) typ MIME
message/rfc822
. Oczywiście ten załącznik nie jest załączonym adresem e-mail. Ale Thunderbird nie potrafi z wdziękiem poradzić sobie z tym drobnym błędem. To było trochę kłopotliwe.Po kilku badaniach i eksperymentach wymyśliłem następujące rozwiązanie:
Można go używać w następujący sposób:
Jak widać, metodę createEmailOnlyChooserIntent można łatwo podać z prawidłową intencją i odpowiednim typem MIME.
Następnie przechodzi przez listę dostępnych działań, które odpowiadają celom
mailto
protokołu ACTION_SENDTO (które są tylko aplikacjami e-mail) i konstruuje selektor na podstawie tej listy działań i pierwotnego celu ACTION_SEND z odpowiednim typem MIME.Kolejną zaletą jest to, że Skype nie jest już wymieniony na liście (co dzieje się w odpowiedzi na typ MIME rfc822).
źródło
ACTION_SEND
co pięknie to rozwiązuje.File
instancja wskazująca na plik dziennika awarii, który moje aplikacje na Androida tworzą w tle na wypadek, gdyby wystąpił wyjątek. Ten przykład powinien tylko zilustrować sposób dodawania załącznika e-mail. Możesz także dołączyć dowolny inny plik z pamięci zewnętrznej (na przykład obraz). Możesz również usunąć tę linię za pomocącrashLogFile
, aby uzyskać działający przykład.Do PO PROSTU POZWALIĆ APLIKACJOM E-MAIL, aby rozwiązać Twój zamiar, musisz określić ACTION_SENDTO jako Działanie i mailto jako Dane.
źródło
Rozwiązałem ten problem za pomocą prostych wierszy kodu, jak wyjaśnia dokumentacja Androida.
( https://developer.android.com/guide/components/intents-common.html#Email )
Najważniejsza jest flaga: jest
ACTION_SENDTO
i nie jestACTION_SEND
Drugą ważną linią jest
Nawiasem mówiąc, jeśli wyślesz pusty
Extra
,if()
na końcu nie będzie działać, a aplikacja nie uruchomi klienta poczty e-mail.Według dokumentacji Androida. Jeśli chcesz mieć pewność, że twoje zamiary są obsługiwane tylko przez aplikację e-mail (a nie inne wiadomości tekstowe lub aplikacje społecznościowe), użyj
ACTION_SENDTO
akcji i dołączmailto:
schemat danych. Na przykład:źródło
Strategia używania
.setType("message/rfc822")
lubACTION_SEND
wydaje się pasować również do aplikacji, które nie są klientami poczty e-mail, takich jak Android Beam i Bluetooth .Użycie
ACTION_SENDTO
imailto:
identyfikator URI wydaje się działać idealnie i jest zalecane w dokumentacji dla programistów . Jeśli jednak zrobisz to na oficjalnych emulatorach i nie ma żadnych skonfigurowanych kont e-mail (lub nie ma żadnych klientów poczty), pojawi się następujący błąd:Jak pokazano niżej:
Okazuje się, że emulatory rozwiązują zamiar wywołanej czynności
com.android.fallback.Fallback
, która wyświetla powyższy komunikat. Najwyraźniej jest to zgodne z projektem.Jeśli chcesz, aby Twoja aplikacja to obchodziła, aby działała poprawnie również w oficjalnych emulatorach, możesz to sprawdzić przed próbą wysłania wiadomości e-mail:
Znajdź więcej informacji w dokumentacji dla programistów .
źródło
Wysyłanie wiadomości e-mail może odbywać się przy użyciu zamiarów, które nie wymagają konfiguracji. Ale wtedy będzie to wymagało interakcji użytkownika, a układ będzie nieco ograniczony.
Budowanie i wysyłanie bardziej złożonych wiadomości e-mail bez interakcji użytkownika wiąże się z budowaniem własnego klienta. Pierwszą rzeczą jest to, że Sun Java API dla poczty e-mail jest niedostępny. Odniosłem sukces wykorzystując bibliotekę Apache Mime4j do tworzenia wiadomości e-mail. Wszystko oparte na dokumentacji w Nilvec .
źródło
Oto przykładowy działający kod, który otwiera aplikację pocztową na urządzeniu z Androidem i automatycznie wypełnia adres Do oraz Temat w tworzonej wiadomości.
źródło
setData()
, a Avi włącza sięputExtra()
. Oba warianty działają. Ale jeśli usunieszsetData
i użyjesz tylkointent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
, będzieActivityNotFoundException
.Używam poniższy kod w moich aplikacjach. To pokazuje dokładnie aplikacje klienckie, takie jak Gmail.
źródło
Spowoduje to wyświetlenie tylko klientów poczty e-mail (a także PayPal z nieznanego powodu)
źródło
intent.type = "message/rfc822"; intent.type = "text/html";
tutaj, ponieważ spowoduje to wyjątek.Tak to zrobiłem. Ładne i proste.
źródło
Ta funkcja jest pierwszym bezpośrednim zamiarem Gmaila do wysyłania wiadomości e-mail, jeśli Gmail nie zostanie znaleziony, promuj wybór zamiaru. Użyłem tej funkcji w wielu aplikacjach komercyjnych i działa dobrze. Mam nadzieję, że pomoże ci to:
źródło
po prostu spróbuj tego
źródło
Innym rozwiązaniem może być
Zakładając, że większość urządzeń z Androidem ma już zainstalowaną aplikację GMail.
źródło
Użyj tego do wysłania e-maila ...
użyj stopnia kompilacji:
źródło
Użyłem tego kodu, aby wysłać pocztę, bezpośrednio uruchamiając domyślną sekcję tworzenia aplikacji poczty.
źródło
Ta metoda działa dla mnie. Otwiera aplikację Gmail (jeśli jest zainstalowana) i ustawia mailto.
źródło
źródło
źródło
Spróbuj tego:
Powyższy kod otworzy ulubionego klienta poczty e-mail wypełnionego e-mailem gotowym do wysłania.
Źródło
źródło