Cara terbaik (dan termudah) adalah menggunakan 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();}
Kalau tidak, Anda harus menulis klien Anda sendiri.
Dalam kode di atas, tidak ada id email pengirim. Lalu bagaimana pesan dikirim?
KIRAN KJ
38
KIRAN: Anda harus melihat bagaimana Intents bekerja untuk memahami ini. Ini pada dasarnya akan membuka aplikasi email dengan penerima, subjek, dan tubuh sudah diisi. Terserah aplikasi email untuk melakukan pengiriman.
Jeremy Logan
8
Email tidak muncul di bidang "TO" dengan memulai aktivitas. ada yang tahu?
Hamza Waqas
11
kontribusi besar dari komentar ini adalah: message / rfc822
Guilherme Oliveira
22
tambahkan ini untuk memastikan bahwa pemilih hanya menampilkan aplikasi email: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris
194
Gunakan .setType("message/rfc822")atau pemilih akan menunjukkan kepada Anda semua (banyak) aplikasi yang mendukung maksud pengiriman.
Bagus, ini seharusnya memiliki lebih banyak suara tbh. Anda tidak akan melihat pengujian pada emulator, tetapi ketika Anda pergi untuk mengirim "teks / polos" pada perangkat nyata itu akan memberi Anda daftar 15+ aplikasi !! jadi "message / rfc822" pasti direkomendasikan (standar email).
Blundell
7
@ Blundell hai, tapi saya tidak melihat perbedaan setelah berubah kemessage/rfc822
menggambar
2
Bisakah Anda menghapus bluetooth dari daftar? Ini juga muncul dengan tipe ini. Namun 1, trik rapi!
ingh.am
4
Disimpan bacon kami. Tidak dapat membayangkan menjelaskan kepada klien bahwa pengguna dapat men-tweet permintaan dukungan daripada mengirim email kepada mereka.
Kevin Galligan
1
+1111111 Ini layak diberi +1 tanpa batas sehingga orang lain dapat melihat ini. Saya melewatkan bagian ini dan harus berurusan dengan masalah ini untuk sementara waktu!
ChallengeAccepted
89
Saya sudah menggunakan ini sejak lama dan sepertinya bagus, tidak ada aplikasi non-email yang muncul. Hanya cara lain untuk mengirim maksud kirim email:
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);
Tindakan yang tidak didukung: Tindakan ini saat ini tidak didukung
erdomester
4
lgor G-> plz ubah dari setType "(plain / text") ke setType ("text / plain")
sachit
2
.setType ("message / rfc822") bukan teks / polos
The Hungry Androider
1
kode ini akankah saya membuka maksud email? bagaimana saya bisa mengirim email tanpa menunjukkan niat kepada pengguna @yuku saya ingin mengirim kata sandi ke email
Saya menggunakan sesuatu di sepanjang baris jawaban yang saat ini diterima untuk mengirim email dengan file log kesalahan biner terlampir. GMail dan K-9 mengirimkannya dengan baik dan itu juga diterima dengan baik di server email saya. Satu-satunya masalah adalah klien email pilihan saya Thunderbird yang memiliki masalah dengan membuka / menyimpan file log terlampir. Sebenarnya itu sama sekali tidak menyimpan file sama sekali tanpa mengeluh.
Saya melihat pada salah satu kode sumber email ini dan memperhatikan bahwa lampiran file log memiliki (dapat dimengerti) tipe mime. message/rfc822 . Tentu saja lampiran itu bukan email terlampir. Tapi Thunderbird tidak bisa mengatasi kesalahan kecil itu dengan anggun. Jadi itu agak mengecewakan.
Setelah sedikit meneliti dan bereksperimen saya menemukan solusi berikut:
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"));
Seperti yang Anda lihat, metode createEmailOnlyChooserIntent dapat dengan mudah dimasukkan dengan maksud yang benar dan tipe mime yang benar.
Itu kemudian pergi melalui daftar kegiatan yang tersedia yang menanggapi mailtomaksud protokol ACTION_SENDTO (yang hanya aplikasi email) dan membangun pemilih berdasarkan daftar kegiatan dan niat ACTION_SEND asli dengan jenis mime yang benar.
Keuntungan lain adalah Skype tidak terdaftar lagi (yang terjadi untuk menanggapi tipe mime rfc822).
saya baru saja memasukkan cuplikan kode Anda dan berfungsi dengan baik. Sebelum ada aplikasi terdaftar seperti Google Drive, Skype dll. Tapi tidak adakah cara untuk mengirim email dari aplikasi tanpa memanggil aplikasi lain? Saya baru saja membaca artikel tentang klien email yang diposkan @Rene di atas tetapi tampaknya terlalu rumit untuk hanya mengirim email sederhana
Alex Cio
Jawaban yang sangat bagus. Saya memiliki Skype dan Google Drive yang muncul ACTION_SENDjuga dan ini bisa diselesaikan dengan indah.
darrenp
1
Solusi paling populer di atas mengembalikan Skype dan Vkontakte juga. Solusi ini lebih baik.
Denis Kutlubaev
apa itu crashLogFile? di mana itu diinisialisasi? pease sepecify
Noufal
@Noufal Ini hanyalah sisa dari basis kode saya sendiri. Ini adalah Filecontoh yang menunjuk ke file log kerusakan yang dibuat aplikasi Android saya di latar belakang jika ada pengecualian yang tidak tertangkap. Contoh itu seharusnya hanya menggambarkan cara menambahkan lampiran email. Anda juga dapat melampirkan file lain dari penyimpanan eksternal (gambar misalnya). Anda juga dapat menghapus baris itu crashLogFileuntuk mendapatkan contoh yang berfungsi.
tiguchi
37
Untuk HANYA BIARKAN EMAIL APPS untuk menyelesaikan maksud Anda, Anda perlu menentukan ACTION_SENDTO sebagai Tindakan dan mengirimkannya ke Data.
Yang paling penting adalah bendera: itu adalah ACTION_SENDTO, dan bukanACTION_SEND
Baris penting lainnya adalah
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
By the way, jika Anda mengirim yang kosong Extra, if()pada akhirnya tidak akan berfungsi dan aplikasi tidak akan meluncurkan klien email.
Menurut dokumentasi Android. Jika Anda ingin memastikan bahwa maksud Anda hanya ditangani oleh aplikasi email (dan bukan aplikasi pesan teks atau sosial lainnya), maka gunakan ACTION_SENDTOtindakan dan sertakan mailto:skema data " ". Sebagai contoh:
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);}}
Strategi menggunakan .setType("message/rfc822")atau ACTION_SENDtampaknya juga cocok dengan aplikasi yang bukan klien email, seperti Android Beam dan Bluetooth .
Penggunaan ACTION_SENDTOdan mailto:URI tampaknya berfungsi dengan baik, dan direkomendasikan dalam dokumentasi pengembang . Namun, jika Anda melakukan ini pada emulator resmi dan tidak ada akun email yang disiapkan (atau tidak ada klien surat), Anda mendapatkan kesalahan berikut:
Jika Anda ingin aplikasi Anda mengelak dari ini sehingga juga berfungsi dengan baik pada emulator resmi, Anda dapat memeriksanya sebelum mencoba mengirim email:
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();}
Mengirim email dapat dilakukan dengan Intents yang tidak memerlukan konfigurasi. Tetapi kemudian akan membutuhkan interaksi pengguna dan tata letak akan sedikit dibatasi.
Membangun dan mengirim email yang lebih kompleks tanpa interaksi pengguna memerlukan membangun klien Anda sendiri. Hal pertama adalah bahwa API Java Java untuk email tidak tersedia. Saya telah berhasil memanfaatkan perpustakaan Apache Mime4j untuk membangun email. Semua berdasarkan pada dokumen di nilvec .
Berikut adalah contoh kode kerja yang membuka aplikasi email di perangkat android dan diisi otomatis dengan Ke alamat dan Subjek dalam email penulisan.
Terima kasih. Dibandingkan dengan solusi @Avi Parshan, Anda menyetel email masuk setData(), dan Avi masuk putExtra(). Kedua varian ini berfungsi. Tetapi jika menghapus setDatadan menggunakan saja intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});, akan ada ActivityNotFoundException.
CoolMind
5
Saya menggunakan kode di bawah ini di aplikasi saya. Ini menunjukkan persis aplikasi klien email, seperti Gmail.
Solusi bagus! Ini menghindari banyak aplikasi yang tidak cocok (kebanyakan digunakan sebagai "Bagikan"). Jangan tambahkan di intent.type = "message/rfc822"; intent.type = "text/html";sini karena akan menyebabkan pengecualian.
CoolMind
3
Beginilah cara saya melakukannya. Bagus dan sederhana.
Fungsi ini terlebih dahulu mengarahkan maksud gmail untuk mengirim email, jika gmail tidak ditemukan maka promosikan pemilih maksud. Saya menggunakan fungsi ini di banyak aplikasi komersial dan berfungsi dengan baik. Semoga ini akan membantu Anda:
Bagaimana ini lebih baik daripada jawaban yang sudah ada ketika Anda memposting ini? Itu hanya terlihat seperti salinan dari jawaban yang diterima yang dibungkus dalam suatu kegiatan.
@PedroVarela kita selalu dapat memeriksa aktivitas tidak ditemukan pengecualian.
silentsudo
1
Ya kita bisa. Tetapi solusi Anda bukanlah yang tepat. Dokumentasi Android menyatakan dengan jelas apa yang harus Anda lakukan untuk hanya menampilkan aplikasi email di pemilih maksud. Anda menulis "Dengan asumsi sebagian besar perangkat android sudah menginstal aplikasi Gmail"; Bagaimana jika itu adalah perangkat yang di-rooting dan pengguna menghapus klien Gmail ?. Misalkan Anda membuat aplikasi email sendiri ?, jika pengguna akan mengirim email, aplikasi Anda tidak akan ada dalam daftar itu. Apa yang terjadi jika gmail mengubah nama paket? Apakah Anda akan memperbarui aplikasi Anda?
/**
* 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}
Kode di atas akan membuka klien email favorit pengguna yang diawali dengan email yang siap dikirim.
Jawaban:
Cara terbaik (dan termudah) adalah menggunakan
Intent
:Kalau tidak, Anda harus menulis klien Anda sendiri.
sumber
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Gunakan
.setType("message/rfc822")
atau pemilih akan menunjukkan kepada Anda semua (banyak) aplikasi yang mendukung maksud pengiriman.sumber
message/rfc822
Saya sudah menggunakan ini sejak lama dan sepertinya bagus, tidak ada aplikasi non-email yang muncul. Hanya cara lain untuk mengirim maksud kirim email:
sumber
Saya menggunakan sesuatu di sepanjang baris jawaban yang saat ini diterima untuk mengirim email dengan file log kesalahan biner terlampir. GMail dan K-9 mengirimkannya dengan baik dan itu juga diterima dengan baik di server email saya. Satu-satunya masalah adalah klien email pilihan saya Thunderbird yang memiliki masalah dengan membuka / menyimpan file log terlampir. Sebenarnya itu sama sekali tidak menyimpan file sama sekali tanpa mengeluh.
Saya melihat pada salah satu kode sumber email ini dan memperhatikan bahwa lampiran file log memiliki (dapat dimengerti) tipe mime.
message/rfc822
. Tentu saja lampiran itu bukan email terlampir. Tapi Thunderbird tidak bisa mengatasi kesalahan kecil itu dengan anggun. Jadi itu agak mengecewakan.Setelah sedikit meneliti dan bereksperimen saya menemukan solusi berikut:
Dapat digunakan sebagai berikut:
Seperti yang Anda lihat, metode createEmailOnlyChooserIntent dapat dengan mudah dimasukkan dengan maksud yang benar dan tipe mime yang benar.
Itu kemudian pergi melalui daftar kegiatan yang tersedia yang menanggapi
mailto
maksud protokol ACTION_SENDTO (yang hanya aplikasi email) dan membangun pemilih berdasarkan daftar kegiatan dan niat ACTION_SEND asli dengan jenis mime yang benar.Keuntungan lain adalah Skype tidak terdaftar lagi (yang terjadi untuk menanggapi tipe mime rfc822).
sumber
ACTION_SEND
juga dan ini bisa diselesaikan dengan indah.File
contoh yang menunjuk ke file log kerusakan yang dibuat aplikasi Android saya di latar belakang jika ada pengecualian yang tidak tertangkap. Contoh itu seharusnya hanya menggambarkan cara menambahkan lampiran email. Anda juga dapat melampirkan file lain dari penyimpanan eksternal (gambar misalnya). Anda juga dapat menghapus baris itucrashLogFile
untuk mendapatkan contoh yang berfungsi.Untuk HANYA BIARKAN EMAIL APPS untuk menyelesaikan maksud Anda, Anda perlu menentukan ACTION_SENDTO sebagai Tindakan dan mengirimkannya ke Data.
sumber
Saya memecahkan masalah ini dengan baris kode sederhana seperti yang dijelaskan oleh dokumentasi android.
( https://developer.android.com/guide/components/intents-common.html#Email )
Yang paling penting adalah bendera: itu adalah
ACTION_SENDTO
, dan bukanACTION_SEND
Baris penting lainnya adalah
By the way, jika Anda mengirim yang kosong
Extra
,if()
pada akhirnya tidak akan berfungsi dan aplikasi tidak akan meluncurkan klien email.Menurut dokumentasi Android. Jika Anda ingin memastikan bahwa maksud Anda hanya ditangani oleh aplikasi email (dan bukan aplikasi pesan teks atau sosial lainnya), maka gunakan
ACTION_SENDTO
tindakan dan sertakanmailto:
skema data " ". Sebagai contoh:sumber
Strategi menggunakan
.setType("message/rfc822")
atauACTION_SEND
tampaknya juga cocok dengan aplikasi yang bukan klien email, seperti Android Beam dan Bluetooth .Penggunaan
ACTION_SENDTO
danmailto:
URI tampaknya berfungsi dengan baik, dan direkomendasikan dalam dokumentasi pengembang . Namun, jika Anda melakukan ini pada emulator resmi dan tidak ada akun email yang disiapkan (atau tidak ada klien surat), Anda mendapatkan kesalahan berikut:Seperti yang ditunjukkan di bawah ini:
Ternyata emulator menyelesaikan maksud untuk aktivitas yang disebut
com.android.fallback.Fallback
, yang menampilkan pesan di atas. Rupanya ini dengan desain.Jika Anda ingin aplikasi Anda mengelak dari ini sehingga juga berfungsi dengan baik pada emulator resmi, Anda dapat memeriksanya sebelum mencoba mengirim email:
Temukan info lebih lanjut dalam dokumentasi pengembang .
sumber
Mengirim email dapat dilakukan dengan Intents yang tidak memerlukan konfigurasi. Tetapi kemudian akan membutuhkan interaksi pengguna dan tata letak akan sedikit dibatasi.
Membangun dan mengirim email yang lebih kompleks tanpa interaksi pengguna memerlukan membangun klien Anda sendiri. Hal pertama adalah bahwa API Java Java untuk email tidak tersedia. Saya telah berhasil memanfaatkan perpustakaan Apache Mime4j untuk membangun email. Semua berdasarkan pada dokumen di nilvec .
sumber
Berikut adalah contoh kode kerja yang membuka aplikasi email di perangkat android dan diisi otomatis dengan Ke alamat dan Subjek dalam email penulisan.
sumber
setData()
, dan Avi masukputExtra()
. Kedua varian ini berfungsi. Tetapi jika menghapussetData
dan menggunakan sajaintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
, akan adaActivityNotFoundException
.Saya menggunakan kode di bawah ini di aplikasi saya. Ini menunjukkan persis aplikasi klien email, seperti Gmail.
sumber
Ini hanya akan menunjukkan kepada Anda klien email (dan juga PayPal karena alasan yang tidak diketahui)
sumber
intent.type = "message/rfc822"; intent.type = "text/html";
sini karena akan menyebabkan pengecualian.Beginilah cara saya melakukannya. Bagus dan sederhana.
sumber
Fungsi ini terlebih dahulu mengarahkan maksud gmail untuk mengirim email, jika gmail tidak ditemukan maka promosikan pemilih maksud. Saya menggunakan fungsi ini di banyak aplikasi komersial dan berfungsi dengan baik. Semoga ini akan membantu Anda:
sumber
sederhana coba yang ini
sumber
Solusi lain bisa jadi
Dengan asumsi sebagian besar perangkat android sudah menginstal aplikasi GMail.
sumber
Gunakan ini untuk mengirim email ...
gunakan build gradle:
sumber
Saya menggunakan kode ini untuk mengirim email dengan meluncurkan bagian penulisan aplikasi email langsung.
sumber
Metode ini bekerja untuk saya. Ini membuka aplikasi Gmail (jika diinstal) dan mengatur mailto.
sumber
sumber
sumber
Coba ini:
Kode di atas akan membuka klien email favorit pengguna yang diawali dengan email yang siap dikirim.
Sumber
sumber