Envoi des e-mails

Emettre les e-mails à partir d'une activité Android

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

L'envoi des mails peut paraître un domaine reservé à des applications web. Cependant, il est également possible d'intégrer cette fonctionnalité dans une application Android. A travers cet article on verra comment le faire sur l'exemple d'une activité contenant le formulaire de contact, si repandu dans le monde du web.

Envoyer des e-mails sous Android

Dans cette partie on ne va pas se concentrer sur le formulaire. Ce sujet sera traité dans l'article consacré à des formulaires sous Android. Ici, juste pour avoir une idée sur les données transmises, on présentera les champs affichés sur l'écran. L'utilisateur pourra donc saisir le titre, le contenu de son message ainsi que l'adresse e-mail à laquelle on peut lui répondre. Il devra également choisir la catégorie de son mail.

Toutes ces informations seront gérées dans la méthode handleForm() de la classe ContactFormActivity. C'est elle aussi qui s'occupera d'envoyer physiquement l'e-mail. Le code qu'on peut utiliser pour envoyer un e-mail sous Android se présente ainsi :

public class ContactFormActivity extends BaseActivity {
    // ...
    public void handleForm(View view) {
        // some validation before
        if (!hasErrors) {
            StringBuffer message = new StringBuffer();
            message.append("Type of demand : ");
            message.append("
");
            message.append(demandType);
            message.append("Content : ");
            message.append("
");
            message.append(content.getText().toString());
            message.append("Sender :");
            message.append("
");
            message.append(mail.getText().toString());
            // TODO : (plus tard) tester si cela envoie vraiement l'e-mail
            Log.d(LOG_TAG, "No errors found. Send an e-mail.");
            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{MainApplication.SENDER_MAIL, mail.getText().toString()});
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, title.getText().toString());
            emailIntent.putExtra(Intent.EXTRA_TEXT, message.toString());
            emailIntent.setType("message/rfc882");
            startActivityForResult(Intent.createChooser(emailIntent, getResources().getString(R.string.email_select_client)), EMAIL_SENT);
        }
    }
}

Tout d'abord on construit le message à l'aide de l'instance StringBuffer. Le message contient toutes les informations saisies par l'utilisateur. Ensuite on initialise une nouvelle intention dont le constructeur prend en paramètre l'action d'envoi de données à quelqu'un d'autre (Intent.ACTION_SEND, en occurrence pour signaler l'envoi d'un mail).

Plus loin on détermine les paramètres qui doivent être passées à la nouvelle activité qui s'occupera d'envoyer l'e-mail. Les paramètres saisis sont :
- Intent.EXTRA_EMAIL : indique un tableau des adresses e-mail auxquelles on doit envoyer le message
- Intent.EXTRA_SUBJECT : précise le titre du message envoyé
- Intent.EXTRA_TEXT : à utiliser avec l'action Intent.ACTION_SEND, spécifie les données textuelles à envoyer par l'activité

L'appel de la méthode setType() permet de spécifier le type MIME du message traité par l'activité. Le type message/rfc822 indique qu'il s'agit d'un message e-mail qui peut contenir des en-têtes supplémentaires.

A la fin on démarre une activité qui s'occupera d'envoyer l'e-mail. Intent.createChooser permet à afficher une liste de clients mail à travers lesquels le message redigé sera envoyé. Cela peut être utile dans le cas où l'utilisateur possède plusieurs clients en fonction du caractère du mail (professionnel, privé, familial...).

Vérifier si l'e-mail a été envoyé sous Android

Comme on a déjà évoqué dans l'article sur les activités sous Android, la méthode startActivityForResult() permet de s'assurer qu'une action a été correctement exécutée. Cette vérification s'applique également dans le cas d'envoi d'un e-mail. Vu que cette partie a déjà été expliquée, ici on va juste afficher le code grâce auquel on peut contrôler l'état de l'envoi d'un e-mail :

public class ContactFormActivity extends BaseActivity {
    // ...
    private final static int EMAIL_SENT = 1;

    public void handleForm(View view) {
        // ...
        startActivityForResult(Intent.createChooser(emailIntent, getResources().getString(R.string.email_select_client)), EMAIL_SENT);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String message = "";
        if (requestCode == EMAIL_SENT) {
            if (resultCode == RESULT_OK) {
                message = getResources().getString(R.string.mail_sent_ok);
            } else {
                message = getResources().getString(R.string.mail_sent_error);
            }
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    }
}

Mais attention, le code ci-dessus n'est pas obligé de fonctionner pour tous les clients e-mail.

Ecrire un client SMTP qui va vérifier la réception des mails d'une manière plus certaine et plus universelle.

Bartosz KONIECZNY Communication

Une question ? Une remarque ?

*

*

Un conseil PHP

Comment créer un signature key pour OAuth

Un signature key est l'un des deux composants qui constituent la signature de la requête OAuth. Il est composé de : - la clé secrète que le fournisseur (Google, Yahoo...) attribue au client, elle doit être toujours présente dans le signature key - le ticket secret qui est renvoyé à de différentes étapes de l'échange avec le web service du fournisseur; s'il est absent (comme lors de la récupération du ticket de la requête), il faut alors passer une chaîne de caractères vide Les deux paramètres doivent être encodés. Une méthode pour générer le signature key peut se présenter ainsi :

function setSignatureKey($tokenSecret)
{
  return str_replace('%7E', '~', rawurlencode($this->userData['secret'])).'&'.str_replace('%7E', '~', rawurlencode($tokenSecret));
}