Jawaban:
Cara terbaik (dan termudah) adalah menggunakan Intent
:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"});
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.
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.
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:
Intent intent = new Intent(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:default@recipient.com")); // 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);
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:
public Intent createEmailOnlyChooserIntent(Intent source,
CharSequence chooserTitle) {
Stack<Intent> intents = new Stack<Intent>();
Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
"info@domain.com", null));
List<ResolveInfo> activities = getPackageManager()
.queryIntentActivities(i, 0);
for(ResolveInfo ri : activities) {
Intent target = new Intent(source);
target.setPackage(ri.activityInfo.packageName);
intents.add(target);
}
if(!intents.isEmpty()) {
Intent chooserIntent = Intent.createChooser(intents.remove(0),
chooserTitle);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
intents.toArray(new Parcelable[intents.size()]));
return chooserIntent;
} else {
return Intent.createChooser(source, chooserTitle);
}
}
Dapat digunakan sebagai berikut:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] {
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 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).
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 itu crashLogFile
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.
private void sendEmail(){
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body");
try {
startActivity(Intent.createChooser(emailIntent, "Send email using..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}
}
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
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_SENDTO
tindakan dan sertakan mailto:
skema data " ". Sebagai contoh:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(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_SEND
tampaknya juga cocok dengan aplikasi yang bukan klien email, seperti Android Beam dan Bluetooth .
Penggunaan ACTION_SENDTO
dan 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:
Tindakan yang tidak didukung
Tindakan itu saat ini tidak didukung.
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:
private void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO)
.setData(new Uri.Builder().scheme("mailto").build())
.putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith <johnsmith@yourdomain.com>" })
.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 matched
Intent 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();
}
Temukan info lebih lanjut dalam dokumentasi pengembang .
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.
protected void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:feedback@gmail.com"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
setData()
, dan Avi masuk putExtra()
. Kedua varian ini berfungsi. Tetapi jika menghapus setData
dan menggunakan saja intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
, akan ada ActivityNotFoundException
.
Saya menggunakan kode di bawah ini di aplikasi saya. Ini menunjukkan persis aplikasi klien email, seperti Gmail.
Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null));
contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser)));
Ini hanya akan menunjukkan kepada Anda klien email (dan juga PayPal karena alasan yang tidak diketahui)
public void composeEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body");
try {
startActivity(Intent.createChooser(intent, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
intent.type = "message/rfc822"; intent.type = "text/html";
sini karena akan menyebabkan pengecualian.
Beginilah cara saya melakukannya. Bagus dan sederhana.
String emailUrl = "mailto:email@example.com?subject=Subject Text&body=Body Text";
Intent request = new Intent(Intent.ACTION_VIEW);
request.setData(Uri.parse(emailUrl));
startActivity(request);
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:
public static void sentEmail(Context mContext, String[] addresses, String subject, String body) {
try {
Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW);
sendIntentGmail.setType("plain/text");
sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses)));
sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body);
mContext.startActivity(sendIntentGmail);
} catch (Exception e) {
//When Gmail App is not installed or disable
Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND);
sendIntentIfGmailFail.setType("*/*");
sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body);
if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) {
mContext.startActivity(sendIntentIfGmailFail);
}
}
}
sederhana coba yang ini
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonSend = (Button) findViewById(R.id.buttonSend);
textTo = (EditText) findViewById(R.id.editTextTo);
textSubject = (EditText) findViewById(R.id.editTextSubject);
textMessage = (EditText) findViewById(R.id.editTextMessage);
buttonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String to = textTo.getText().toString();
String subject = textSubject.getText().toString();
String message = textMessage.getText().toString();
Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
// email.putExtra(Intent.EXTRA_CC, new String[]{ to});
// email.putExtra(Intent.EXTRA_BCC, new String[]{to});
email.putExtra(Intent.EXTRA_SUBJECT, subject);
email.putExtra(Intent.EXTRA_TEXT, message);
// need this to prompts email client only
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
}
});
}
Solusi lain bisa jadi
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("plain/text");
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"someone@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);
Dengan asumsi sebagian besar perangkat android sudah menginstal aplikasi GMail.
Saya menggunakan kode ini untuk mengirim email dengan meluncurkan bagian penulisan aplikasi email langsung.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"test@gmail.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
i.putExtra(Intent.EXTRA_TEXT , "body of email");
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
Metode ini bekerja untuk saya. Ini membuka aplikasi Gmail (jika diinstal) dan mengatur mailto.
public void openGmail(Activity activity) {
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setType("text/plain");
emailIntent.setType("message/rfc822");
emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
final PackageManager pm = activity.getPackageManager();
final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
ResolveInfo best = null;
for (final ResolveInfo info : matches)
if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
best = info;
if (best != null)
emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
activity.startActivity(emailIntent);
}
/**
* 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.
*/
public static void sendEmail(Context context, String[] emails, String subject, boolean forceGmail) {
Intent i = new Intent(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.
*/
public static boolean isPackageInstalled(@NonNull Context context, @NonNull String packageName) {
PackageManager pm = context.getPackageManager();
if (pm != null) {
try {
pm.getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","ebgsoldier@gmail.com", 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**
Coba ini:
String mailto = "mailto:bob@example.org" +
"?cc=" + "alice@example.com" +
"&subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyText);
Intent emailIntent = new Intent(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.