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
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
A voir également:
- Ioexception while sending message
- Waptrick java football - Télécharger - Jeux vidéo
- Yahoo mail - Accueil - Mail
- Jeux java itel football - Télécharger - Jeux vidéo
- 1 pièce jointe - Guide
- Publipostage mail - Accueil - Word
4 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
2 juin 2018 à 11:11
2 juin 2018 à 11:11
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
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 :
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
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
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
2 juin 2018 à 19:43
2 juin 2018 à 19:43
"ça s'envoi, le fichier s'envoi sans l'extension"
Il faut la rajouter dans ton
Exemple :
"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
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
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
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
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
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 juin 2018 à 12:40
3 juin 2018 à 12:40
Sur la partie Java Mail, il te faut une boucle pour faire autant de
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 :
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; } }
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
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é :
Et le message d'erreur que j'obtiens :
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)
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
3 juin 2018 à 13:04
Pour tester avec l'exemple que tu m'as donné, j'ai essayé comme ceci :
La même erreur :
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)
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 juin 2018 à 13:07
3 juin 2018 à 13:07
En Java les indices de tableaux commencent à 0 et terminent à length-1, donc ton
Il faut écrire
i <= files.lengthest faux.
Il faut écrire
for (int i = 0; i < files.length ; i++){
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
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.
J'ai donc l'erreur suivante :
Si je comprends bien, il ne peut pas envoyer les fichiers car ils sont introuvables ( chemin non spécifié ? )
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é ? )
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
3 juin 2018 à 13:15
J'ai remplacé le code par
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
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
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 juin 2018 à 13:16
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