android - ईमेल इरादा भेजें




email android-intent (17)

यह कोड मेरे डिवाइस में काम कर रहा है

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

उपरोक्त कोड निम्नलिखित ऐप्स दिखाते हुए एक संवाद खोलता है: - ब्लूटूथ, Google डॉक्स, याहू मेल, जीमेल, ऑर्कुट, स्काइप इत्यादि।

असल में, मैं इन सूची-विकल्पों को फ़िल्टर करना चाहता हूं। मैं केवल ईमेल संबंधित ऐप्स जैसे जीमेल, याहू मेल दिखाना चाहता हूं। यह कैसे करना है?

मैंने 'एंड्रॉइड मार्केट' एप्लिकेशन पर ऐसा उदाहरण देखा है।

  1. एंड्रॉइड मार्केट एप खोलें
  2. किसी भी एप्लिकेशन को खोलें जहां डेवलपर ने अपना ईमेल पता निर्दिष्ट किया है। (यदि आपको ऐसा ऐप नहीं मिल रहा है तो बस मेरा ऐप खोलें: - बाजार: // विवरण? Id = com.becomputer06.vehicle.diary.free, या 'वाहन डायरी' द्वारा खोजें)
  3. 'डेवलपर' पर नीचे स्क्रॉल करें
  4. 'ईमेल भेजें' पर क्लिक करें

संवाद केवल ईमेल ऐप्स जैसे जीमेल, याहू मेल इत्यादि दिखाता है। यह ब्लूटूथ, ऑर्कुट आदि नहीं दिखाता है। कौन सा कोड ऐसे संवाद का उत्पादन करता है?


संपादित करें: जीमेल के नए संस्करणों के साथ अब और काम नहीं कर रहा है

यह एकमात्र तरीका था जिसे मैंने किसी भी पात्र के साथ काम करने के लिए पाया था।

डोरमोन का जवाब अब जाने का सही तरीका है, क्योंकि यह जीमेल के नए संस्करणों में सभी पात्रों के साथ काम करता है।

पुराना उत्तर:

यह रहा मेरा। यह सभी एंड्रॉइड संस्करणों पर काम करता है, विषय और संदेश शरीर समर्थन के साथ, और पूर्ण 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);
}

इनमें से अधिकतर उत्तर केवल एक साधारण मामले के लिए काम करते हैं जब आप अनुलग्नक नहीं भेज रहे होते हैं। मेरे मामले में मुझे कभी-कभी अनुलग्नक (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
}

इनमें से कोई भी समाधान मेरे लिए काम नहीं कर रहा था। लॉलीपॉप पर काम करने वाला एक न्यूनतम समाधान यहां दिया गया है। मेरे डिवाइस पर, केवल जीमेल और मूल ईमेल ऐप्स परिणामस्वरूप चयनकर्ता सूची में दिखाई देते हैं।

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

जब आप अपना इरादा बदल देंगे .setType नीचे की तरह आप पाएंगे

intent.setType("text/plain");

किसी भी फेसबुक या अन्य ऐप्स के साथ, केवल ई-मेल क्लाइंट की सूची प्राप्त करने के लिए android.content.Intent.ACTION_SENDTO का उपयोग करें। बस ईमेल क्लाइंट। उदाहरण के लिए:

new Intent(Intent.ACTION_SENDTO);

मैं सुझाव नहीं दूंगा कि आप सीधे ईमेल ऐप पर जाएं। उपयोगकर्ता को अपना पसंदीदा ईमेल ऐप चुनने दें। उसे बाधित मत करो।

यदि आप ACTION_SENDTO का उपयोग करते हैं, तो putExtra उद्देश्य और पाठ को इरादे में जोड़ने के लिए काम नहीं करता है। विषय और बॉडी टेक्स्ट जोड़ने के लिए उरी का प्रयोग करें।

संपादित करें: हम "text/plain" बजाय message/rfc822 उपयोग एमआईएमई प्रकार के रूप में कर सकते हैं। हालांकि, यह "केवल ईमेल क्लाइंट पेश करने" का संकेत नहीं दे रहा है - यह इंगित करता है "संदेश / आरएफसी 822 डेटा का समर्थन करने वाली कुछ भी पेशकश करें"। इससे आसानी से कुछ एप्लिकेशन शामिल हो सकते हैं जो ईमेल क्लाइंट नहीं हैं।

message/rfc822 .mhtml, .mht, .mime एमआईएमई प्रकार का समर्थन करता है


तीन मुख्य दृष्टिकोण हैं:

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

निम्नलिखित कोड मेरे लिए ठीक काम करता है।

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

प्रयत्न:

intent.setType("message/rfc822");

मैं यही उपयोग करता हूं, और यह मेरे लिए काम करता है:

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

यह उपयोगकर्ता को अपना पसंदीदा ईमेल ऐप चुनने देगा। एकमात्र चीज जो आपको करने की अनुमति नहीं देती है वह प्राप्तकर्ता का ईमेल पता सेट करना है।


यदि आप केवल ईमेल क्लाइंट चाहते हैं तो आपको एक सरणी के साथ 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);

यदि आप यह सुनिश्चित करना चाहते हैं कि आपका इरादा केवल एक ईमेल ऐप (और अन्य टेक्स्ट मैसेजिंग या सोशल ऐप नहीं) द्वारा संभाला जाता है, तो 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 में पाया


यह एंड्रॉइड आधिकारिक दस्तावेज़ से उद्धृत किया गया है, मैंने इसे एंड्रॉइड 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);
    }
}

यह मेरे लिए पूरी तरह से ठीक काम करता है:

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

शायद आपको यह कोशिश करनी चाहिए: intent.setType("plain/text");

मैंने इसे here पाया। मैंने इसे अपने ऐप में इस्तेमाल किया है और यह केवल ई-मेल और जीमेल विकल्प दिखाता है।


स्वीकृत उत्तर 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

रेफरी लिंक


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




android-intent