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

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");

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

โค้ดด้านบนจะเปิดกล่องโต้ตอบที่แสดงแอปต่อไปนี้:- Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype ฯลฯ

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

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

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

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


person dira    schedule 02.01.2012    source แหล่งที่มา
comment
ขออภัย ไม่สามารถทำได้ด้วย IntentACTION_SEND อาจใช้งานได้โดยมีเจตนาโดยตรงกับ gmail-App แต่ฉันไม่รู้ว่าเป็นไปได้หรือไม่   -  person Thommy    schedule 02.01.2012
comment
ในกรณีที่ใครก็ตามได้เรียนรู้ที่นี่เกี่ยวกับจุดประสงค์ทางอีเมล EXTRA_MAIL ควรสอดคล้องกับ String[] ไม่ใช่เพียง String ดังที่แสดงไว้ที่นี่   -  person bigstones    schedule 16.08.2012
comment
อาจซ้ำกันของ ส่งอีเมลผ่าน Gmail   -  person Sergey Glotov    schedule 25.09.2013
comment
การใช้ Android Intent.ACTION_SEND สำหรับการส่งอีเมลที่เป็นไปได้   -  person Avi Parshan    schedule 03.02.2017
comment
ดูคำแนะนำดีๆ ที่นี่: medium.com/@cketti/< /ก>   -  person Felix D.    schedule 27.07.2017
comment
สิ่งนี้ใช้ไม่ได้สำหรับฉันในปี 2020 หากวิธีแก้ปัญหาการทำงานของฉัน: stackoverflow.com/a/62877003/2155858   -  person Rajeev Jayaswal    schedule 19.12.2020


คำตอบ (36)


เมื่อคุณจะเปลี่ยน intent.setType ดังด้านล่างคุณจะได้รับ

intent.setType("text/plain");

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

new Intent(Intent.ACTION_SENDTO);

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

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

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

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

person Padma Kumar    schedule 02.01.2012
comment
คุณช่วยกรุณาให้รหัสเพื่อสร้างผลลัพธ์ที่ต้องการได้ไหม? - person dira; 02.01.2012
comment
@ becomputer06 อ้างอิงสิ่งนี้: stackoverflow.com/questions/8284706/send-email-via-gmail - person Padma Kumar; 03.01.2012
comment
ตัวเลือกเจตนาบอกว่า no apps installed to perform this intent เมื่อฉันใช้ ACTION_SENDTO ฉันใช้ Android 4.1.2 และติดตั้งแอปอีเมลไว้แล้ว... - person ffleandro; 28.11.2012
comment
@ffleandro คุณลงชื่อเข้าใช้แอปอีเมลด้วยข้อมูลรับรองของคุณหรือไม่ - person Padma Kumar; 28.11.2012
comment
วิธีที่ 'ถูกต้อง' คือคำตอบจากแมกนัส ฉันแนะนำผู้โพสต์ต้นฉบับเพื่อเปลี่ยนคำตอบที่ยอมรับ - person jhabbott; 12.02.2013
comment
การใช้ประเภท MIME เพื่อดำเนินการส่งถือเป็นความคิดที่ไม่ดี เนื่องจากโดยพื้นฐานแล้วคุณกำลังสั่งให้ Android จัดเตรียมรายการแอปที่รองรับการส่งไฟล์ประเภท message/rfc822 นั่นไม่เหมือนกับการส่งอีเมล ใช้โปรโตคอล mailto: แทน เพราะนั่นคือสิ่งที่ไคลเอ็นต์อีเมลเข้าใจจริงๆ - person Paul Lammertsma; 28.05.2013
comment
คำตอบ stackoverflow.com/a/16217921/5245903 ด้านล่างดีกว่ามากและเป็นคำตอบที่ถูกต้อง - person Veneet Reddy; 26.01.2018
comment
ใช้งานได้แต่ต้องเพิ่ม intent.setData(Uri.parse(mailto:)); - person Dev; 22.03.2018
comment
สิ่งนี้ไม่ได้ผลสำหรับฉันในปี 2020 นี่คือวิธีแก้ปัญหาการทำงานของฉัน: stackoverflow.com/a/62877003/2155858 - person Rajeev Jayaswal; 19.12.2020

อัปเดต

แนวทางอย่างเป็นทางการ:

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

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

คำตอบเก่า

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

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","[email protected]", 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
person thanhbinh84    schedule 22.02.2013
comment
คุณพูดถูกและไม่ใช่ทั้งบน 4.2 นี่เป็นคำตอบเดียวที่ถูกต้องจริงๆ ขอบคุณ! - person mDroidd; 31.03.2013
comment
นี่มันสมบูรณ์แบบ มีคนด้านล่างนี้กล่าวถึงว่าการระบุส่วน mailto เป็นสิ่งที่จำกัดตัวเลือกที่มีอยู่ให้แคบลงสำหรับโปรแกรมรับส่งเมล การใช้ Uri.fromParts(mailto, , null) จะทำให้เคอร์เซอร์อยู่ในช่องผู้รับ - เหมาะสำหรับสิ่งที่ฉันต้องการ - person Shaggy; 17.08.2013
comment
มีวิธีจัดร่างกายด้วยวิธีนี้ไหม? - person Malabarba; 31.08.2013
comment
ลองใช้อีเมลนี้Intent.putExtra(Intent.EXTRA_TEXT ฉันชื่อเนื้อหาอีเมล); - person thanhbinh84; 01.09.2013
comment
ในบางกรณี สิ่งนี้ทำให้เกิดข้อยกเว้น: การเรียก startActivity() จากภายนอกบริบทของกิจกรรมจำเป็นต้องมีแฟล็ก FLAG_ACTIVITY_NEW_TASK นี่คือสิ่งที่คุณต้องการจริงๆเหรอ? เพื่อแก้ไขปัญหาดังกล่าว อย่างน้อยก็วิธีนี้ได้ผล: Intent chooser = Intent.createChooser(emailIntent, "Send email..."); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(chooser); - person Jonik; 07.11.2013
comment
หากคุณไม่มีผู้รับที่เจาะจง วิธีนี้ใช้ได้ผลเช่นกัน: Uri.fromParts("mailto", "", null) - person Phil; 13.11.2013
comment
แนบรูปได้มั้ยคะ? - person Arst; 20.10.2014
comment
คุณสามารถลอง i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(pic)) และ i.setType(image/png) แต่คุณต้องตรวจสอบระบบปฏิบัติการหลายเวอร์ชันเนื่องจากฉันมีปัญหาในการแนบไฟล์ txt มันใช้งานได้กับ ของระบบปฏิบัติการ แต่จะแตกต่างจากรุ่นอื่นๆ - person thanhbinh84; 20.10.2014
comment
ทำไมมันไม่ทำงานสำหรับฉัน? ฉันติดตั้งแอปอีเมลแล้ว - person chenzhongpu; 23.10.2014
comment
สิ่งนี้ใช้ไม่ได้กับ Android 4.3 ของฉันอีกต่อไป โปรดตรวจสอบเอกสาร Android อย่างเป็นทางการเกี่ยวกับการส่งอีเมลตามเจตนา ซึ่งทำงานได้อย่างสมบูรณ์แบบ: developer.android.com/guide/components/ - person marcwjj; 13.04.2015
comment
โปรดทราบว่า EXTRA_EMAIL ควรเป็นอาร์เรย์ String เสมอ ไม่ใช่ String ที่มีที่อยู่เดียว เนื่องจากสิ่งนั้นจะถูกละเว้น - person Roel; 17.09.2015
comment
คุณไม่ควรสร้างตัวเลือกถ้าคุณต้องการให้ผู้ใช้ส่งอีเมลโดยตรงไปยังที่อยู่อีเมลที่คุณเลือก อ้างอิง คุณควรทำ startActivity(emailIntent) แทน - person Jelmer Brands; 29.12.2017
comment
สวัสดี ขอบคุณที่ช่วยเรา - person H. Farid; 10.08.2019
comment
โซลูชันนี้ใช้ไม่ได้กับแอป GMX Mail อันนี้ใช้ได้กับทุกแอปที่ฉันทดสอบ stackoverflow.com/a/17886006/1329901 - person Egis; 20.04.2020
comment
น่าเสียดายที่คำตอบเก่าที่เชื่อถือได้นี้ใช้งานไม่ได้อีกต่อไป (ใน Gmail เวอร์ชันล่าสุดใช่ไหม) - ด้วยรหัสนี้ หัวเรื่องและเนื้อหาจะหายไป ตอนนี้วิธีที่ดีที่สุดน่าจะเป็นแนวทางที่ 2 จากที่นี่: medium.com/better-programming/ - person Jonik; 01.12.2020
comment
intent.resolveActivity() ให้คำเตือนดูที่นี่: developer.android.com/training/package-visibility - person Izak; 07.04.2021
comment
เหตุใด MailTo จึงไม่ปรากฏใน Gmail ในคำตอบที่อัปเดต - person Ahmed Elsayed; 28.04.2021

มีสามแนวทางหลัก:

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();
person dira    schedule 25.04.2013
comment
สิ่งนี้ใช้ได้ผลดีกว่ามากสำหรับฉัน - ตัวเลือกอื่น ๆ โผล่ขึ้นมาตรง ๆ (เช่น Skype) เป็นตัวจัดการที่เป็นไปได้ - person Chris Rae; 09.07.2013
comment
หากคุณมีสัญลักษณ์ % อยู่ในบัฟเฟอร์ อักขระบางตัวในอีเมลที่ได้จะเข้ารหัสไม่ถูกต้อง คุณต้องเต้น Uri.encode ที่แนะนำโดย @minipif - person Giulio Piancastelli; 02.08.2013
comment
นี่คือคำตอบที่ดีที่สุดที่นี่ ไม่ต้องเสียเวลาลองคนอื่น อย่างที่สองนี่คือสิ่งที่ฉันเลือกและทำงานได้อย่างสมบูรณ์แบบ แสดงเฉพาะแอปอีเมลล้วนๆ ไม่ใช่ gDrive ไม่ใช่บลูทูธ .. ฯลฯ ขอบคุณ @ becomputer06 - person Hugo; 10.11.2014
comment
ระมัดระวังเกี่ยวกับ & ตัวละคร หากคุณมี & อักขระในเนื้อหาอีเมล วิธีการเหล่านี้จะตัดเนื้อหาออกหลังจาก & ตัวอย่างเช่น ถ้าคุณส่งร่างกายเหมือนฉันเป็น & ร่างกายตัวอย่าง คุณก็จะได้ Just I am - person Emre Koç; 19.10.2015
comment
สำหรับ SENDTO (และใช้ URI.encode หากสำคัญ) โทรศัพท์ของฉันไม่แสดงแอปใด ๆ ที่จะจัดการกับจุดประสงค์ ใน SEND จะแสดง Gmail และในทางเลือกอื่นๆ อีกมากมาย - person Zelphir Kaltstahl; 28.01.2016
comment
คำตอบที่สวยงาม ฉันรู้จักสองคนแรกดีแต่ได้เรียนรู้สิ่งใหม่ๆ โดยเฉพาะอันสุดท้าย เกี่ยวกับ ShareCompat! ขอบคุณ - person sud007; 04.06.2016
comment
ShareCompat ส่งผลให้มีแอปเกือบทั้งหมด ไม่ใช่แค่โปรแกรมรับส่งอีเมลเท่านั้น! - person rpattabi; 22.06.2016
comment
@Zelphir - นั่นก็เกิดขึ้นกับฉันเช่นกัน และไม่มีคำตอบใดที่จัดการไฟล์แนบได้ - person Kristy Welsh; 22.12.2016
comment
แนวทาง #2 ทำงานได้อย่างถูกต้องและตรงกับเอกสาร หากคุณไม่มีไฟล์แนบ นั่นคือสิ่งที่ถูกต้อง สิ่งหนึ่ง - คุณสามารถละเว้นอีเมล recpieints ในคำสั่ง Uri.parse และส่งต่อไปยังจุดประสงค์พิเศษได้ วิธีดำเนินการคือที่นี่: developer.android.com/guide/components/ - person Kirill Starostin; 21.02.2019
comment
ตัวเลือกที่ 3 ที่มี .setType("message/rfc822") ให้ตัวเลือกที่ไม่เกี่ยวข้องมากเกินไปในกล่องโต้ตอบตัวเลือก (Android 8.1) วิธีการ Intent.ACTION_SENDTO แบบเก่าที่ดีนั้นใช้ได้ผลดีที่สุด! - person Kirill Karmazin; 01.04.2019
comment
บน Huawei P10: ตัวเลือกที่ 1 ใช้งานได้ แต่ตัวเลือกที่ 2 และ 3 ส่งผลให้ช่องหัวเรื่องและเนื้อหาไม่ได้รับการกรอกไว้ล่วงหน้า เมื่อเลือก Gmail - person Carmen; 07.10.2019
comment
ใน Android เวอร์ชันล่าสุด (เช่น 10) เฉพาะวิธี URI ที่กำหนดเองเท่านั้นที่ใช้งานได้ - person Tushar Bapte; 21.12.2019
comment
วิธีแรกจะใช้ได้ไม่ดีนัก เนื่องจาก appendQueryParameter จะลบส่วนที่รับออก ข้อมูลเพิ่มเติมที่นี่: stackoverflow.com/a/12035226/485986 - person jpmcosta; 08.01.2020

ข้อมูลนี้อ้างอิงจากเอกสารอย่างเป็นทางการของ 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);
    }
}
person marcwjj    schedule 13.04.2015
comment
ตกลง! ฉันประหลาดใจที่คำตอบเช่นนี้อยู่ไกลจากรายการ ฉันเดาว่ามันคงเป็นการเปลี่ยนแปลงที่ค่อนข้างเร็วใน Android Docs - person Mikey; 01.05.2015
comment
ยอดเยี่ยม! ที่เชื่อถือได้ โดยอ้างอิงถึง 'พระคัมภีร์' ของนักพัฒนาแอป Android - person dev_android; 19.09.2015
comment
ลำไส้ใหญ่หลัง mailto ทำเคล็ดลับให้ฉัน! ฉันใช้ mailto แทน mailto: - person Nigel Crasto; 17.03.2016
comment
การทำงานบน 5.1.1 ตัวเลือกอื่นใช้ไม่ได้สำหรับฉัน - person Juanin; 02.07.2016
comment
ทางออกที่ดี :) - person Abed Putra; 18.07.2017
comment
ทำงานไม่ถูกต้อง ทั้งอีเมลและข้อมูลหัวเรื่องไม่ได้รับการเติมลงในแอป Gmail - person Jonathan; 23.04.2018
comment
นี่เป็นคำตอบเดียวที่ใช้งานได้ โปรดใช้ความระมัดระวังในการตั้งค่า Intent.ACTION_SENDTO เพราะ Intent.ACTION_SEND จะไม่ทำงานกับ mailto: - person Pelanes; 13.05.2018
comment
ตามเอกสาร มีเพียง ACTION_SENDTO เท่านั้นที่ควรแสดงเฉพาะแอปอีเมล แต่ยังไม่อนุญาตให้มีไฟล์แนบด้วย มาได้ยังไง? จะเกิดอะไรขึ้นหากฉันต้องการส่งไฟล์แนบ และต้องการส่งไปยังแอปอีเมลเท่านั้น - person android developer; 22.08.2018
comment
EXTRA_EMAIL ใช้งานไม่ได้สำหรับฉัน ดังนั้นฉันจึงใช้ Uri.parse("mailto: " + myEmail) - person Pratik Butani; 27.11.2018

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

เวอร์ชันจาวา

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:[email protected]"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));

เวอร์ชันคอตลิน

val emailIntent = Intent(Intent.ACTION_SENDTO).apply { 
    data = Uri.parse("mailto:[email protected]")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))

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

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

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

person capt.swag    schedule 03.02.2016
comment
สำหรับฉัน สิ่งสำคัญคือต้องไม่มีช่องว่างระหว่าง mailto และอีเมล: mailto:[email protected] - person AlvaroSantisteban; 13.06.2018
comment
วิธีแก้ปัญหาที่ยอดเยี่ยม ฉันมีข้อกำหนดเดียวกัน ขอบคุณมาก!!!! - person Gyan Swaroop Awasthi; 18.06.2020
comment
โซลูชั่นที่ยอดเยี่ยม คุณจะดีมากถ้าคุณสามารถแสดงวิธีเพิ่มหัวเรื่องและเนื้อหาได้เช่นกัน - person Houman; 01.11.2020

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

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

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

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

person Adil Hussain    schedule 24.01.2015

พยายาม:

intent.setType("message/rfc822");
person Magnus    schedule 03.01.2012
comment
เขาพูดถูก ฉันลองแล้วและเสนอ [ไดรฟ์, อีเมล, Gmail, Skype] นี่ควรเป็นคำตอบที่ถูกต้อง - person gurbieta; 17.11.2012
comment
การใช้ประเภท MIME เพื่อดำเนินการส่งถือเป็นความคิดที่ไม่ดี เนื่องจากโดยพื้นฐานแล้วคุณกำลังสั่งให้ Android จัดเตรียมรายการแอปที่รองรับการส่งไฟล์ประเภท message/rfc822 นั่นไม่เหมือนกับการส่งอีเมล ใช้โปรโตคอล mailto: แทน เพราะนั่นคือสิ่งที่ไคลเอ็นต์อีเมลเข้าใจจริงๆ - person Paul Lammertsma; 28.05.2013

นี่เป็นวิธีที่เหมาะสมในการส่งเจตนาอีเมลตาม 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[]{"[email protected]"});

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

person Avi Parshan    schedule 05.06.2015
comment
@barnacle.m ขอบคุณ! นอกจากนี้ยังเป็นหนึ่งในวิธีง่ายๆ อีกด้วย ปัญหาคือคำตอบของฉันได้รับการโหวตไม่เพียงพอ :( - person Avi Parshan; 01.03.2018
comment
เป็นเพราะว่ามีคำตอบที่คล้ายกันมากมาย แต่คำตอบนี้ชี้ให้เห็นถึงเอกสารอย่างเป็นทางการของ Android ในเรื่องนี้ - person barnacle.m; 01.03.2018
comment
ฉันไม่สามารถส่งที่อยู่อีเมลได้ ฉันแก้ไขมันเช่นนี้ intent.data = Uri.parse(mailto:[email protected]) - person Hitesh Bisht; 11.01.2020
comment
สิ่งนี้ใช้งานไม่ได้จนกว่าฉันจะเปลี่ยน Intent.ACTION_SEND เป็น Intent.ACTION_SENDTO - person Westy92; 07.10.2020
comment
ฉันลืมเสมอว่าค่า 'Intent.EXTRA_EMAIL' จะต้องเป็น Array มิฉะนั้นจะไม่เติมฟิลด์ To ในโปรแกรมรับส่งเมล (อย่างน้อยก็คือไคลเอนต์แอป Gmail ยังไม่ได้ทดสอบโปรแกรมอื่น) - person ProjectDelta; 05.12.2020

ในที่สุดก็เกิดวิธีที่ดีที่สุดที่จะทำ

String to = "[email protected]";
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);
person Ajay Shrestha    schedule 19.06.2017
comment
คุณเก่งมากเพื่อน - person Ashik; 08.09.2017
comment
ไม่มีปัญหานะเพื่อน - person Ajay Shrestha; 08.09.2017
comment
ทำงานได้อย่างสมบูรณ์แบบ - person Solanki Kamlesh; 03.04.2019
comment
ทางออกเดียวที่ใช้งานได้และเปิดแอปอีเมล :) - person Umair; 01.07.2020
comment
คำตอบนี้ควรอยู่ด้านบน - person Emmanuel Njorodongo; 11.06.2021

หากคุณต้องการเฉพาะไคลเอนต์อีเมล คุณควรใช้ 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);
person Addev    schedule 17.02.2014
comment
ไม่ ยังคงแสดงแอปอื่นๆ มากมาย - มากกว่า ACTION_SENDTO มาก - person Dori; 11.06.2014

ใช้งานได้กับ Android ทุกรุ่น:

String[] TO = {"[email protected]"};
    Uri uri = Uri.parse("mailto:[email protected]")
            .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..."));

อัปเดตสำหรับ Android 10 ตอนนี้ใช้ kotlin

fun Context.sendEmail(adress:String?,subject:String?,body:String?){
val TO = arrayOf(adress)
val uri = Uri.parse(adress)
    .buildUpon()
    .appendQueryParameter("subject", subject)
    .appendQueryParameter("body", body)
    .build()
val emailIntent = Intent(Intent.ACTION_SENDTO, uri)
emailIntent.setData(Uri.parse("mailto:$adress"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
emailIntent.putExtra(Intent.EXTRA_EMAIL, TO)
ContextCompat.startActivity(this,Intent.createChooser(emailIntent, "Send 
mail..."),null)
}

หลังจากอัปเดตเป็น API 30 โค้ดไม่ได้กรอกหัวเรื่องและเนื้อหาของไคลเอนต์อีเมล เช่น gmail พบคำตอบ ที่นี่

fun Context.sendEmail(adress: String?, subject: String?, body: String?){

val selectorIntent = Intent(Intent.ACTION_SENDTO)
selectorIntent.data = Uri.parse("mailto:")

val emailIntent = Intent(Intent.ACTION_SEND)
emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(adress))
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
emailIntent.putExtra(Intent.EXTRA_TEXT, body)
emailIntent.selector = selectorIntent

startActivity(Intent.createChooser(emailIntent,
getString(R.string.send_email))) 

}
person Usama Saeed US    schedule 21.03.2016
comment
คำตอบของคุณช่วยฉันได้ ขอบคุณ - person Adnan Khan; 05.10.2016
comment
ไม่ยอมรับเมลแช่ง / ว่างเปล่าจาก gmail ในเวอร์ชัน java - person larsaars; 30.09.2020
comment
อย่าใช้เวอร์ชันจาวาที่ล้าสมัย เพิ่มใหม่เพื่อรองรับ Android เวอร์ชันทั้งหมด - person Usama Saeed US; 01.10.2020

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

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);
person Anam Ansari    schedule 23.10.2013

แก้ไข: ไม่ทำงานกับ 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);
}
person minipif    schedule 26.07.2013
comment
+1 Uri.encode เป็นวิธีที่ถูกต้อง แต่เหตุใดจึงเรียกมันสองครั้งสำหรับประธานและเนื้อหา? - person Giulio Piancastelli; 02.08.2013
comment
ดังนั้นการเข้ารหัสด้วยตัวเองจึงเป็นความคิดที่ไม่ดี ใช้เจตนาที่เหมาะสมพร้อมกับสิ่งพิเศษที่จำเป็น ดูเช่น stackoverflow.com/a/15022222 - person Giulio Piancastelli; 02.08.2013
comment
สำหรับฉัน นี่คือคำตอบที่ดีที่สุดเพราะโซลูชันอื่นๆ ทำงานได้อย่างถูกต้องกับแอปอีเมลบางแอปเท่านั้น อันนี้ใช้งานได้กับทุกแอปอีเมลที่ฉันทดสอบ - person Egis; 20.04.2020

จากเอกสารสำหรับนักพัฒนาซอฟต์แวร์ 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);
    }
}
person marvatron    schedule 08.01.2019

วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉัน นี่เป็นวิธีแก้ปัญหาขั้นต่ำที่ใช้ได้กับ 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..."));
person scottt    schedule 20.03.2015

คำตอบเหล่านี้ส่วนใหญ่จะใช้ได้กับกรณีง่ายๆ เท่านั้นเมื่อคุณไม่ได้ส่งไฟล์แนบ ในกรณีของฉัน บางครั้งฉันต้องส่งไฟล์แนบ (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
}
person David Vávra    schedule 06.01.2018
comment
ดูเหมือนว่าจะมีประโยชน์ มีโอกาสที่จะได้รับมันใน Java หรือไม่? - person Kyle Humfeld; 06.03.2018
comment
Kotlin นั้นคล้ายกับ Java มาก คุณควรจะสามารถคัดลอกและวางและเปลี่ยนแปลงบางสิ่งได้ - person David Vávra; 07.03.2018

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

val emailArrray:Array<String> = arrayOf("[email protected]")
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);
}
person Mughil    schedule 16.04.2019

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

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);
person Suyog Gunjal    schedule 04.12.2015

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

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

หากคุณต้องการให้แน่ใจว่าจุดประสงค์ของคุณได้รับการจัดการโดยแอปอีเมลเท่านั้น (และไม่ใช่แอปส่งข้อความหรือโซเชียลอื่นๆ) ให้ใช้การดำเนินการ 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

person Lamine Slimany    schedule 19.02.2017

การใช้ 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:[email protected]"));
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"));
person Rami Alloush    schedule 10.08.2018
comment
จิตวิญญาณที่สมบูรณ์แบบ - person Daxesh Vekariya; 31.12.2019

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

String uriText =
    "mailto:[email protected]" + 
    "?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")); 
}
person pcodex    schedule 03.02.2018

ฉันกำลังอัปเดตคำตอบของ 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) { "[email protected]" })
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)
}
person Kishan Solanki    schedule 19.09.2018
comment
สิ่งนี้จะล้มเหลวแม้ว่า Gmail จะอยู่ในแอปก็ตาม - person AndroidDev; 11.01.2019
comment
@AndroidDev ในอุปกรณ์ใดที่คุณกำลังประสบปัญหา - person Kishan Solanki; 16.01.2019

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

                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();
                }
person Tushar Bapte    schedule 21.12.2019

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

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

person sianis    schedule 02.01.2012
comment
ธรรมดา/ข้อความแสดง Bluetooth, Skype ฯลฯ ชำระเงินเอาต์พุตที่ต้องการในแอป Android Market ขั้นตอนระบุไว้ในคำถาม - person dira; 02.01.2012
comment
การใช้ประเภท MIME เพื่อดำเนินการส่งถือเป็นความคิดที่ไม่ดี เนื่องจากโดยพื้นฐานแล้วคุณกำลังสั่งให้ Android จัดเตรียมรายการแอปที่รองรับการส่งไฟล์ประเภท plain/text และนั่นไม่ใช่ประเภท MIME ที่ถูกต้องด้วยซ้ำ นั่นไม่เหมือนกับการส่งอีเมล ใช้โปรโตคอล mailto: แทน เพราะนั่นคือสิ่งที่ไคลเอ็นต์อีเมลเข้าใจจริงๆ - person Paul Lammertsma; 28.05.2013

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

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));
person Community    schedule 26.05.2015

ใช้สิ่งนี้:

boolean success = EmailIntentBuilder.from(activity)
        .to("[email protected]")
        .cc("[email protected]")
        .subject("Error report")
        .body(buildErrorReport())
        .start();

ใช้ build gradle :

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
person Manish    schedule 24.10.2016

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

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

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

person grasshopper    schedule 30.12.2016
comment
คุณขาด " ในบรรทัดที่ 2 - person Tim; 30.12.2016

รหัสนี้ใช้งานได้ในอุปกรณ์ของฉัน

Intent mIntent = new Intent(Intent.ACTION_SENDTO);
mIntent.setData(Uri.parse("mailto:"));
mIntent.putExtra(Intent.EXTRA_EMAIL  , new String[] {"[email protected]"});
mIntent.putExtra(Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(mIntent, "Send Email Using..."));
person Mahen    schedule 01.06.2017
comment
มันเปิดเฉพาะ Gmail และอีเมลในอุปกรณ์ของฉันเท่านั้น - person Mahen; 01.06.2017

ส่งถึงลูกค้าทางอีเมลเท่านั้น - พร้อมไฟล์แนบหลายรายการ

มีวิธีแก้ไขปัญหามากมาย แต่ทั้งหมดใช้งานได้เพียงบางส่วน

mailto กรองแอปอีเมลอย่างถูกต้อง แต่ไม่สามารถส่งสตรีม/ไฟล์ได้

message/rfc822 เปิดแอปมากมายพร้อมกับโปรแกรมรับส่งเมล

ดังนั้นวิธีแก้ปัญหาคือใช้ทั้งสองอย่าง

  1. ขั้นแรกให้แก้ไขกิจกรรมเจตนาโดยใช้ mailto intent
  2. จากนั้นตั้งค่าข้อมูลให้กับแต่ละกิจกรรมที่ได้รับการแก้ไขเพื่อส่งข้อมูลที่ต้องการ
private void share()
{
     Intent queryIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
     Intent dataIntent  = getDataIntent();

     Intent targetIntent = getSelectiveIntentChooser(context, queryIntent, dataIntent);
     startActivityForResult(targetIntent);
}

สร้างเจตนาข้อมูลที่จำเป็นซึ่งเต็มไปด้วยข้อมูลที่จำเป็นในการแบ่งปัน

private Intent getDataIntent()
{
        Intent dataIntent = buildIntent(Intent.ACTION_SEND, null, "message/rfc822", null);

        // Set subject
        dataIntent.putExtra(Intent.EXTRA_SUBJECT, title);

        //Set receipient list.
        dataIntent.putExtra(Intent.EXTRA_EMAIL, toRecipients);
        dataIntent.putExtra(Intent.EXTRA_CC, ccRecipients);
        dataIntent.putExtra(Intent.EXTRA_BCC, bccRecipients);
        if (hasAttachments())
        {
            ArrayList<Uri> uris = getAttachmentUriList();

            if (uris.size() > 1)
            {
                intent.setAction(Intent.ACTION_SEND_MULTIPLE);
                dataIntent.putExtra(Intent.EXTRA_STREAM, uris);
            }
            else
            {
                dataIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris.get(0));
            }
        }

        return dataIntent;
}

protected ArrayList<Uri> getAttachmentUriList()
{
        ArrayList<Uri> uris = new ArrayList();
        for (AttachmentInfo eachAttachment : attachments)
        {
            uris.add(eachAttachment.uri);
        }

        return uris;
}

คลาสยูทิลิตี้สำหรับการกรอง Intent ที่ต้องการตาม Intent ของแบบสอบถาม

// Placed in IntentUtil.java
public static Intent getSelectiveIntentChooser(Context context, Intent queryIntent, Intent dataIntent)
{
        List<ResolveInfo> appList = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY);

        Intent finalIntent = null;

        if (!appList.isEmpty())
        {
            List<android.content.Intent> targetedIntents = new ArrayList<android.content.Intent>();

            for (ResolveInfo resolveInfo : appList)
            {
                String packageName = resolveInfo.activityInfo != null ? resolveInfo.activityInfo.packageName : null;

                Intent allowedIntent = new Intent(dataIntent);
                allowedIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
                allowedIntent.setPackage(packageName);

                targetedIntents.add(allowedIntent);
            }

            if (!targetedIntents.isEmpty())
            {
                //Share Intent
                Intent startIntent = targetedIntents.remove(0);

                Intent chooserIntent = android.content.Intent.createChooser(startIntent, "");
                chooserIntent.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
                chooserIntent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION);

                finalIntent = chooserIntent;
            }

        }

        if (finalIntent == null) //As a fallback, we are using the sent data intent
        {
            finalIntent = dataIntent;
        }

        return finalIntent;
}
person Ayyappa    schedule 09.02.2019
comment
ขอบคุณมากสำหรับคำตอบนี้ นี่เป็นคำตอบเดียวที่เหมาะกับฉันในการรวมไฟล์แนบด้วย .. ไม่รู้ว่าทำไมในกรณีนี้การโหวตลงฉันจึงโหวตขึ้นหนึ่งรายการที่นี่ .. - person Petr Nalevka; 05.05.2020

มีวิธีแก้ไขที่ง่ายด้วย ACTION_VIEW:

  Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri data = Uri.parse("mailto:[email protected]?subject=Feedback");
        intent.setData(data);
        startActivity(intent);
person Darksymphony    schedule 23.11.2020

ใช้อังโกะ-คอตลิน

context.email(email, subject, body)
person Ali hasan    schedule 22.09.2018

ด้วย Kotlin ทำงานร่วมกับ Gmail:

val i = Intent(Intent.ACTION_SENDTO).apply {
    type = "text/html"
    data = Uri.parse("mailto:")
    putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
    putExtra(Intent.EXTRA_SUBJECT, subject)
    putExtra(Intent.EXTRA_TITLE, subject)
}
if (packageManager != null && i.resolveActivity(packageManager) != null) {
    startActivity(i)
}

หากใครพบวิธีแก้ปัญหาให้แสดงข้อความด้วย...

person A. Ferrand    schedule 24.02.2020

บางครั้งคุณต้องเปิดแอปอีเมลเริ่มต้นเพื่อดูกล่องจดหมายโดยไม่ต้องสร้างจดหมายใหม่ ในกรณีนี้จะช่วยได้:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
person remain4life    schedule 21.06.2020

ฉันเกือบจะใช้คำตอบทั้งหมดที่นี่บน Android 11 แต่มันทำงานไม่ถูกต้อง บางส่วนไม่ได้วาง mailto ไว้ในช่องที่ต้องกรอก และบางรายการก็ไม่ได้ผลเลยด้วยซ้ำ ดังนั้นฉันจึงได้อ่านเอกสารใหม่และพบว่าอีเมล mailto ควรอยู่ในอาร์เรย์ ดังนั้นในที่สุดสิ่งที่ใช้ได้ผลสำหรับฉันก็อยู่ที่นี่ ขอบคุณสำหรับคำตอบทั้งหมด แต่อย่างใดพวกเขาก็ช่วยได้

//mail me
    findViewById<TextView>(R.id.mailme).setOnTouchListener { _, _ ->
        try {
            val mail: Array<String> = arrayOf("[email protected]")
            val mailme = Intent(Intent.ACTION_SENDTO).apply {
                data = Uri.parse("mailto:")
                putExtra(Intent.EXTRA_EMAIL, mail)
                putExtra(Intent.EXTRA_TEXT, "Hey We Need Your Help With This Issue.")
                putExtra(Intent.EXTRA_SUBJECT, "At Logs Calculator, We Need Your Help !")
            }
            startActivity(mailme)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        true
    }
person Haris    schedule 30.03.2021

ทำตามสิ่งนี้ในจดหมายและคุณไม่น่าจะมีปัญหา

https://developer.android.com/guide/components/intents-common#ComposeEmail

ตรวจสอบให้แน่ใจว่าคุณส่งอาร์เรย์ในฟิลด์ EXTRA_EMAIL ในขณะที่ใช้ ACTION_SENDTO

person Jean Raymond Daher    schedule 26.04.2021