Gửi ý định email


588
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");

startActivity(Intent.createChooser(intent, "Send Email"));

Đoạn mã trên mở hộp thoại hiển thị các ứng dụng sau: - Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype, v.v.

Trên thực tế, tôi muốn lọc các tùy chọn danh sách này. Tôi muốn chỉ hiển thị các ứng dụng liên quan đến email, ví dụ như Gmail, Yahoo Mail. Làm thế nào để làm nó?

Tôi đã thấy ví dụ như vậy trên ứng dụng 'Android Market'.

  1. Mở ứng dụng Android Market
  2. Mở bất kỳ ứng dụng nào mà nhà phát triển đã chỉ định địa chỉ email của anh ấy / cô ấy. (Nếu bạn không thể tìm thấy ứng dụng như vậy, chỉ cần mở ứng dụng của tôi: - market: // chi tiết? Id = com.becomputer06.vehicle.derator.free, HOẶC tìm kiếm theo 'Nhật ký xe cộ')
  3. Cuộn xuống 'PHÁT TRIỂN'
  4. Bấm vào 'Gửi email'

Hộp thoại chỉ hiển thị các ứng dụng email, ví dụ như Gmail, Yahoo Mail, v.v. Nó không hiển thị Bluetooth, Orkut, v.v. Mã nào tạo ra hộp thoại như vậy?


4
Xin lỗi, điều này là không thể với Intent.ACTION_SEND. Có thể nó hoạt động với mục đích trực tiếp đến ứng dụng gmail nhưng tôi không biết liệu điều này có khả thi hay không.
Mẹ

19
Trong trường hợp bất kỳ ai tình cờ tìm hiểu ở đây về ý định email, EXTRA_MAIL phải tương ứng với một String[], không chỉ là Stringnhư được hiển thị ở đây.
bigstones

có thể trùng lặp Gửi email qua gmail
Sergey Glotov


Xem ở đây để có một số lời khuyên tốt: Medium.com/@cketti/ khăn
Felix D.

Câu trả lời:


218

khi nào bạn sẽ thay đổi ý định của mình.setType như bên dưới, bạn sẽ nhận được

intent.setType("text/plain");

Sử dụng android.content.Intent.ACTION_SENDTOđể chỉ nhận danh sách khách hàng email, không có facebook hoặc các ứng dụng khác. Chỉ cần khách hàng email. Ví dụ:

new Intent(Intent.ACTION_SENDTO);

Tôi sẽ không đề nghị bạn truy cập trực tiếp vào ứng dụng email. Hãy để người dùng chọn ứng dụng email yêu thích của mình. Đừng kìm hãm anh ấy.

Nếu bạn sử dụng ACTION_SENDTO, putExtra không hoạt động để thêm chủ đề và văn bản vào mục đích. Sử dụng Uri để thêm chủ đề và văn bản cơ thể.

EDIT: Chúng tôi có thể sử dụng message/rfc822thay vì "text/plain"như loại MIME. Tuy nhiên, điều đó không chỉ ra "chỉ cung cấp ứng dụng email cho khách hàng" - nó cho biết "cung cấp mọi thứ hỗ trợ dữ liệu tin nhắn / rfc822". Điều đó có thể dễ dàng bao gồm một số ứng dụng không phải là ứng dụng email.

message/rfc822 hỗ trợ các loại MIME của .mhtml, .mht, .mime


7
Bạn có thể vui lòng cung cấp một số mã để tạo ra đầu ra mong muốn?
dira

9
@ becomputer06 tham khảo điều này: stackoverflow.com/questions/8284706/send-email-via-gmail
Padma Kumar

76
Người chọn ý định nói no apps installed to perform this intentkhi tôi sử dụng ACTION_SENDTO. Tôi đang sử dụng Android 4.1.2 và tôi đã cài đặt ứng dụng email ...
ffleandro

4
Cách 'chính xác' là câu trả lời từ Magnus. Tôi đề nghị áp phích gốc để thay đổi câu trả lời được chấp nhận.
jhabbott

8
Sử dụng loại MIME để thực hiện thao tác gửi là một ý tưởng tồi, bởi vì về cơ bản, bạn đang hướng dẫn Android cung cấp danh sách các ứng dụng hỗ trợ gửi tệp loại message/rfc822. Điều đó không giống như gửi e-mail. mailto:Thay vào đó, hãy sử dụng giao thức, vì đó là những gì khách hàng thực sự hiểu.
Paul Lammertsma

872

Câu trả lời được chấp nhận không hoạt động trên 4.1.2. Điều này sẽ hoạt động trên tất cả các nền tảng:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

Hi vọng điêu nay co ich.

Cập nhật: Theo marcwjj , dường như trên 4.3, chúng ta cần truyền mảng chuỗi thay vì chuỗi cho địa chỉ email để làm cho nó hoạt động. Chúng tôi có thể cần thêm một dòng:

intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses

Liên kết tham chiếu


7
Bạn đúng, và nó không phải trên 4.2. Vì vậy, đây thực sự là câu trả lời đúng duy nhất, cảm ơn!
mDroidd

12
Đây là hoàn hảo. Một số người dưới đây đã đề cập rằng việc chỉ định phần "mailto" là điều thu hẹp các tùy chọn có sẵn cho các ứng dụng email. Sử dụng Uri.fromParts ("mailto", "", null) sẽ đưa con trỏ vào trường người nhận - hoàn hảo cho những gì tôi cần.
Xù xì

24
Hãy thử email nàyIntent.putExtra (Intent.EXTRA_TEXT, "Tôi là cơ thể email.");
thanhbinh84

15
Nếu bạn không có người nhận cụ thể, điều này cũng hoạt động:Uri.fromParts("mailto", "", null)
Phil

25
Điều này không hoạt động trên Android 4.3 của tôi nữa. Vui lòng kiểm tra tài liệu Android chính thức về việc gửi email theo ý định, hoạt động hoàn hảo: developer.android.com/guide/components/
mẹo

244

Có ba cách tiếp cận chính:

String email = /* Your email address here */
String subject = /* Your subject here */
String body = /* Your body here */
String chooserTitle = /* Your chooser title here */

1. Tùy chỉnh Uri:

Uri uri = Uri.parse("mailto:" + email)
    .buildUpon()
    .appendQueryParameter("subject", subject)
    .appendQueryParameter("body", body)
    .build();

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(Intent.createChooser(emailIntent, chooserTitle));

2. Sử dụng Intenttính năng bổ sung:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
//emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, body); //If you are using HTML in your body text

startActivity(Intent.createChooser(emailIntent, "Chooser Title"));

3. Thư viện hỗ trợ ShareCompat:

Activity activity = /* Your activity here */

ShareCompat.IntentBuilder.from(activity)
    .setType("message/rfc822")
    .addEmailTo(email)
    .setSubject(subject)
    .setText(body)
    //.setHtmlText(body) //If you are using HTML in your body text
    .setChooserTitle(chooserTitle)
    .startChooser();

1
Điều này làm việc tốt hơn nhiều đối với tôi - các tùy chọn khác xuất hiện một số điều đơn giản (ví dụ như Skype) là các trình xử lý có thể.
Chris Rae

1
Nếu bạn có một %biểu tượng trong bộ đệm, một số ký tự trong email kết quả sẽ không được mã hóa chính xác. Bạn cần thực hiện Uri.encodeđiệu nhảy được đề xuất bởi @minipif.
Giulio Piancastelli

12
Đây là câu trả lời tốt nhất ở đây, đừng lãng phí thời gian của bạn để thử người khác, câu thứ hai ở đây là những gì tôi đã chọn và nó hoạt động hoàn hảo, chỉ hiển thị các ứng dụng email thuần túy, không phải gDrive, không phải bluetooth .. vv Cảm ơn @ becomputer06
Hugo

1
Hãy cẩn thận về nhân vật "&". Nếu bạn có & ký tự trong phần thân email, các phương thức này sẽ cắt phần thân sau &. Ví dụ: nếu bạn gửi cơ thể như "Tôi là & một cơ thể mẫu", bạn sẽ nhận được "Tôi là"
Emre Koç

4
ShareCompat cho kết quả trong hầu hết tất cả các ứng dụng, không chỉ email khách hàng!
rpattabi

111

Điều này được trích dẫn từ tài liệu chính thức của Android, tôi đã thử nghiệm nó trên Android 4.4 và hoạt động hoàn hảo. Xem thêm ví dụ tại https://developer.android.com/guide/components/intents-common.html#Email

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);
    }
}

6
Đã đồng ý! Tôi ngạc nhiên một câu trả lời như thế này là quá xa trong danh sách. Tôi đoán đó phải là một sự thay đổi tương đối gần đây trong Tài liệu Android.
Mikey

Tuyệt quá! đáng tin cậy, nó đã giới thiệu 'Kinh thánh' của các nhà phát triển ứng dụng Android.
dev_android

1
Dấu hai chấm sau mailto đã lừa tôi! Tôi đã sử dụng "mailto" thay vì "mailto:"
Nigel Crasto 17/03/2016

1
Làm việc trên 5.1.1. Các tùy chọn khác không làm việc cho tôi.
Juanin

1
EXTRA_EMAILkhông làm việc cho tôi vì vậy tôi đã sử dụngUri.parse("mailto: " + myEmail)
Pratik Butani

89

Một câu trả lời muộn, mặc dù tôi đã tìm ra một giải pháp có thể giúp đỡ người khác:

Phiên bản Java

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:abc@xyz.com"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));


Phiên bản Kotlin

val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
    data = Uri.parse("mailto:abc@xyz.com")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))


Đây là đầu ra của tôi (chỉ đề xuất Gmail + Hộp thư đến):

đầu ra của tôi

Tôi đã nhận được giải pháp này từ trang web Nhà phát triển Android .


2
Đối với tôi, điều quan trọng là không có khoảng trống giữa mailtovà email:mailto:abc@xyz.com
AlvaroSantisteban

Đó là câu trả lời đúng.
niết bàn

36

Điều này làm việc cho tôi:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL  , new String[] { "me@somewhere.com" });
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");

startActivity(Intent.createChooser(intent, "Email via..."));

tức là sử dụng ACTION_SENDTOhành động chứ không phải ACTION_SENDhành động. Tôi đã thử nó trên một vài thiết bị Android 4.4 và nó giới hạn trình chọn bật lên chỉ hiển thị các ứng dụng email (Email, Gmail, Yahoo Mail, v.v.) và nó chèn chính xác địa chỉ email và chủ đề vào email.


35

Thử:

intent.setType("message/rfc822");

Anh ấy đúng, tôi đã thử và cung cấp [Drive, Email, Gmail, Skype], đây sẽ là "Câu trả lời đúng"
gurbieta

18
Sử dụng loại MIME để thực hiện thao tác gửi là một ý tưởng tồi, bởi vì về cơ bản, bạn đang hướng dẫn Android cung cấp danh sách các ứng dụng hỗ trợ gửi tệp loại message/rfc822. Điều đó không giống như gửi e-mail. mailto:Thay vào đó, hãy sử dụng giao thức, vì đó là những gì khách hàng thực sự hiểu.
Paul Lammertsma

34

Đây là cách thích hợp để gửi mục đích email theo Tài liệu chính thức dành cho nhà phát triển Android

Thêm các dòng mã này vào ứng dụng của bạn:

Intent intent = new Intent(Intent.ACTION_SEND);//common intent 
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Tùy chọn: Thêm cơ thể và chủ đề, như thế này

intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here");
intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" );

Bạn đã thêm dòng này, nhưng tốt cho người dùng mới

intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"youremailaddress@aviparshan.com"});

Đây sẽ là địa chỉ của người nhận, nghĩa là người dùng sẽ gửi cho bạn (nhà phát triển) một e-mail.


@ barnacle.m Cảm ơn bạn! Đó cũng là một trong những phương pháp đơn giản hơn. Vấn đề là câu trả lời của tôi không nhận được đủ số lượt
ủng hộ

1
Đó là bởi vì có rất nhiều câu trả lời tương tự, nhưng điều này chỉ ra tài liệu chính thức của Android về vấn đề này.
barnacle.m

1
Tôi đã không thể gửi địa chỉ email. Tôi đã sửa nó như ý định này.data = Uri.parse ("mailto: somemail@xyz.com")
Hitesh Bisht

18

Cuối cùng đưa ra cách tốt nhất để làm

String to = "test@gmail.com";
String subject= "Hi I am subject";
String body="Hi I am test body";
String mailTo = "mailto:" + to +
        "?&subject=" + Uri.encode(subject) +
        "&body=" + Uri.encode(body);
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse(mailTo));
startActivity(emailIntent);

Bạn thật tuyệt vời, anh bạn.
Ashik

Không có vấn đề gì anh chàng
Ajay Shrestha

2
Hoạt động hoàn hảo.
Solanki Kam Meat

Kiểm tra bài viết này mô tả chi tiết: Medium.com/@cketti/ Kẻ
Bruno Bieri

hoạt động tốt, giữ cho nó lên
Jacks

15

Nếu bạn chỉ muốn các ứng dụng email bạn nên sử dụng android.content.Intent.EXTRA_EMAILvới một mảng. Dưới đây là một ví dụ:

final Intent result = new Intent(android.content.Intent.ACTION_SEND);
result.setType("plain/text");
result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient });
result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
result.putExtra(android.content.Intent.EXTRA_TEXT, body);

3
Không, Vẫn mang đến rất nhiều ứng dụng khác - nhiều hơnACTION_SENDTO
Dori

10

Các mã sau đây làm việc cho tôi tốt.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);

8

Từ tài liệu dành cho nhà phát triển Android :

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);
    }
}

8

Chỉnh sửa: Không hoạt động nữa với các phiên bản mới của Gmail

Đây là cách duy nhất tôi tìm thấy vào thời điểm đó để khiến nó hoạt động với bất kỳ nhân vật nào.

Câu trả lời của doreamon là cách chính xác để đi ngay bây giờ, vì nó hoạt động với tất cả các nhân vật trong các phiên bản mới của Gmail.

Câu trả lời cũ:


Đây là của tôi. Nó dường như hoạt động trên tất cả các phiên bản Android, với sự hỗ trợ của chủ thể và thông điệp và hỗ trợ đầy đủ các ký tự utf-8:

public static void email(Context context, String to, String subject, String body) {
    StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to));
    if (subject != null) {
        builder.append("?subject=" + Uri.encode(Uri.encode(subject)));
        if (body != null) {
            builder.append("&body=" + Uri.encode(Uri.encode(body)));
        }
    }
    String uri = builder.toString();
    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
    context.startActivity(intent);
}

1
+1 Uri.encodelà cách chính xác để đi. Nhưng tại sao gọi nó là hai lần cho chủ đề và cơ thể?
Giulio Piancastelli

Vì vậy, tự làm mã hóa chỉ là một ý tưởng tồi. Sử dụng tốt hơn một Ý định thích hợp với các tính năng bổ sung cần thiết, xem ví dụ stackoverflow.com/a/15022222
Giulio Piancastelli

Đối với tôi đây là câu trả lời tốt nhất vì các giải pháp khác chỉ hoạt động chính xác với một số ứng dụng email. Ứng dụng này hoạt động với mọi ứng dụng email mà tôi đã thử nghiệm.
Egis

7

Không có giải pháp nào trong số này làm việc cho tôi. Đây là một giải pháp tối thiểu hoạt động trên Lollipop. Trên thiết bị của tôi, chỉ có Gmail và các ứng dụng email gốc xuất hiện trong danh sách người chọn kết quả.

Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
                                Uri.parse("mailto:" + Uri.encode(address)));

emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));

7

Hoạt động trên tất cả các phiên bản Android:

String[] TO = {"email@server.com"};
    Uri uri = Uri.parse("mailto:email@server.com")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

Câu trả lời của bạn đã giúp tôi. Cảm ơn
Adnan Khan

5

Mã sau làm việc cho tôi !!

import android.support.v4.app.ShareCompat;
    .
    .
    .
    .
final Intent intent = ShareCompat.IntentBuilder
                        .from(activity)
                        .setType("application/txt")
                        .setSubject(subject)
                        .setText("Hii")
                        .setChooserTitle("Select One")
                        .createChooserIntent()
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

activity.startActivity(intent);

5

Điều này làm việc cho tôi hoàn toàn tốt:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));

5

Nếu bạn muốn đảm bảo rằng ý định của bạn chỉ được xử lý bởi một ứng dụng email (chứ không phải các ứng dụng nhắn tin văn bản hoặc ứng dụng xã hội khác), thì hãy sử dụng ACTION_SENDTOhành động và bao gồm lược đồ dữ liệu "mailto:". Ví dụ:

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);
    }
}

Tôi đã tìm thấy điều này trong https://developer.android.com/guide/components/intents-common.html#Email


5

trong Kotlin nếu có ai đang tìm kiếm

val emailArrray:Array<String> = arrayOf("travelagentsupport@kkk.com")
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, emailArrray)
intent.putExtra(Intent.EXTRA_SUBJECT, "Inquire about travel agent")
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

4

Hầu hết các câu trả lời này chỉ hoạt động trong một trường hợp đơn giản khi bạn không gửi tệp đính kèm . Trong trường hợp của tôi, đôi khi tôi cần gửi tệp đính kèm (ACTION_SEND) hoặc hai tệp đính kèm (ACTION_SEND_MULTIPLE).

Vì vậy, tôi đã tiếp cận tốt nhất từ ​​chủ đề này và kết hợp chúng. Đó là sử dụng thư viện hỗ trợ ShareCompat.IntentBuildernhưng tôi chỉ hiển thị các ứng dụng phù hợp với ACTION_SENDTO với "mailto:" uri. Bằng cách này, tôi chỉ nhận được danh sách các ứng dụng email có hỗ trợ tệp đính kèm:

fun Activity.sendEmail(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
    val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
    val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
    val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
    val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
    val targetedIntents = originalIntentResults
            .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
            .map {
                createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
            }
            .toMutableList()
    val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
    finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
    startActivity(finalIntent)
}

private fun Activity.createEmailShareIntent(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
    val builder = ShareCompat.IntentBuilder.from(this)
            .setType("message/rfc822")
            .setEmailTo(recipients.toTypedArray())
            .setStream(file)
            .setSubject(subject)
    if (secondFile != null) {
        builder.addStream(secondFile)
    }
    if (text != null) {
        builder.setText(text)
    }
    return builder.intent
}

Điều này có vẻ như nó có thể hữu ích; bất kỳ cơ hội để có được nó trong Java?
Kyle Humfeld

1
Kotlin rất giống với Java, bạn sẽ có thể sao chép dán và chỉ cần thay đổi một vài thứ.
David Vávra

3

Sử dụng intent.setType("message/rfc822");không hoạt động nhưng nó cho thấy các ứng dụng bổ sung không nhất thiết phải xử lý email (ví dụ: GDrive). Sử dụng Intent.ACTION_SENDTOvới setType("text/plain")là tốt nhất nhưng bạn phải thêm setData(Uri.parse("mailto:"))để có kết quả tốt nhất (chỉ các ứng dụng email). Mã đầy đủ như sau:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.setData(Uri.parse("mailto:IT@RMAsoft.NET"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Email from My app");
intent.putExtra(Intent.EXTRA_TEXT, "Place your email message here ...");
startActivity(Intent.createChooser(intent, "Send Email"));


2

Nếu bạn muốn nhắm mục tiêu Gmail thì bạn có thể làm như sau. Lưu ý rằng mục đích là "ACTION_SENDTO" chứ không phải "ACTION_SEND" và các trường mục đích bổ sung không cần thiết cho Gmail.

String uriText =
    "mailto:youremail@gmail.com" + 
    "?subject=" + Uri.encode("your subject line here") + 
    "&body=" + Uri.encode("message body here");

Uri uri = Uri.parse(uriText);

Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
if (sendIntent.resolveActivity(getPackageManager()) != null) {
   startActivity(Intent.createChooser(sendIntent, "Send message")); 
}

2

Tôi đang cập nhật câu trả lời của Adil trong Kotlin,

val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, Array(1) { "test@email.com" })
intent.putExtra(Intent.EXTRA_SUBJECT, "subject")
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    showSnackBar(getString(R.string.no_apps_found_to_send_mail), this)
}

Điều này thất bại ngay cả khi Gmail có trên ứng dụng.
AndroidDev

@AndroidDev trong thiết bị nào bạn đang gặp phải vấn đề?
Kishan Solanki

2

Vui lòng sử dụng mã dưới đây:

                try {

                    String uriText =
                            "mailto:emailid" +
                                    "?subject=" + Uri.encode("Feedback for app") +
                                    "&body=" + Uri.encode(deviceInfo);
                    Uri uri = Uri.parse(uriText);
                    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
                    emailIntent.setData(uri);
                    startActivity(Intent.createChooser(emailIntent, "Send email using..."));
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(ContactUsActivity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
                }

1

Có lẽ bạn nên thử điều này: intent.setType("plain/text");

Tôi tìm thấy nó ở đây . Tôi đã sử dụng nó trong ứng dụng của mình và nó chỉ hiển thị các tùy chọn E-Mail và Gmail.


2
"Đồng bằng / văn bản" hiển thị Bluetooth, Skype, v.v. Kiểm tra đầu ra mong muốn trong ứng dụng Android Market. Các bước được liệt kê trong câu hỏi.
dira

1
Sử dụng loại MIME để thực hiện thao tác gửi là một ý tưởng tồi, bởi vì về cơ bản, bạn đang hướng dẫn Android cung cấp danh sách các ứng dụng hỗ trợ gửi tệp loại plain/textvà thậm chí đó không phải là loại MIME hợp lệ. Điều đó không giống như gửi e-mail. mailto:Thay vào đó, hãy sử dụng giao thức, vì đó là những gì khách hàng thực sự hiểu.
Paul Lammertsma

1

Soạn email trong ứng dụng email khách hàng điện thoại:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "some@email.address" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));

1

Dùng cái này:

boolean success = EmailIntentBuilder.from(activity)
        .to("support@example.org")
        .cc("developer@example.org")
        .subject("Error report")
        .body(buildErrorReport())
        .start();

sử dụng lớp xây dựng:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'

1

Đây là những gì tôi sử dụng và nó hoạt động với tôi:

//variables
String subject = "Whatever subject you want";
String body = "Whatever text you want to put in the body";
String intentType = "text/html";
String mailToParse = "mailto:";

//start Intent
Intent variableName = new Intent(Intent.ACTION_SENDTO);
variableName.setType(intentType);
variableName.setData(Uri.parse(mailToParse));
variableName.putExtra(Intent.EXTRA_SUBJECT, subject);
variableName.putExtra(Intent.EXTRA_TEXT, body);

startActivity(variableName);

Điều này cũng sẽ cho phép người dùng chọn ứng dụng email ưa thích của họ. Điều duy nhất điều này không cho phép bạn làm là đặt địa chỉ email của người nhận.


Bạn đang thiếu một "dòng trên 2.
Tim

1

Mã này đang hoạt động trong thiết bị của tôi

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"mahendrarajdhami@gmail.com"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));

nó chỉ mở Gmail và Email trong thiết bị của tôi
Mahen

1
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", email, null));
if (emailIntent.resolveActivity(context.getPackageManager()) != null) {
    context.startActivity(Intent.createChooser(emailIntent, "Send Email..."));
} else {
    Toast.makeText(context, "No apps can perform this action.", Toast.LENGTH_SHORT).show();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.