จะส่งอีเมลจากแอปพลิเคชัน Android ของฉันได้อย่างไร


คำตอบ:


978

วิธีที่ดีที่สุด (และง่ายที่สุด) คือการใช้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();
}

มิฉะนั้นคุณจะต้องเขียนลูกค้าของคุณเอง


6
ในรหัสด้านบนไม่มีรหัสผู้ส่งอีเมลจากนั้นข้อความจะส่งอย่างไร
KIRAN KJ

38
KIRAN: คุณต้องดูว่า Intent ทำงานเพื่อทำความเข้าใจเรื่องนี้อย่างไร โดยทั่วไปจะเป็นการเปิดแอปพลิเคชันอีเมลกับผู้รับเรื่องและเนื้อหาที่กรอกไว้แล้ว มันขึ้นอยู่กับแอพอีเมลที่จะทำการส่ง
Jeremy Logan

8
อีเมลไม่ปรากฏในช่อง "ถึง" โดยเริ่มกิจกรรม มีใครรู้บ้าง
Hamza Waqas

11
ความช่วยเหลือที่ดีของความคิดเห็นนี้คือ: message / rfc822
Guilherme Oliveira

22
เพิ่มเหล่านี้เพื่อให้แน่ใจว่าผู้เลือกแสดงเฉพาะแอปอีเมล: Intent i = new Intent(Intent.ACTION_SENDTO); i.setType("message/rfc822"); i.setData(Uri.parse("mailto:"));
Edris

194

การใช้งาน.setType("message/rfc822")หรือตัวเลือกจะแสดงแอปพลิเคชั่น (มาก) ทั้งหมดที่สนับสนุนการส่ง


5
ดีนี่น่าจะมีคะแนนโหวตมากขึ้น tbh คุณจะไม่สังเกตเห็นการทดสอบตัวจำลอง แต่เมื่อคุณไปส่ง "text / plain" บนอุปกรณ์จริงมันจะให้รายการแอพ 15+ !! ดังนั้นขอแนะนำ "message / rfc822" (มาตรฐานอีเมล)
Blundell

7
@Blundell สวัสดี แต่ฉันไม่เห็นความแตกต่างหลังจากเปลี่ยนเป็นmessage/rfc822
วาด

2
คุณสามารถลบบลูทู ธ ออกจากรายการได้หรือไม่? สิ่งนี้จะปรากฏขึ้นพร้อมกับประเภทนี้ +1 แม้ว่าเคล็ดลับเรียบร้อย!
ingh.am

4
บันทึกเบคอนของเรา นึกภาพไม่ออกว่าลูกค้าอธิบายว่าผู้ใช้อาจทวีตคำขอสนับสนุนแทนที่จะส่งอีเมลถึงพวกเขา
Kevin Galligan

1
+1111111 สิ่งนี้สมควรได้รับ +1 อย่างไม่สิ้นสุดเพื่อให้ผู้อื่นเห็นสิ่งนี้ ฉันพลาดส่วนนี้และต้องจัดการกับปัญหานี้มาระยะหนึ่งแล้ว!
ChallengeAccepted

89

ฉันใช้มันมานานแล้วและดูเหมือนว่าไม่มีแอพที่ไม่ใช่อีเมลปรากฏขึ้น อีกวิธีหนึ่งในการส่งเจตนาส่งอีเมล:

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

1
การกระทำที่ไม่สนับสนุน: การกระทำนี้ไม่ได้รับการสนับสนุนในขณะนี้
erdomester

4
lgor G-> เปลี่ยนจาก setType "(plain / text") เป็น setType ("text / plain")
sachit

2
.setType ("message / rfc822") ไม่ใช่ text / plain
The Hungry Androider

1
รหัสนี้จะไม่เจตนาเปิดอีเมล์หรือไม่ ฉันจะส่งอีเมลโดยไม่แสดงเจตนาต่อผู้ใช้ @yuku ฉันต้องการส่งรหัสผ่านไปยังอีเมลได้อย่างไร
Erum

2
คำตอบนี้มีอิทธิพลมาก :)
Nick Volynkin

54

ฉันใช้บางอย่างตามคำตอบที่ยอมรับในปัจจุบันเพื่อส่งอีเมลพร้อมไฟล์บันทึกข้อผิดพลาดไบนารีที่แนบมา GMail และ K-9 ส่งได้ดีและมันก็มาถึงดีบนเมลเซิร์ฟเวอร์ของฉัน ปัญหาเดียวคือไคลเอนต์อีเมลที่ฉันเลือก Thunderbird ซึ่งมีปัญหาในการเปิด / บันทึกไฟล์บันทึกที่แนบมา ในความเป็นจริงมันก็ไม่ได้บันทึกไฟล์เลยโดยไม่บ่น

ฉันได้ดูจากอีเมลเหล่านี้รหัสแหล่งที่มาและพบว่าสิ่งที่แนบแฟ้มบันทึกได้ (เข้าใจ) message/rfc822ประเภทละครใบ้ แน่นอนว่าไฟล์แนบไม่ใช่อีเมลที่แนบมา แต่ทันเดอร์เบิร์ดไม่สามารถรับมือกับข้อผิดพลาดเล็ก ๆ นั้นได้อย่างสง่างาม นั่นเป็นคนเกียจคร้าน

หลังจากการวิจัยและการทดลองเล็กน้อยฉันพบวิธีแก้ปัญหาต่อไปนี้:

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

มันสามารถใช้ดังนี้:

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

อย่างที่คุณเห็นวิธีการ createEmailOnlyChooserIntent สามารถป้อนได้อย่างง่ายดายด้วยเจตนาที่ถูกต้องและประเภท mime ที่ถูกต้อง

จากนั้นจะผ่านรายการกิจกรรมที่มีอยู่ซึ่งตอบสนองต่อความmailtoตั้งใจของโปรโตคอลACTION_SENDTO (ซึ่งเป็นแอปอีเมลเท่านั้น) และสร้างตัวเลือกตามรายการกิจกรรมนั้นและเจตนา ACTION_SEND ดั้งเดิมที่มีประเภทไมม์ที่ถูกต้อง

ข้อดีอีกอย่างคือ Skype ไม่ได้อยู่ในรายการอีกต่อไป (ซึ่งเกิดขึ้นเพื่อตอบสนองต่อประเภท mcfc822)


1
ฉันเพิ่งแทรกโค้ดของคุณและมันใช้งานได้ดี ก่อนหน้านี้เคยมีแอพจดทะเบียนเช่น Google Drive, Skype เป็นต้น แต่ไม่มีวิธีส่งเมล์ออกจากแอพพลิเคชั่นโดยไม่เรียกแอพพลิเคชั่นอื่นหรือไม่? ฉันเพิ่งอ่านบทความเกี่ยวกับไคลเอนต์อีเมลที่ @Rene postet ด้านบน แต่ดูเหมือนว่าซับซ้อนเกินไปสำหรับการส่งอีเมลง่าย ๆ เท่านั้น
Alex Cio

คำตอบที่ยอดเยี่ยม ฉันมี Skype และ Google Drive ด้วยACTION_SENDเช่นกัน
darrenp

1
โซลูชันที่ได้รับความนิยมสูงสุดดังกล่าวจะให้ผลตอบแทน Skype และ Vkontakte เช่นกัน วิธีนี้ดีกว่า
เดนิส Kutlubaev

crashLogFile คืออะไรมันเริ่มต้นที่ไหน pease sepecify
Noufal

@Noufal นี่เป็นเพียงส่วนที่เหลือจากฐานรหัสของฉันเอง มันเป็นFileอินสแตนซ์ที่ชี้ไปยังไฟล์บันทึกข้อขัดข้องแอพ Android ของฉันสร้างขึ้นในพื้นหลังในกรณีที่มีข้อยกเว้นที่ไม่ได้ตรวจสอบ ตัวอย่างนั้นควรอธิบายวิธีเพิ่มไฟล์แนบอีเมล คุณสามารถแนบไฟล์อื่น ๆ จากที่จัดเก็บข้อมูลภายนอกได้ (เช่นรูปภาพ) นอกจากนี้คุณยังสามารถลบบรรทัดนั้นcrashLogFileเพื่อรับตัวอย่างการทำงาน
tiguchi

37

หากต้องการให้LET EMAIL APPSเพื่อแก้ไขเจตนาของคุณคุณต้องระบุ ACTION_SENDTO เป็น Action และ mailto เป็น 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();
    }

}

23

ฉันแก้ไขปัญหานี้ด้วยรหัสบรรทัดง่าย ๆ ตามที่อธิบายในเอกสารประกอบ android

( https://developer.android.com/guide/components/intents-common.html#Email )

ที่สำคัญที่สุดคือธง: มันเป็นACTION_SENDTOและไม่ACTION_SEND

สายสำคัญอื่น ๆ คือ

intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***

โดยวิธีการที่ถ้าคุณส่งที่ว่างเปล่าExtraที่if()ในตอนท้ายจะไม่ทำงานและ app ที่จะไม่เปิดอีเมลไคลเอ็นต์

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

21

กลยุทธ์ของการใช้.setType("message/rfc822")หรือACTION_SENDดูเหมือนว่าจะยังตรงกับปพลิเคชันที่ไม่ได้ส่งอีเมลถึงลูกค้าเช่นAndroid Beamและบลูทู ธ

การใช้ACTION_SENDTOและmailto:URI ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบและเป็นที่แนะนำในเอกสารนักพัฒนา อย่างไรก็ตามหากคุณทำเช่นนี้กับอีมูเลเตอร์อย่างเป็นทางการและไม่มีการตั้งค่าบัญชีอีเมล (หรือไม่มีไคลเอนต์อีเมล) คุณจะได้รับข้อผิดพลาดต่อไปนี้:

การกระทำที่ไม่สนับสนุน

การกระทำนั้นไม่ได้รับการสนับสนุนในปัจจุบัน

ดังแสดงด้านล่าง:

การกระทำที่ไม่รองรับ: การกระทำนั้นไม่ได้รับการสนับสนุนในปัจจุบัน

ปรากฎว่าอีมูเลเตอร์สามารถแก้ไขความตั้งใจในกิจกรรมที่เรียกว่าcom.android.fallback.Fallbackซึ่งแสดงข้อความข้างต้น เห็นได้ชัดว่านี่คือการออกแบบ

หากคุณต้องการให้แอปของคุณหลีกเลี่ยงปัญหานี้เพื่อให้ทำงานได้อย่างถูกต้องบนอีมูเลเตอร์อย่างเป็นทางการคุณสามารถตรวจสอบได้ก่อนลองส่งอีเมล:

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

ค้นหาข้อมูลเพิ่มเติมในเอกสารนักพัฒนา


13

การส่งอีเมลสามารถทำได้ด้วย Intents ซึ่งไม่จำเป็นต้องมีการกำหนดค่า แต่จะต้องมีการโต้ตอบกับผู้ใช้และรูปแบบจะถูก จำกัด เล็กน้อย

สร้างและส่งอีเมลที่ซับซ้อนยิ่งขึ้นโดยที่ผู้ใช้ไม่ต้องดำเนินการใด ๆ เพื่อสร้างลูกค้าของคุณเอง สิ่งแรกคือ Sun Java API สำหรับอีเมลไม่พร้อมใช้งาน ฉันประสบความสำเร็จในการใช้ประโยชน์จากห้องสมุด Apache Mime4j เพื่อสร้างอีเมล ทั้งหมดขึ้นอยู่กับเอกสารที่nilvec


6

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

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

ขอบคุณ เปรียบเทียบกับการแก้ปัญหาของ @Avi Parshan คุณตั้งค่าอีเมลในsetData()และ Avi putExtra()ในชุด ทั้งสองรุ่นใช้งานได้ แต่ถ้าลบsetDataและการใช้งานเท่านั้นintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});, ActivityNotFoundExceptionจะมีการ
CoolMind

5

ฉันใช้รหัสด้านล่างในแอพของฉัน สิ่งนี้แสดงแอปไคลเอนต์อีเมลที่แน่นอนเช่น 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)));

5

สิ่งนี้จะแสดงให้คุณเห็นเฉพาะไคลเอนต์อีเมล (รวมถึง PayPal ด้วยเหตุผลที่ไม่ทราบสาเหตุ)

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

1
ทางออกที่ดี! มันหลีกเลี่ยงแอปพลิเคชั่นที่ไม่เหมาะสมจำนวนมาก (ส่วนใหญ่ใช้เป็น "แชร์") อย่าเพิ่มintent.type = "message/rfc822"; intent.type = "text/html";ที่นี่เพราะจะนำไปสู่ข้อยกเว้น
CoolMind

3

นี่คือวิธีที่ฉันทำ ดีและเรียบง่าย

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

3

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

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

1
ขอบคุณมาก. ช่วยชีวิตฉันด้วย
androCoder-BD

2

ง่ายๆลองอันนี้

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

        }
    });
}

3
นี่เป็นวิธีที่ดีกว่าคำตอบที่มีอยู่แล้วเมื่อคุณโพสต์นี้ ดูเหมือนว่าสำเนาของคำตอบที่ยอมรับซึ่งห่อหุ้มอยู่ในกิจกรรม
Sam

2

วิธีอื่นสามารถ

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

สมมติว่าอุปกรณ์ android ส่วนใหญ่ติดตั้งแอป GMail แล้ว


@PedroVarela เราสามารถตรวจสอบกิจกรรมที่ไม่พบข้อยกเว้น
silentsudo

1
ใช่เราทำได้ แต่ทางออกของคุณไม่ถูกต้อง เอกสารประกอบของ Android ระบุสิ่งที่คุณต้องทำอย่างชัดเจนเพื่อแสดงเฉพาะแอปอีเมลในตัวเลือกเจตนา คุณเขียนว่า "สมมติว่าอุปกรณ์ android ส่วนใหญ่ติดตั้งแอป Gmail ไว้แล้ว"; จะเป็นอย่างไรถ้าเป็นอุปกรณ์รูทและผู้ใช้ลบไคลเอ็นต์ Gmail สมมติว่าคุณกำลังสร้างแอปอีเมลของคุณเองหรือถ้าผู้ใช้กำลังจะส่งอีเมลแอปของคุณจะไม่อยู่ในรายการนั้น จะเกิดอะไรขึ้นถ้า gmail เปลี่ยนชื่อแพ็คเกจ คุณจะอัปเดตแอปของคุณหรือไม่
Pedro Varela

2

ใช้สำหรับส่งอีเมล ...

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'

2

ฉันใช้รหัสนี้เพื่อส่งจดหมายโดยเปิดตัวแอปเมลเริ่มต้นที่เขียนโดยตรง

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

1

วิธีนี้ใช้ได้ผลสำหรับฉัน มันเปิดแอป Gmail (ถ้าติดตั้ง) และตั้งค่า 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);
}

1
/**
 * 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;
}

1
 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**

1

ลองสิ่งนี้:

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
}

รหัสด้านบนจะเปิดไคลเอนต์อีเมลที่ผู้ใช้ชื่นชอบ prefilled พร้อมกับอีเมลพร้อมที่จะส่ง

แหล่ง

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