fabienogli / SMTP

SMTP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SMTP

Reprise de code de POP3
Pour ne pas refaire un code à partir de 0, nous nous sommes servis du code du projet POP3.
Par exemple, on peut revoir les méthodes d'écritures et de lecture de flux via la connexion TCP Nous repronons le code mais l'améliorons également, ainsi nous avons refactorer les méthodes de réecriture dans la classe suivante

public class StreamHandling {

    public static void write(String message, OutputStream outputStream) {
        PrintWriter outToClient = new PrintWriter(outputStream);
        outToClient.write(message);
        outToClient.println();
        outToClient.flush();
    }

    public static String read(InputStream inputStream) {
        String result = "";
        try {
            BufferedReader fromClient = new BufferedReader(new InputStreamReader(inputStream));
            result = fromClient.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String readMultipleLines(InputStream inputStream) {
        StringBuilder data = new StringBuilder();
        try {
            BufferedReader fromServer = new BufferedReader(new InputStreamReader(inputStream));
            String tmp = fromServer.readLine();
            do {
                data.append(tmp).append("\n");
                tmp = fromServer.readLine();
            } while (tmp.length() > 0 && tmp.charAt(0) != '.');
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data.toString();
    }
}

On a également crée la classe suivante :

class BdConnexion{
    
        public static List<Utilisateur> getUtilisateurs();
        public static Utilisateur getUtilisateur(String email);
        public static MailBox getMessages(Utilisateur utilisateur);
        
}

Cette classe nous permet de récupérer les données dans notre basse de donnée et de les transformer en objet.

Le protocole SMTP Avant de développer, nous avons pris le temps d'élaborer des automates pour le Serveur et le Client Automate serveur automate Automate serveur automate Ces automates définissent la futur implémentation du code.
Pour ne pas laisser place à d'éventuels bugs, nous avons réalisé pour le clientSmtp ainsi que pour le serveur des tables de transitions qui anticipent les différentes requêtes.
Ces documents sont disponibles dans le dossier doc. ##Implémentation smtp Côté Serveur

Comme pour l'implémentation du protocole POP3, nous avons une classe Enum qui répertorie les différents états de la connexion smtp :

public  enum StateEnum {CLOSED, CONNECTED, WAIT, SENDER_APPROVED,RECIPIENT_APPROVED,WRITING_MAIL,READY_TO_DELIVER, READY}

Nous avons créé une classe Enum permettant de répertorier les messages côté smtp et Client envoyé

public enum SmtpCodes {
    SeServerSmtptp
    AUTHENTIFICATED("220 Bienvenue sur le Serveur STMP de Mark-Florian-Fabien"),
    OK("250 OK"),
    USER_UNKNOWN("550 Cet utilisateur n'existe pas"),
    MESSAGE("354 Start mail input; end with <CRLF>.<CRLF>"),
    LOGOUT("221 Deconnexion"),
    COMMAND_UNKNOWN("500 Syntax error, command unrecognized"),
    COMMAND_NOTIMPLEMENTED("502 Command not implemented"),
    WRONG_COMMAND("503 Bad sequence of commands"),
    clientSmtp
    MAIL_FROM("MAIL FROM:"),
    RCPT_TO("RCPT TO:"),
    RESET("RSET"),
    EHLO("EHLO "),
    DATA("DATA"),
    QUIT("QUIT"),
    //Not from Stmp but for checking for password
    WRONG_PASSWORD("500 mauvais mot de passe"),
    READY("ready");

    private String message;

    SmtpCodes(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return this.message;
    }
}

Gestion authentification Comme le protocole smtp nous laisse libre quant à l'identification de l'utilisateur, Nous avons décidé, de envoyer un à un le mail ainsi que le mot de passe au serverPop3.

public boolean authentification() {
        write(this.getUtilisateur().getEmail());
        write(this.getUtilisateur().getMdp());
        String response = read();
        if (response.equals(SmtpCodes.AUTHENTIFICATED.toString())) {
            return true;
        }
        return false;
    }

Une fois le clientSmtp identifié, il enverra alors la commande EHLO où nous rentrons dans le protocole.

About

SMTP


Languages

Language:Java 100.0%