android - मैं अपने एंड्रॉइड एप्लिकेशन से ईमेल कैसे भेज सकता हूं?




email (12)

अन्य समाधान हो सकता है

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[]{"[email protected]"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);

मान लें कि अधिकांश एंड्रॉइड डिवाइस में जीमेल ऐप पहले से स्थापित है।

मैं एंड्रॉइड के लिए एक एप्लीकेशन लिख रहा हूँ। मैं इससे एक ईमेल कैसे भेज सकता हूं?


अपने इरादे को हल करने के लिए केवल ईमेल एपीपीएस प्राप्त करने के लिए आपको कार्रवाई के रूप में ACTION_SENDTO को कार्रवाई और मेलto निर्दिष्ट करने की आवश्यकता है।

private void sendEmail(){

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:" + "[email protected]")); 
    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();
    }

}

ईमेल भेजना इरादों के साथ किया जा सकता है जिसके लिए कोई विन्यास की आवश्यकता नहीं होगी। लेकिन फिर इसे उपयोगकर्ता इंटरैक्शन की आवश्यकता होगी और लेआउट थोड़ा प्रतिबंधित होगा।

उपयोगकर्ता इंटरैक्शन के बिना एक और जटिल ईमेल बनाएं और भेजना अपने स्वयं के ग्राहक के निर्माण में शामिल है। पहली बात यह है कि ईमेल के लिए सन जावा एपीआई अनुपलब्ध है। मुझे ईमेल बनाने के लिए अपाचे Mime4j लाइब्रेरी का लाभ उठाने में सफलता मिली है। सभी nilvec पर दस्तावेज़ों पर nilvec


ईमेल भेजने के लिए इसका इस्तेमाल करें ...

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

निर्माण ग्रेड का उपयोग करें:

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

मैं बहुत समय पहले इसका उपयोग कर रहा हूं और यह अच्छा लगता है, कोई गैर-ईमेल ऐप्स दिखाई नहीं दे रहा है। एक ईमेल भेजने के लिए एक और तरीका ईमेल इरादा:

Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:[email protected]")); // 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);

मैं संलग्न बाइनरी त्रुटि लॉग फ़ाइल के साथ ईमेल भेजने के लिए वर्तमान में स्वीकृत उत्तर की तर्ज पर कुछ उपयोग कर रहा था। जीमेल और के -9 इसे ठीक भेजते हैं और यह मेरे मेल सर्वर पर भी ठीक है। एकमात्र समस्या मेरी मेल क्लाइंट पसंद की थंडरबर्ड थी जिसमें संलग्न लॉग फ़ाइल खोलने / सहेजने में परेशानी थी। वास्तव में यह शिकायत किए बिना फ़ाइल को बिल्कुल भी सहेज नहीं पाया।

मैंने इन मेल के स्रोत कोडों में से एक को देखा और देखा कि लॉग फ़ाइल अनुलग्नक में (समझदारी से) माइम प्रकार 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",
                "[email protected]", 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 विधि को सही इरादे और सही माइम प्रकार से आसानी से खिलाया जा सकता है।

यह तब उपलब्ध गतिविधियों की सूची के माध्यम से जाता है जो प्रोटोकॉल इरादे (जो केवल ईमेल ऐप्स हैं) पर ACTION_SENDTO mailto जवाब देता है और गतिविधियों की उस सूची के आधार पर एक चयनकर्ता बनाता है और सही माइम प्रकार के साथ मूल ACTION_SEND इरादा बनाता है।

एक और फायदा यह है कि स्काइप अब सूचीबद्ध नहीं है (जो आरएफसी 822 माइम प्रकार का जवाब देने के लिए होता है)।


मैंने इस समस्या को कोड की सरल रेखाओं के साथ हल किया क्योंकि एंड्रॉइड प्रलेखन बताता है।

( 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() काम नहीं करेगा और ऐप ईमेल क्लाइंट लॉन्च नहीं करेगा।

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

यह आपको केवल ईमेल क्लाइंट दिखाएगा (साथ ही कुछ अज्ञात कारणों के लिए पेपैल)

 public void composeEmail() {

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

यहां नमूना कार्य करने वाला कोड है जो एंड्रॉइड डिवाइस में मेल एप्लिकेशन खोलता है और लिखने वाले मेल में पते और विषय से स्वत: भर जाता है।

protected void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:[email protected]"));
    intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

सरल इसे आजमाएं

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

        }
    });
}

.setType("message/rfc822") या ACTION_SEND का उपयोग करने की रणनीति उन ऐप्स से मेल खाती है जो ईमेल क्लाइंट नहीं हैं, जैसे एंड्रॉइड बीम और ब्लूटूथ

ACTION_SENDTO और एक mailto: का उपयोग करना mailto: यूआरआई पूरी तरह से काम करता प्रतीत होता है, और डेवलपर दस्तावेज़ में अनुशंसित है । हालांकि, अगर आप इसे आधिकारिक अनुकरणकर्ताओं पर करते हैं और कोई ईमेल खाता सेट अप नहीं किया गया है (या कोई मेल क्लाइंट नहीं है), तो आपको निम्न त्रुटि मिलती है:

असमर्थित कार्रवाई

वह क्रिया वर्तमान में समर्थित नहीं है।

जैसा की नीचे दिखाया गया:

यह पता चला है कि अनुकरणकर्ता 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 <[email protected]>" })
        .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();
}

डेवलपर दस्तावेज़ में अधिक जानकारी प्राप्त करें


मैंने इस कोड का उपयोग डिफ़ॉल्ट मेल ऐप रचना अनुभाग को सीधे लॉन्च करके मेल भेजने के लिए किया था।

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setType("message/rfc822"); 
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"[email protected]"});
    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();
    }




email