Java envoi mail avec pièce jointe

Résolu/Fermé
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 - 2 juin 2018 à 10:56
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 - 3 juin 2018 à 13:30
Bonjour,

Je dois créer une application en Java dans laquelle un utilisateur sélectionne un répertoire dans son PC et ça l'envoi par mail en pièce jointe.

J'ai réussi à faire le bouton ouvrir et sélectionner le dossier.

Mais je n'arrive pas à faire le code pour l'envoi d'un mail avec pièce jointe)

Pourriez vous m'aider svp ?
A voir également:

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 juin 2018 à 11:11
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
Modifié le 2 juin 2018 à 19:37
Bonjour,

J'ai à peu près réussi à m'en sortir. Voici le code de la fonction qui va envoyer le mail :

    public void send() {

    
    
    

    final String username = "MonMail"; //ur email
    final String password = "MdpDeMonMail!";

    Properties props = new Properties();
    props.put("mail.smtp.auth", true);
    props.put("mail.smtp.starttls.enable", true);
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props, new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }                            
});

    try {
        
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("MonMail"));//ur email
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(MailDuDestinataire));//u will send to
        message.setSubject("Subject");    
        message.setText("PFA");
        MimeBodyPart messageBodyPart = new MimeBodyPart();
        Multipart multipart = new MimeMultipart();


     
     
    //attached 1 --------------------------------------------
        String file = txtFichier.getText(); // Correspond au chemin du fichier que je renseigne dans ma form
        String fileName = "Fichier";
    messageBodyPart = new MimeBodyPart();   
    DataSource source = new FileDataSource(file);      
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(fileName);
    multipart.addBodyPart(messageBodyPart);
    //------------------------------------------------------    
     
   
   
    
    
        message.setContent(multipart);

       
        System.out.println("sending");
        Transport.send(message);
        System.out.println("Done");
        
   

            
}catch (MessagingException e) {
        e.printStackTrace();
    }
  }
     



Quand j'envois une pièce jointe, ça s'envoi, mais le fichier s'envoi sans l'extension, c'est à dire que c'est à celui qui va le télécharger, de l'ouvrir avec le programme nécessaire, que ce soit un .txt ou .png

Autre chose, quand j'envoie une archive .rar par le même procédé, ça me dit que ça ne s'est aps envoyé car l'archive risque d'être infectée donc ils refusent de l'envoyer. Du coup c'est assez dommage quand on veut envoyer tout un répertoire
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
2 juin 2018 à 19:43
"ça s'envoi, le fichier s'envoi sans l'extension"
Il faut la rajouter dans ton
messageBodyPart.setFileName(fileName);
ici tu as juste mis "Fichier", sans extension.
Exemple :
messageBodyPart.setFileName(file.getName());


"quand j'envoie une archive .rar par (...) l'archive risque d'être infectée donc ils refusent de l'envoyer"
Ça c'est une sécurité de Gmail, indépendant du code Java, voir Types de fichiers bloqués dans Gmail
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
3 juin 2018 à 12:18
D'accord merci !
Maintenant j'ai un dernier problème.
En fait il faut que quand je sélectionne un répertoire et valide, ça doit parcourir tout le répertoire et ajouter en attachement tous les fichiers de type. Dat ou. Conf

Du coup je sais pas trop comment faire ça
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 juin 2018 à 12:40
Sur la partie Java Mail, il te faut une boucle pour faire autant de
multipart.addBodyPart(messageBodyPart);
qu'il y a de fichier à ajouter à ton mail.

Quant à lister les différents fichiers dans ton répertoire tu peux utiliser la méthode File.listFiles
https://docs.oracle.com/javase/10/docs/api/java/io/File.html#listFiles(java.io.FileFilter)

Exemple :

import java.io.File;
import java.util.Arrays;

public class Test {

    public static void main(String[] args) {
        File dir = new File("C:/test");
        File[] files = dir.listFiles(Test::isAllowedFile);
        System.out.println(Arrays.toString(files)); 
    }

    public static boolean isAllowedFile(File f) {
        if (!f.isFile())
            return false;
        String lowerName = f.getName().toLowerCase();
        if (lowerName.endsWith(".dat"))
            return true;
        if (lowerName.endsWith(".conf"))
            return true;
        return false;
    }
}
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
Modifié le 3 juin 2018 à 12:50
Merci pour ta réponse !

Entre temps j'ai trouvé une autre technique de parcours de répertoire, et j'ai essayé d'ajouter chaque pièce jointe ayant .dat à la fin (pour commencer).
Alors ça parcours bien, ça trouve bien tous les fichiers .dat dans le répertoire. Sauf que ça ne les ajoute pas en attachement, j'ai une erreur qui je pense n'est pas trop grâve, mais je ne vois pas comment la gérer.

Voici le code que j'ai utilisé :

 //Parcours du répertoire
        
         boolean bName;
    File repertoire = new File(txtFichier.getText());
File[] files=repertoire.listFiles();

for(int i = 0; i <= files.length ; i++){
    
           String fileName = files[i].getName();
 Pattern uName = Pattern.compile("[a-zA-Z0-9_.+-]+\\.dat");
            Matcher mUname = uName.matcher(fileName);
            bName = mUname.matches();
         if (bName) {
             
               System.out.println(mUname.group());
               
               
               //Attachement fichier
               
               String file = fileName;
        String fileName2 = fileName;
    messageBodyPart = new MimeBodyPart();   
    DataSource source = new FileDataSource(file);      
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(file);
    multipart.addBodyPart(messageBodyPart);
               
               
           }

}




Et le message d'erreur que j'obtiens :


test.dat
test2.dat
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4
at syncnode.fenetre.send(fenetre.java:78)
at syncnode.fenetre.btValiderActionPerformed(fenetre.java:204)
at syncnode.fenetre.access$100(fenetre.java:24)
at syncnode.fenetre$3.actionPerformed(fenetre.java:176)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
3 juin 2018 à 13:04
Pour tester avec l'exemple que tu m'as donné, j'ai essayé comme ceci :

    File repertoire = new File(txtFichier.getText());
File[] files=repertoire.listFiles();

for(int i = 0; i <= files.length ; i++){
    
           String fileName = files[i].getName();
           fileName = files[i].getName().toLowerCase();
           if (fileName.endsWith(".dat"))
           {
               System.out.println(fileName);
               
               String file = fileName;
            messageBodyPart = new MimeBodyPart();   
            DataSource source = new FileDataSource(file);      
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(file);
            multipart.addBodyPart(messageBodyPart);
           }

}

 message.setContent(multipart);

       
        System.out.println("sending");
        Transport.send(message);
        System.out.println("Done");


La même erreur :

test.dat
test2.dat
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4
at syncnode.fenetre.send(fenetre.java:78)
at syncnode.fenetre.btValiderActionPerformed(fenetre.java:215)
at syncnode.fenetre.access$100(fenetre.java:24)
at syncnode.fenetre$3.actionPerformed(fenetre.java:187)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 juin 2018 à 13:07
En Java les indices de tableaux commencent à 0 et terminent à length-1, donc ton
i <= files.length
est faux.

Il faut écrire
for (int i = 0; i < files.length ; i++){
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
3 juin 2018 à 13:11
Effectivement, c'était une erreur de débutant ^^

Ok donc ça c'est réglé, maintenant ça me pose problème lors de l'envoi. Ca dit que le fichier est introuvable.

File repertoire = new File(txtFichier.getText());
File[] files=repertoire.listFiles();

for(int i = 0; i < files.length ; i++){
    
           String fileName = files[i].getName();
           fileName = files[i].getName().toLowerCase();
           if (fileName.endsWith(".dat"))
           {
               System.out.println(fileName);
               
               String file = fileName;
            messageBodyPart = new MimeBodyPart();   
            DataSource source = new FileDataSource(file);      
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(file);
            multipart.addBodyPart(messageBodyPart);
           }

}

 message.setContent(multipart);

       
        System.out.println("sending");
        Transport.send(message);
        System.out.println("Done");




J'ai donc l'erreur suivante :


test.dat
test2.dat
sending
javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: test.dat (Le fichier spécifié est introuvable)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1365)
at javax.mail.Transport.send0(Transport.java:255)
at javax.mail.Transport.send(Transport.java:124)
at syncnode.fenetre.send(fenetre.java:134)
at syncnode.fenetre.btValiderActionPerformed(fenetre.java:215)
at syncnode.fenetre.access$100(fenetre.java:24)
at syncnode.fenetre$3.actionPerformed(fenetre.java:187)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.io.FileNotFoundException: test.dat (Le fichier spécifié est introuvable)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at javax.activation.FileDataSource.getInputStream(FileDataSource.java:97)
at javax.activation.DataHandler.writeTo(DataHandler.java:305)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1692)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:996)
at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:561)
at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:84)
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889)
at javax.activation.DataHandler.writeTo(DataHandler.java:317)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1692)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1315)
... 42 more



Si je comprends bien, il ne peut pas envoyer les fichiers car ils sont introuvables ( chemin non spécifié ? )
0
Kiuega Messages postés 34 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 10 janvier 2020 1
3 juin 2018 à 13:15
J'ai remplacé le code par

if (fileName.endsWith(".dat"))
           {
               System.out.println(fileName);
               
               String file = files[i].getName();
            messageBodyPart = new MimeBodyPart();   
            DataSource source = new FileDataSource(file);      
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(file);
            multipart.addBodyPart(messageBodyPart);
           }


Puisque le file avait pris comme valeur test.dat, mais j'ai toujours le même problème. En faisant files[i].getName(), cela ne me donne pas le chemin du fichier mais encore une fois simplement son nom je suppose
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 juin 2018 à 13:16
Le problème c'est que tu as perdu le dossier en cours de route... donc il ne trouve plus le fichier.

DataSource source = new FileDataSource(file); // file c'est juste le nom du fichier -> incorrect
DataSource source = new FileDataSource(files[i]); // ici c'est le fichier, avec son répertoire -> correct
0