Comment puis-je envoyer des e-mails depuis mon application Android?

j'écris une application pour Android. Comment puis-je envoyer un e-mail à partir d'elle?

469
demandé sur Amir Rachum 2010-02-04 09:22:12

18 réponses

la meilleure (et la plus facile) façon est d'utiliser un 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();
}

, Sinon vous devrez écrire votre propre client.

902
répondu Jeremy Logan 2014-08-08 02:21:11

Utiliser .setType("message/rfc822") ou le sélecteur va vous montrer toutes les (nombreuses) des applications qui prennent en charge les envoyer intention.

185
répondu Jeff S 2012-11-22 20:12:37

Je l'utilise depuis longtemps et il semble bon, pas d'applications non-e-mail apparaître. Juste une autre façon d'envoyer un message d'intention:

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: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);
77
répondu Randy Sugianto 'Yuku' 2012-02-29 16:19:27

j'utilisais quelque chose comme la réponse actuellement acceptée afin d'envoyer des e-mails avec un fichier binaire de journal des erreurs joint. GMail et K-9 l'envoient très bien et il arrive aussi très bien sur mon serveur de messagerie. Le seul problème était mon client de courrier de choix Thunderbird qui avait des problèmes avec l'ouverture / sauvegarde du fichier journal joint. En fait, il n'a tout simplement pas sauver le fichier du tout sans se plaindre.

j'ai regardé un des codes source de ces mails et j'ai remarqué que la pièce jointe du fichier journal avait (de façon compréhensible) le type mime message/rfc822 . Bien sûr, cette pièce jointe n'est pas un courriel joint. Mais Thunderbird ne peut pas faire face à cette petite erreur avec élégance. C'était donc une sorte de déception.

après un peu de recherche et d'expérimentation, j'ai trouvé la solution suivante:

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

Il peut être utilisé comme suit:

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

comme vous pouvez le voir, le createEmailOnlyChooserIntent méthode peut être facilement alimentée avec la bonne intention et le type mime correct.

il passe ensuite en revue la liste des activités disponibles qui répondent à une intention de protocole ACTION_SENDTO mailto (qui sont des applications e-mail seulement) et construit un chooser basé sur cette liste d'activités et l'intention originale ACTION_SEND avec le type mime correct.

un autre avantage est que Skype n'est plus listé (ce qui se passe pour répondre à la rfc822 mime type.)

49
répondu tiguchi 2012-10-09 16:07:55

À LAISSE-e-MAIL APPS pour résoudre votre intention, vous devez spécifier ACTION_SENDTO comme Action et mailto comme des Données.

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

}
32
répondu wildzic 2014-04-02 10:27:26

la stratégie d'utilisation de .setType("message/rfc822") ou ACTION_SEND semble également correspondre à des applications qui ne sont pas des clients email, tels que Android Beam et Bluetooth .

utilisant ACTION_SENDTO et un mailto: URI semble fonctionner parfaitement, et est recommandé dans la documentation du développeur . Cependant, si vous faites cela sur les émulateurs officiels et qu'il n'y a pas de comptes de messagerie établis (ou il n'y a pas de mail clients), vous obtenez l'erreur suivante:

action non soutenue

cette action n'est pas actuellement soutenue.

comme indiqué ci-dessous:

Unsupported action: That action is not currently supported.

il s'avère que les émulateurs résoudre l'intention à une activité appelée com.android.fallback.Fallback , qui affiche le ci-dessus message. apparemment, c'est fait exprès.

si vous souhaitez que votre application contourne ce qui fonctionne aussi correctement sur les émulateurs officiels, vous pouvez le vérifier avant d'essayer d'envoyer l'e-mail:

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

trouver plus d'informations dans la documentation du développeur .

18
répondu Sam 2015-06-25 13:52:05

j'ai résolu ce problème avec des lignes de code simples comme la documentation android explique.

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

Le plus important est le drapeau: il est ACTION_SENDTO , et pas ACTION_SEND

l'autre ligne importante est

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

soit dit en passant, si vous envoyez un Extra vide , le if() à la fin ne fonctionnera pas et l'application ne lancera pas le client email.

selon la documentation Android. Si vous voulez vous assurer que votre intention est traitée seulement par une application de courrier électronique (et non d'autres messages textes ou applications sociales), puis utiliser le ACTION_SENDTO action et inclure le " mailto: " schéma de données. Par exemple:

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);
    }
}
15
répondu Pedro Varela 2018-03-26 14:13:06

envoyer un e-mail peut être fait avec des intentions qui ne nécessiteront aucune configuration. Mais ensuite, il aura besoin de l'utilisateur et la mise en page est un peu restreinte.

construire et envoyer un e-mail plus complexe sans interaction avec l'utilisateur implique de construire votre propre client. La première chose est que L'API Java de Sun pour le courriel n'est pas disponible. J'ai réussi à utiliser la bibliothèque Mime4j D'Apache pour créer du courrier électronique. Tous basés sur le docs à nilvec .

12
répondu Rene 2014-01-27 13:17:29

simple essayer celui-ci

 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
répondu NagarjunaReddy 2012-10-04 12:59:03

j'utilise le code ci-dessous dans mes applications. Cela montre exactement les applications client email, telles que 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)));
3
répondu lomza 2016-09-20 17:48:24

Voici l'exemple de code de travail qui ouvre application de courrier dans appareil android et auto-rempli avec à l'adresse et objet dans le courrier de composition.

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);
    }
}
3
répondu Sridhar Nalam 2018-01-16 19:16:01

une autre solution peut être

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

en supposant que la plupart de L'appareil android a L'application GMail déjà installé.

2
répondu silentsudo 2015-12-28 09:55:04

utilisez ceci pour envoyer un e-mail...

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

utiliser build gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
2
répondu Manish 2016-10-24 11:32:10

cette fonction d'abord gmail d'intention directe pour l'envoi de courrier électronique, si gmail n'est pas trouvé, puis promouvoir le choix d'intention. J'ai utilisé cette fonction dans de nombreuses applications commerciales et cela fonctionne très bien. Espérons qu'il vous aidera:

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);
        }
    }
}
2
répondu Shohan Ahmed Sijan 2017-05-22 10:05:39

cela ne vous montrera que les clients email (ainsi que PayPal pour une raison inconnue)

 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();
    }
}
2
répondu Avi Parshan 2017-09-01 09:08:38

C'est comme ça que je l'ai fait. Simple et sympathique.

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);
1
répondu Dog Lover 2016-08-23 14:24:22

cette méthode fonctionne pour moi. Il ouvre L'application Gmail (si elle est installée) et définit 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);
}
0
répondu psycho 2017-11-26 20:53:43

j'ai utilisé ce code pour envoyer du courrier en lançant l'application mail default composez la section directement.

    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();
    }
0
répondu Faris Muhammed 2018-04-29 05:31:26