ส่งเจตนาส่งอีเมล์


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

รหัสด้านบนเปิดกล่องโต้ตอบแสดงแอพดังต่อไปนี้: - บลูทู ธ , Google เอกสาร, Yahoo Mail, Gmail, Orkut, Skype เป็นต้น

จริงๆแล้วฉันต้องการกรองรายการตัวเลือกเหล่านี้ ฉันต้องการแสดงเฉพาะแอพที่เกี่ยวข้องกับอีเมลเช่น Gmail, Yahoo Mail ทำอย่างไร?

ฉันเห็นตัวอย่างดังกล่าวในแอปพลิเคชัน 'Android Market'

  1. เปิดแอพ Android Market
  2. เปิดแอปพลิเคชั่นที่นักพัฒนาซอฟต์แวร์ได้ระบุที่อยู่อีเมลของเขา / เธอ (หากคุณไม่พบแอปดังกล่าวเพียงเปิดแอปของฉัน: - ตลาด: // รายละเอียด id = com.becomputer06.vehicle.diary.free หรือค้นหาโดย 'Vehicle Diary')
  3. เลื่อนลงไปที่ 'DEVELOPER'
  4. คลิกที่ 'ส่งอีเมล'

กล่องโต้ตอบจะแสดงเฉพาะแอพอีเมลเช่น Gmail, Yahoo Mail เป็นต้นไม่แสดงบลูทู ธ , orkut เป็นต้นรหัสใดที่สร้างกล่องโต้ตอบดังกล่าว


4
ขออภัยไม่สามารถกระทำได้ด้วยความตั้งใจ ACTION_SEND อาจใช้ได้กับเจตนาโดยตรงไปที่ gmail-App แต่ฉันไม่รู้ว่าเป็นไปได้หรือไม่
Thommy

19
ในกรณีที่ทุกคนเรียนรู้ที่นี่เกี่ยวกับเจตนาทางอีเมล EXTRA_MAIL ควรสอดคล้องกับ a String[]ไม่ใช่เพียงแค่Stringดังที่แสดงไว้ที่นี่
bigstones

อาจเป็นไปได้ซ้ำกับส่งอีเมลผ่าน gmail
Sergey Glotov

มีความเป็นไปได้ที่ซ้ำกันของการใช้ Android Intent.ACTION_SEND สำหรับส่งอีเมล
Avi Parshan

ดูคำแนะนำดีๆได้ที่นี่: medium.com/@cketti/…
เฟลิกซ์ดี.

คำตอบ:


218

เมื่อคุณจะเปลี่ยนความตั้งใจของคุณ setType เช่นด้านล่างคุณจะได้รับ

intent.setType("text/plain");

ใช้android.content.Intent.ACTION_SENDTOเพื่อรับรายการอีเมลไคลเอ็นต์เท่านั้นโดยไม่มี Facebook หรือแอปอื่น เพียงลูกค้าอีเมล Ex:

new Intent(Intent.ACTION_SENDTO);

ฉันจะไม่แนะนำให้คุณไปที่แอพอีเมลโดยตรง ให้ผู้ใช้เลือกแอพอีเมลที่เขาโปรดปราน อย่าบังคับเขา

ถ้าคุณใช้ ACTION_SENDTO, putExtra จะไม่ทำงานเพื่อเพิ่มหัวเรื่องและข้อความในเจตนา ใช้ Uri เพื่อเพิ่มหัวเรื่องและเนื้อหาของข้อความ

แก้ไข: เราสามารถใช้message/rfc822แทน"text/plain"ประเภท MIME อย่างไรก็ตามนั่นไม่ได้ระบุว่า "เสนอเพียงไคลเอนต์อีเมล" - ระบุว่า "เสนออะไรก็ได้ที่รองรับข้อความ / ข้อมูล rfc822" ซึ่งอาจรวมแอปพลิเคชันบางอย่างที่ไม่ใช่อีเมลไคลเอ็นต์

message/rfc822 รองรับประเภท MIME ของ .mhtml, .mht, .mime


7
คุณกรุณาให้รหัสเพื่อสร้างผลลัพธ์ที่ต้องการได้ไหม
dira

9
@ Becomeputer06 อ้างถึงสิ่งนี้: stackoverflow.com/questions/8284706/send-email-via-gmail
Padma Kumar

76
ผู้เลือกเจตนากล่าวว่าเมื่อฉันใช้no apps installed to perform this intent ACTION_SENDTOฉันใช้ Android 4.1.2 และฉันมีแอปอีเมลติดตั้ง ...
ffleandro

4
วิธีการ 'ถูกต้อง' คือคำตอบจากแมกนัส ฉันแนะนำโปสเตอร์ต้นฉบับเพื่อเปลี่ยนคำตอบที่ยอมรับได้
jhabbott

8
ใช้ชนิดไมม์ที่จะทำการดำเนินการส่งเป็นความคิดที่ไม่ดีเพราะคุณพื้นสอน Android message/rfc822เพื่อให้รายชื่อของปพลิเคชันที่สนับสนุนการส่งไฟล์ประเภทหนึ่ง นั่นคือไม่ได้เช่นเดียวกับการส่ง e-mail ใช้mailto:โปรโตคอลแทนเพราะนั่นคือสิ่งที่ลูกค้าอีเมลเข้าใจจริงๆ
Paul Lammertsma

872

คำตอบที่ยอมรับใช้ไม่ได้กับ 4.1.2 สิ่งนี้น่าจะใช้ได้กับทุกแพลตฟอร์ม:

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..."));

หวังว่านี่จะช่วยได้

อัปเดต: จากข้อมูลของmarcwjjดูเหมือนว่าในวันที่ 4.3 เราจะต้องผ่านอาร์เรย์สตริงแทนสตริงสำหรับที่อยู่อีเมลเพื่อให้มันทำงานได้ เราอาจต้องเพิ่มอีกหนึ่งบรรทัด:

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

ลิงก์อ้างอิง


7
คุณพูดถูกและไม่ใช่ในข้อ 4.2 ดังนั้นนี่คือคำตอบที่ถูกต้องเท่านั้นจริง ๆ ขอบคุณ!
mDroidd

12
มันสมบูรณ์แบบ บางคนที่กล่าวถึงด้านล่างระบุว่าการระบุส่วน "mailto" คือสิ่งที่ตัวเลือกที่มีให้กับไคลเอนต์อีเมลแคบลง การใช้ Uri.fromParts ("mailto", "", null) จะวางเคอร์เซอร์ในฟิลด์ผู้รับ - เหมาะสำหรับสิ่งที่ฉันต้องการ
ขนดก

24
ลองใช้ emailIntent.putExtra (Intent.EXTRA_TEXT "ฉันเป็นผู้ส่งอีเมล");
thanhbinh84

15
หากคุณไม่มีผู้รับที่เฉพาะเจาะจงก็สามารถใช้งานได้เช่นกันUri.fromParts("mailto", "", null)
Phil

25
สิ่งนี้ไม่ทำงานบน Android 4.3 ของฉันอีกต่อไป โปรดตรวจสอบเอกสาร Android อย่างเป็นทางการในการส่งอีเมลเป็นความตั้งใจซึ่งทำงานได้อย่างสมบูรณ์แบบ: developer.android.com/guide/components/ …
marcwjj

244

มีสามวิธีหลัก:

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

1. กำหนดเอง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. การใช้Intentบริการพิเศษ:

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. ห้องสมุดสนับสนุน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
สิ่งนี้ทำงานได้ดีกว่ามากสำหรับฉัน - ตัวเลือกอื่น ๆ โผล่สิ่งที่ตรง (Skype เช่น) เป็นตัวจัดการที่เป็นไปได้
Chris Rae

1
หากคุณมี%สัญลักษณ์ในบัฟเฟอร์อักขระบางตัวในอีเมลที่ได้จะไม่ถูกเข้ารหัสอย่างถูกต้อง คุณต้องทำการUri.encodeเต้นที่แนะนำโดย @minipif
Giulio Piancastelli

12
นี่คือคำตอบที่ดีที่สุดที่นี่อย่าเสียเวลาลองคนอื่นอย่างที่สองที่นี่คือสิ่งที่ฉันเลือกและมันทำงานได้อย่างสมบูรณ์แบบเพียงแสดงแอพอีเมลแท้ไม่ใช่ gDrive ไม่ใช่บลูทู ธ .. ฯลฯ ขอบคุณ @ Becputer06
Hugo

1
ระวังตัวละคร "&" หากคุณได้รับ & ตัวละครในเนื้อหาอีเมลวิธีการเหล่านี้จะตัดเนื้อหาหลังจาก & ตัวอย่างเช่นถ้าคุณส่งเนื้อหาเช่น "ฉันเป็นตัวอย่างร่างกาย" คุณจะได้รับเพียง "ฉัน"
Emre Koç

4
ShareCompat ส่งผลให้แอพเกือบทั้งหมดไม่ใช่แค่ไคลเอนต์อีเมลเท่านั้น!
rpattabi

111

เอกสารนี้อ้างอิงจากเอกสารอย่างเป็นทางการของ Android ฉันได้ทดสอบกับ Android 4.4 และทำงานได้อย่างสมบูรณ์แบบ ดูตัวอย่างเพิ่มเติมได้ที่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
ตกลงกัน! ฉันประหลาดใจที่คำตอบเช่นนี้อยู่ในรายการ ฉันคิดว่ามันคงเป็นการเปลี่ยนแปลงล่าสุดใน Android Docs
Mikey

ที่ดี! หนึ่งที่เชื่อถือได้มันเรียกว่า 'พระคัมภีร์' ของนักพัฒนาแอป Android
dev_android

1
ลำไส้ใหญ่หลังจาก mailto ทำเคล็ดลับสำหรับฉัน! ฉันใช้ "mailto" แทน "mailto:"
Nigel Crasto

1
ทำงานกับ 5.1.1 ตัวเลือกอื่น ๆ ใช้ไม่ได้สำหรับฉัน
Juanin

1
EXTRA_EMAILไม่ทำงานสำหรับฉันดังนั้นฉันใช้Uri.parse("mailto: " + myEmail)
Pratik Butani

89

คำตอบที่ล่าช้าแม้ว่าฉันจะหาวิธีแก้ปัญหาที่สามารถช่วยเหลือผู้อื่นได้:

รุ่น Java

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


รุ่น Kotlin

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


นี่คือผลลัพธ์ของฉัน (แนะนำเฉพาะ Gmail + Inbox):

ผลลัพธ์ของฉัน

ฉันได้รับโซลูชันนี้จากเว็บไซต์นักพัฒนา Android


2
สำหรับฉันมันเป็นสิ่งสำคัญที่ไม่มีที่ว่างระหว่างmailtoและอีเมล:mailto:abc@xyz.com
AlvaroSantisteban

นั่นคือคำตอบที่ถูกต้อง
นิพพาน

36

สิ่งนี้ใช้ได้กับฉัน:

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..."));

เช่นใช้การACTION_SENDTOกระทำมากกว่าการACTION_SENDกระทำ ฉันได้ลองใช้กับอุปกรณ์ Android 4.4 สองตัวและมัน จำกัด ป๊อปอัพตัวเลือกให้แสดงเฉพาะแอปพลิเคชันอีเมล (อีเมล, Gmail, Yahoo Mail เป็นต้น) และมันแทรกที่อยู่อีเมลและหัวข้อลงในอีเมลอย่างถูกต้อง


35

ลอง:

intent.setType("message/rfc822");

เขาพูดถูกฉันลองแล้วเสนอ [Drive, Email, Gmail, Skype] นี่ควรจะเป็น "คำตอบที่ถูกต้อง"
gurbieta

18
ใช้ชนิดไมม์ที่จะทำการดำเนินการส่งเป็นความคิดที่ไม่ดีเพราะคุณพื้นสอน Android message/rfc822เพื่อให้รายชื่อของปพลิเคชันที่สนับสนุนการส่งไฟล์ประเภทหนึ่ง นั่นคือไม่ได้เช่นเดียวกับการส่ง e-mail ใช้mailto:โปรโตคอลแทนเพราะนั่นคือสิ่งที่ลูกค้าอีเมลเข้าใจจริงๆ
Paul Lammertsma

34

นี่เป็นวิธีที่เหมาะสมในการส่งความตั้งใจทางอีเมลตาม เอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Android

เพิ่มรหัสบรรทัดเหล่านี้ลงในแอปของคุณ:

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

ทางเลือก: เพิ่มเนื้อหาและหัวเรื่องเช่นนี้

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

คุณเพิ่มบรรทัดนี้แล้ว แต่ดีสำหรับผู้ใช้ใหม่

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

นี่จะเป็นที่อยู่ของผู้รับซึ่งหมายความว่าผู้ใช้จะส่งอีเมลถึงคุณ (ผู้พัฒนา)


@ barnacle.m ขอบคุณ! นอกจากนี้ยังเป็นวิธีการง่ายๆอีกวิธีหนึ่ง ปัญหาคือคำตอบของฉันไม่ได้รับ upvotes มากพอ :(
Avi Parshan

1
เป็นเพราะมีคำตอบที่คล้ายกันมากมาย แต่อันนี้ชี้ให้เห็นเอกสาร Android อย่างเป็นทางการเกี่ยวกับเรื่องนี้
barnacle.m

1
ฉันไม่สามารถส่งที่อยู่อีเมลได้ ฉันแก้ไขมันเหมือน intent.data นี้ = Uri.parse ("mailto: somemail@xyz.com")
Hitesh Bisht

18

ในที่สุดก็เกิดขึ้นกับวิธีที่ดีที่สุดที่จะทำ

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

คุณเจ๋งนะเพื่อน
Ashik

ไม่มีปัญหาเพื่อน
Ajay Shrestha

2
ทำงานได้อย่างสมบูรณ์แบบ
Solanki Kamlesh

ตรวจสอบบทความนี้ซึ่งอธิบายโดยละเอียด: medium.com/@cketti/…
Bruno Bieri

ทำงานได้ดีเก็บมันไว้
แจ็ค

15

หากคุณต้องการเฉพาะโปรแกรมรับส่งเมลคุณควรใช้android.content.Intent.EXTRA_EMAILกับอาเรย์ ต่อไปนี้เป็นตัวอย่าง:

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
ไม่, ยังมีแอพอื่น ๆ มากมายACTION_SENDTO
Dori

10

รหัสต่อไปนี้ใช้งานได้ดีสำหรับฉัน

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

จากเอกสารนักพัฒนา 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

แก้ไข: ไม่ทำงานอีกต่อไปกับ Gmail เวอร์ชันใหม่

นี่เป็นวิธีเดียวที่ฉันค้นพบในขณะนั้นเพื่อให้มันใช้ได้กับตัวละครทุกตัว

คำตอบของ doreamon เป็นวิธีที่ถูกต้องในตอนนี้เนื่องจากสามารถใช้ได้กับอักขระทั้งหมดใน Gmail เวอร์ชันใหม่

คำตอบเก่า:


นี่คือของฉัน ดูเหมือนว่าจะใช้งานได้กับ Android ทุกรุ่นพร้อมรองรับหัวเรื่องและเนื้อหาข้อความและรองรับอักขระ 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.encodeเป็นวิธีที่ถูกต้อง แต่ทำไมเรียกมันว่าสองครั้งสำหรับตัวแบบและร่างกาย?
Giulio Piancastelli

ดังนั้นการเข้ารหัสตัวเองจึงเป็นความคิดที่ไม่ดี ใช้ความตั้งใจที่เหมาะสมยิ่งขึ้นด้วยสิ่งที่จำเป็นเพิ่มเติมดูเช่นstackoverflow.com/a/15022222
Giulio Piancastelli

สำหรับฉันนี่คือคำตอบที่ดีที่สุดเพราะโซลูชันอื่น ๆ ทำงานได้อย่างถูกต้องกับแอพอีเมลบางตัวเท่านั้น อันนี้ใช้ได้กับแอพอีเมลทุกตัวที่ฉันทดสอบ
Egis

7

วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉัน นี่เป็นวิธีแก้ปัญหาขั้นต่ำที่ใช้กับ Lollipop ในอุปกรณ์ของฉันมีเพียง Gmail และแอปอีเมลดั้งเดิมเท่านั้นที่ปรากฏในรายการตัวเลือกผลลัพธ์

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

ทำงานบน 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..."));

คำตอบของคุณช่วยฉัน ขอบคุณ
Adnan Khan

5

รหัสต่อไปนี้ทำงานให้ฉัน !!

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

มันใช้งานได้ดีสำหรับฉันอย่างสมบูรณ์แบบ:

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

5

หากคุณต้องการให้แน่ใจว่าแอปอีเมลของคุณมีเจตนาที่จะจัดการเท่านั้น (และไม่ใช่แอพส่งข้อความหรือโซเชียลอื่น ๆ ) ให้ใช้การACTION_SENDTOดำเนินการและรวมชุดข้อมูล "mailto:" ตัวอย่างเช่น:

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

ฉันพบสิ่งนี้ในhttps://developer.android.com/guide/components/intents-common.html#Email


5

ในKotlinถ้าใครกำลังมองหา

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

คำตอบเหล่านี้ส่วนใหญ่ทำงานได้กับกรณีง่าย ๆ เท่านั้นเมื่อคุณไม่ได้ส่งไฟล์แนบสิ่งที่แนบมาในกรณีของฉันฉันต้องส่งไฟล์แนบ (ACTION_SEND) หรือไฟล์แนบสองไฟล์ (ACTION_SEND_MULTIPLE) สองครั้ง

ดังนั้นฉันจึงใช้วิธีที่ดีที่สุดจากหัวข้อนี้และรวมเข้าด้วยกัน ใช้ไลบรารีการสนับสนุนShareCompat.IntentBuilderแต่ฉันแสดงเฉพาะแอพที่ตรงกับ ACTION_SENDTO กับ "mailto:" uri วิธีนี้ฉันจะได้รับเฉพาะรายการแอพอีเมลที่มีการสนับสนุนไฟล์แนบ:

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
}

ดูเหมือนว่ามันจะมีประโยชน์ โอกาสที่จะได้รับมันใน Java?
Kyle Humfeld

1
Kotlin คล้ายกับ Java คุณควรจะสามารถคัดลอกแปะและเปลี่ยนบางสิ่งได้
David Vávra

3

การใช้intent.setType("message/rfc822");งานได้ผล แต่แสดงแอพพิเศษที่ไม่จำเป็นต้องจัดการกับอีเมล (เช่น GDrive) การใช้Intent.ACTION_SENDTOกับsetType("text/plain")ดีที่สุด แต่คุณต้องเพิ่มsetData(Uri.parse("mailto:"))เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด (เฉพาะแอปอีเมล) รหัสเต็มมีดังนี้:

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

soultion ที่สมบูรณ์แบบ
Daxesh Vekariya

2

หากคุณต้องการกำหนดเป้าหมาย Gmail คุณสามารถทำสิ่งต่อไปนี้ได้ โปรดทราบว่าจุดประสงค์คือ "ACTION_SENDTO" และไม่ใช่ "ACTION_SEND" และไม่จำเป็นต้องมีช่องความตั้งใจเพิ่มเติมสำหรับ 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

ฉันกำลังอัปเดตคำตอบของ Adil ใน 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)
}

สิ่งนี้ล้มเหลวแม้ในขณะที่ Gmail อยู่ในแอป
AndroidDev

@AndroidDev อุปกรณ์ที่คุณประสบปัญหาอยู่หรือไม่
Kishan Solanki

2

กรุณาใช้รหัสด้านล่าง:

                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

บางทีคุณควรลองสิ่งนี้: intent.setType("plain/text");

ผมพบว่ามันนี่ ฉันใช้มันในแอพแล้วมันจะแสดงเฉพาะตัวเลือกอีเมลและ Gmail


2
"ล้วน / ข้อความ" แสดงบลูทู ธ Skype ฯลฯ ชำระเงินเอาท์พุทที่ต้องการในแอพ Android Market ขั้นตอนมีการระบุไว้ในคำถาม
dira

1
การใช้ประเภท MIME เพื่อดำเนินการส่งเป็นความคิดที่ไม่ดีเนื่องจากคุณสั่งให้ Android จัดทำรายการแอพที่สนับสนุนการส่งไฟล์ประเภทplain/textและโดยทั่วไปไม่ใช่ประเภท MIME ที่ถูกต้อง นั่นคือไม่ได้เช่นเดียวกับการส่ง e-mail ใช้mailto:โปรโตคอลแทนเพราะนั่นคือสิ่งที่ลูกค้าอีเมลเข้าใจจริงๆ
Paul Lammertsma

1

เขียนอีเมลในไคลเอนต์อีเมลโทรศัพท์:

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

ใช้สิ่งนี้:

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

ใช้การสร้าง gradle:

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

1

นี่คือสิ่งที่ฉันใช้และมันใช้ได้กับฉัน:

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

วิธีนี้จะทำให้ผู้ใช้สามารถเลือกแอพอีเมลที่ต้องการได้ สิ่งเดียวที่ไม่อนุญาตให้คุณทำคือการตั้งค่าที่อยู่อีเมลของผู้รับ


คุณพลาด"บรรทัดที่ 2
ทิม

1

รหัสนี้ทำงานในอุปกรณ์ของฉัน

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..."));

มันเปิด Gmail และอีเมลในอุปกรณ์ของฉันเท่านั้น
2560

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();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.