getMessageID()
Version imprimable
getMessageID()
après des recherche sur le net.
je trouve que les id des messages dans les headers ne sont pas unique et qu'il se peut que des messages n'aient pas d'id du tout mais par contre j'ai trouvé les UID qui sont comme une sorte de hash de champs de headers.
je crois que je suis proche de la solution . je la mettrais dans la discussion des que je finirais
et encore une fois merci à vous tchiz et Marco.
C'est malheureux de ne pas utiliser les choses pour lesquelles elles sont faites.
POP3 n'est pas fait pour faire ce que tu veux faire. Tu vas faire une usine à gaz alors qu'il suffirait que ton admin réseau gère IMAP. C'est son boulot il doit être capable de le faire.
je lui en avais parlé mais je sais ne quelle perception le mec a de la sécurité mais c'était son argument pour avoir désactivé imap
imap est plus lourd pour le serveur, puisqu'il doit conserver les email, stocker et modifier les fichiers, alors qu'en POP3 els fichiers sont en quasi lecture seule.
Pour ce qui est de POP3, garder localement les UID des messages n'est pas un problème. Tous les client pop3 gardant les messages sur le serveur utilisent une technique similaire. voilà un bout de code d'un truc chez nous qui check un mailserver, je met la section pop3
Pour ce qui est du header message-id, le RFC dit qu'il doit être unique (y a des règles pour ca). Si t'as des non unique, c'est un problème de configuration du serveur mail qui accepte n'importe quoi et du smtp générant le mail qui fait aussi du n'importe quoiCode:
1
2
3
4
5
6
7
8
9 if (folder instanceof POP3Folder) { POP3Folder popFolder = (POP3Folder) folder; if (!this.ignoreList.contains(popFolder.getUID(msgs[i]))) { boolean valid = fireIncomingMail(msgs[i]); msgs[i].setFlag(Flags.Flag.DELETED, valid); if (!valid) { this.ignoreList.add(popFolder.getUID(msgs[i])); } }
je suis en fin arrivé à concrétiser leur fantasme merdique.
j'ai trouvé quelque classe su internet que j'ai modifier d'ici et de là jusqu’ à pouvoir réaliser l'abomination
Classe UIDStore
et voici la classe qui parcours la boite et qui récupère les pièces jointesCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 package bcp.mail.tools; import java.io.File; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; public class UIDStore { @SuppressWarnings("unchecked") private Map uids = new HashMap<String, Boolean>(); @SuppressWarnings("unchecked") public void load(File file) throws IOException { if(file != null && file.exists()) { BufferedReader reader = new BufferedReader(new FileReader(file)); try { String uid = reader.readLine(); while(uid != null) { uids.put(uid,Boolean.FALSE); uid = reader.readLine(); } } finally { reader.close(); } } } @SuppressWarnings("unchecked") public void store(File file) throws IOException { FileWriter writer = new FileWriter(file); try { Iterator<String> iterator = uids.keySet().iterator(); while(iterator.hasNext()) { String uid = iterator.next(); if(uids.get(uid) == Boolean.TRUE) { writer.write(uid); if(iterator.hasNext()) writer.write('\n'); } } } finally { writer.close(); } } @SuppressWarnings("unchecked") public boolean isNew(String uid) { boolean inList = uids.containsKey(uid); uids.put(uid,Boolean.TRUE); return !inList; } }
classe GETPJs
le principe c'est de stocker les UID des message dans un fichier que je parcours lorsque je veux savoir si un message a été traité grâce à la fonction isnew()Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 package bcp.mail.tools; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.mail.FetchProfile; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.UIDFolder; import javax.mail.URLName; import com.sun.mail.pop3.POP3Folder; public class GetPJs { public static final void main(String[] parameters) { try { Object content=null; File file = new File("uids.txt"); UIDStore uids = new UIDStore(); uids.load(file); URLName url = new URLName("pop3", "xx.xx.xx.xx", 110, "","domaine\\user\\aliasexchange", "mdp"); Session session = Session.getDefaultInstance(System.getProperties(),null); Store store = session.getStore(url); store.connect(); POP3Folder inbox = (POP3Folder) store.getFolder("INBOX"); inbox.open(Folder.READ_WRITE); FetchProfile profile = new FetchProfile(); profile.add(UIDFolder.FetchProfileItem.UID); Message[] messages = inbox.getMessages(); inbox.fetch(messages, profile); for (int i = 0; i < messages.length; i++) { String uid = inbox.getUID(messages[i]); if (uids.isNew(uid)) { System.out.print(i); System.out.print(". "); System.out.println(inbox.getMessage(i + 1).getSubject()); content = messages[i].getContent(); if (content instanceof Multipart) { handleMultipart((Multipart)content); } else { handlePart(messages[i]); } } } System.out.println("Done."); uids.store(file); } catch (MessagingException x) { System.out.println(x.getMessage()); } catch (IOException x) { System.out.println(x.getMessage()); } } public static void handleMultipart(Multipart multipart) throws MessagingException, IOException { for (int i = 0, n = multipart.getCount(); i < n; i++) { handlePart(multipart.getBodyPart(i)); } } public static void handlePart(Part part) throws MessagingException, IOException { String disposition = part.getDisposition(); String contentType = part.getContentType(); if (disposition == null) { System.out.println("Null: " + contentType); if ((contentType.length() >= 10) && (contentType.toLowerCase().substring(0, 10) .equals("text/plain"))) { part.writeTo(System.out); } else { System.out.println("Other body: " + contentType); part.writeTo(System.out); } } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) { System.out.println("Attachment: " + part.getFileName() + " : " + contentType); saveFile(part.getFileName(), part.getInputStream()); } else if (disposition.equalsIgnoreCase(Part.INLINE)) { System.out.println("Inline: " + part.getFileName() + " : " + contentType); saveFile(part.getFileName(), part.getInputStream()); } else { System.out.println("Other: " + disposition); } } public static void saveFile(String filename, InputStream input) throws IOException { if (filename == null) { filename = File.createTempFile("xx", ".out").getName(); } File file = new File(filename); for (int i = 0; file.exists(); i++) { file = new File("PJS/"+filename + i); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); BufferedInputStream bis = new BufferedInputStream(input); int aByte; while ((aByte = bis.read()) != -1) { bos.write(aByte); } bos.flush(); bos.close(); bis.close(); } }
et une fois encore merci Tchiz et Marco.