Question Comment puis-je envoyer des e-mails à partir de mon application Android?


J'écris une application pour Android. Comment puis-je envoyer un e-mail à partir de celui-ci?


464
2018-02-04 06:22


origine


Réponses:


Le meilleur (et le plus simple) consiste à 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.


893
2018-02-04 06:43



Utilisation .setType("message/rfc822") ou le sélecteur vous montrera toutes les (nombreuses) applications qui prennent en charge l'intention d'envoi.


185
2017-12-02 00:03



Je l'utilise depuis longtemps et cela semble bon, aucune application non-mail n'apparaît. Juste une autre façon d'envoyer une intention d'envoyer un email:

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

76
2018-02-27 09:41



J'utilisais quelque chose du type de la réponse actuellement acceptée afin d'envoyer des emails avec un fichier journal d'erreur binaire attaché. GMail et K-9 l'envoient très bien et ça arrive aussi bien sur mon serveur mail. Le seul problème était mon client de messagerie de choix Thunderbird qui avait des problèmes pour ouvrir / enregistrer le fichier journal joint. En fait, il n'a tout simplement pas sauvegardé le fichier sans se plaindre.

J'ai jeté un coup d'oeil à l'un des codes source de ces messages et j'ai remarqué que le fichier joint avait (de manière 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 gérer cette petite erreur avec élégance. Donc c'était un peu bête.

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, la méthode createEmailOnlyChooserIntent peut être facilement alimentée avec l’intention correcte et le type mime correct.

Il passe ensuite par la liste des activités disponibles qui répondent à un ACTION_SENDTO mailto intention de protocole (qui sont des applications de messagerie uniquement) et construit un sélecteur basé sur cette liste d'activités et l'intention d'origine ACTION_SEND avec le type MIME correct.

Un autre avantage est que Skype n'est plus répertorié (ce qui arrive à répondre au type rfc822 mime).


48
2017-10-09 16:07



À JUSTE LAISSEZ-VOUS DES APPLICATIONS PAR EMAIL Pour résoudre votre intention, vous devez spécifier ACTION_SENDTO en tant qu'action et mailto en tant que 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
2018-04-02 10:27



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

En 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 aucun compte de messagerie configuré (ou qu'il n'y a pas de clients de messagerie), vous obtenez l'erreur suivante:

Action non prise en charge

Cette action n'est actuellement pas prise en charge.

Comme indiqué ci-dessous:

Unsupported action: That action is not currently supported.

Il se trouve que les émulateurs résolvent l'intention d'une activité appelée com.android.fallback.Fallback, qui affiche le message ci-dessus. Apparemment, c'est par conception.

Si vous souhaitez que votre application contourne ce problème pour qu'il fonctionne également correctement sur les émulateurs officiels, vous pouvez le vérifier avant d'essayer d'envoyer le courrier électronique:

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
2018-06-25 13:52



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

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

En passant, si vous envoyez un vide Extra, la if() à la fin ne fonctionnera pas et l'application ne lancera pas le client de messagerie.

Selon la documentation Android. Si vous souhaitez vous assurer que votre intention est traitée uniquement par une application de messagerie (et non par d'autres applications de messagerie texte ou de réseau social), utilisez 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);
    }
}

14
2017-07-21 19:03



L'envoi de courrier électronique peut s'effectuer avec des intentions qui ne nécessitent aucune configuration. Mais il faudra alors une interaction de l'utilisateur et la mise en page sera un peu restreinte.

Construire et envoyer un email plus complexe sans interaction de l'utilisateur implique la construction de votre propre client. La première chose est que l'API Sun Java pour le courrier électronique n'est pas disponible. J'ai réussi à tirer parti de la bibliothèque Apache Mime4j pour créer du courrier électronique. Tous basés sur les documents à nilvec.


12
2018-02-04 10:22