Accueil

Downloads

Service d'envoi d'images

1. Introduction

Le but du projet est d'envoyer par mail des images prises à l'aide d'une Webcam. Un service de simulation de prise d'images  est fourni. De plus, optionnelement, deux services de gestion d'une webcam peuvent être télécharghés afin de tester l'application dans des conditions réelles. Le projet consiste donc dans la création de deux services :
  1. Un service client qui demande régulierement une image au service de gestion de la webcam et l'envoie par mail à une adresse mail configurée au préalable dans un fichier de paramètres de type .properties.
  2. un service d'envoi de mail qui emballe les APIs  javax.mail



2. Spécifications de l'interface du service de gestion de la webcam

Ce service est représenté par l'interface insa.webcam.ifc.JMStudioIfc et met à disposition la méthode int[][] getSnapShot(), qui rend un tableau d'entiers de deux dimensions représentant l'image prise par la Webcam en format RGB. Afin de pouvoir envoyer l'image par mail il faut la sauvegarder dans un fichier temporaire. Le code permettant de sauvegarder une image à partir d'un tableau d'entiers est le suivant :
  private void saveImage(int[][] imgRGB, String filename) {
    try {
      bimg = new BufferedImage(imgRGB.length, imgRGB[0].length, BufferedImage.TYPE_INT_RGB);
      for (int i = 0; i < imgRGB.length; i++)
        for (int j = 0; j < imgRGB[0].length; j++)
          bimg.setRGB(i, j, imgRGB[i][j]);
    try {
            System.out.println("Save image : "+ filename);       
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
      JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimg);
      int quality = 100;
      quality = Math.max(0, Math.min(quality, 100));
      param.setQuality((float) quality / 100.0f, false);
      encoder.setJPEGEncodeParam(param);
      encoder.encode(bimg);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }


3. Les services demandés

3.1. Le service d'envoi de mail

Ce service sera représenté par l'interface insa.mailclient.ifc.SendMailIfc et doit mettre à disposition la méthode void send(String smtpServer, String to, String from, String subject, String body, String filename). Cette méthode permettra d'envoyer un mail avec les paramètres suivants :
Pour cela le service doit emballer les APIs javax.mail :

    1. créer une session mail

    Properties props = System.getProperties();
    props.put("mail.smtp.host", smtpServer);
    Session session = Session.getInstance(props, null);
   

    2. créer un message

  private MimeMessage getAttachementMessage(
    Session session,
    String from,
    String to,
    String subject,
    String body,
    String filename) {
    MimeMessage msg = null;
    // create a message
    try {
      msg = new MimeMessage(session);
      msg.setFrom(new InternetAddress(from));
      InternetAddress[] address = { new InternetAddress(to)};
      msg.setRecipients(Message.RecipientType.TO, address);
      msg.setSubject(subject);
            msg.setText(body);
      // create and fill the first message part
      if (filename != null) {
        File f = new File(filename);
        if (f.exists()) {
          MimeBodyPart mbp1 = new MimeBodyPart();
          mbp1.setText(body);
          // create the second message part
          MimeBodyPart mbp2 = new MimeBodyPart();
          // attach the file to the message
          FileDataSource fds = new FileDataSource(filename);
          mbp2.setDataHandler(new DataHandler(fds));
          mbp2.setFileName(fds.getName());
          // create the Multipart and add its parts to it
          Multipart mp = new MimeMultipart();
          mp.addBodyPart(mbp1);
          mp.addBodyPart(mbp2);
          // add the Multipart to the message
          msg.setContent(mp);
        }
      }
      msg.setSentDate(new Date());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    return msg;
  }

    3. envoyer le message sur appel de la methode send (...)

  public void send(String smtpServer, String to, String from, String subject, String body, String filename) {
    ...
    Message msg = getAttachementMessage(session, from, to, subject, body, filename);
    if (msg != null)
      try {
        Transport.send(msg);
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    ...
  }

3.2. Le service client

Le service client doit demander régulierement une image au service de gestion de la webcam et l'envoyer par mail à l'aide su service de mail ci-dessus. Ainsi il comporte un activateur qui lance une classe implementant l'interface Runnable et qui tournera dans un thread séparé.

3.3. Fichier de parametres externe

Un modele de fichier de paramètres nécessaires de type .properties est aussi disponible pour téléchargement. Ces paramètres doivent être rajoutés au fichier de paramètres bundle.properties d'OSCAR ou le créer si il n'est pas déjà présent. Les paramètres existants doivent être initialisé correctement, mais d'autres paramètres peuvent être rajoutés si l'application cliente en a besoin (par exemple delay à attendre entre deux envois de mail).
insa.mail.sender=*******@insa-lyon.fr         // l'adresse de l'expediteur
insa.mail.receiver=*******@insa-lyon.fr      // l'adresse du destinatiare
insa.mail.smtp=mail.insa-lyon.fr                     // le serveur SMTP à utiliser
insa.mail.tmpfile=******.jpg                          // nom du fichier temporaire pour sauvegarder l'image
...