valaquarus | #1 Posté le 27/3/2019 à 10:10:17 |
---|
-- Unus Ex Altera -- | Bonjour à tous, nous sommes le 27/mars/2019 et il fait beau du côté de Toulouse.
Voici un bout de code (fonctionnel) qui va lire les mails et rapporter le contenu en le sauvegardant sous forme de fichiers dans un répertoire temporaire (fameux temp). Tous les formats MIME sont lus intégralement et le contenu rapporté sauf pour le "multipart/mixed" qui lui ne rapporte que les pièces jointes et pas les images incluses (alors que dans mes tests j'en ai bien sûr introduit, une) comme si les pièces jointes masquaient les images incluses.
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
| PUBLIC SUB lectureMail(i AS INTEGER, n AS INTEGER)
DIM sDecode AS STRING DIM sFileName AS STRING DIM sPartHtml AS STRING DIM sImage AS STRING DIM sContentType AS STRING DIM p AS INTEGER DIM iCode AS INTEGER DIM sContentID AS STRING
monHtml = "" monImage = "" monIndice = -1 maPiece.Clear
Module1.serveurPop(i) TRY Module1.POP.Open
IF NOT ERROR THEN IF Module1.POP.Count > 0 THEN WITH Module1.POP[n] maString = maString & ("De : ") & .Message.Sender & gb.CrLf ' de maString = maString & ("Objet : ") & .Message.Subject & gb.CrLf ' objet maString = maString & ("À : " & .Message.To & gb.CrLf ' À maString = maString & "UniqueID : " & .UniqueID & gb.CrLf ' UniqueID maString = maString & ("Date : ") & .Message.Headers["Date"] & gb.CrLf maString = maString & ("Réponse à : "& .Message.ReplyTo & gb.CrLf ' ReplyTo maString = maString & ("Taille : ") & .Size & gb.CrLf ' taille maString = maString & ("Type de Contenu : ") & .Message.Part.ContentType
IF .Message.Part.ContentType NOT LIKE "*multipart*" sContentType = .Message.Body.ContentType iCode = .Message.Body.ContentEncoding maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Part0 -" & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body.Data ENDIF
IF .Message.Part.ContentType LIKE "*multipart*" THEN FOR p = 0 TO .Message.Body.Count - 1 sContentType = .Message.Body[p].ContentType iCode = .Message.Body[p].ContentEncoding maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Body - " & p & " - " & " Code = " & iCode & " - - - - - - - - - - - - - - - - - \n " & .Message.Body[p].Data NEXT ENDIF
IF .Message.Body.Count = 0 AND .Message.Part.Count > 0 THEN ' FOR p = 0 TO .Message.Part.Count - 1 sContentType = .Message.Part[p].ContentType IF sContentType LIKE "*multipart/signed*" THEN iCode = .Message.Part[.Message.Part.Count - 1].ContentEncoding ELSE iCode = .Message.Part[p].ContentEncoding ENDIF maString2 = maString2 & "\n - - - - - - - - - - -- - - - - - - - " & " ContentType = " & sContentType & " - Part - " & p & " - " & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - \n " & .Message.Part[p].Data NEXT ENDIF
FOR p = 0 TO .Message.Part.Count - 1 IF .Message.Part[p].ContentType LIKE "*image*" AND .Message.Part[p].ContentDisposition NOT LIKE "*attachment*" THEN ' 'image incluse sContentID = .Message.Part[p].ContentId sImage = sContentID sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) ENDIF IF .Message.Part[p].ContentDisposition LIKE "*attachment*" THEN ' ******************* ' attachment sFileName = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sFileName, sDecode) monIndice += 1 maPiece.Add(File.Name(Module1.dirTemp &/ sFileName), monIndice) ENDIF IF .Message.Part[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Part[p].Data sDecode = Replace$(sDecode, "cid:", "") File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) ENDIF NEXT
FOR p = 0 TO .Message.Body.Count - 1 IF .Message.Body[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Body[p].Data sDecode = Replace$(sDecode, "cid:", "") File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) ENDIF NEXT
maString1 = .Message.ToString() END WITH ENDIF Module1.POP.Close() Module1.POP = NULL ENDIF
END
|
Bonne journée PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #2 Posté le 28/3/2019 à 21:08:04 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Bonsoir, sans le module qui va avec ce code n'est pas très utile, mais j'ai quand même quelques remarques :
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
| PUBLIC SUB lectureMail(i AS INTEGER, n AS INTEGER)
DIM sDecode AS STRING DIM sFileName AS STRING DIM sPartHtml AS STRING DIM sImage AS STRING DIM sContentType AS STRING DIM p AS INTEGER DIM iCode AS INTEGER DIM sContentID AS STRING
monHtml = "" monImage = "" monIndice = -1 maPiece.Clear
Module1.serveurPop(i) TRY Module1.POP.Open
IF NOT ERROR THEN IF Module1.POP.Count > 0 THEN WITH Module1.POP[n] maString = maString & ("De : ") & .Message.Sender & gb.CrLf ' de maString = maString & ("Objet : ") & .Message.Subject & gb.CrLf ' objet maString = maString & ("À : " .Message.T gb.CrL ' À maString = maString & "UniqueID : " & .UniqueID & gb.CrLf ' UniqueID maString = maString & ("Date : ") & .Message.Headers["Date"] & gb.CrLf maString = maString & ("Réponse à : " .Message.ReplyTo & gb.CrLf ' ReplyTo maString = maString & ("Taille : ") & .Size & gb.CrLf ' taille maString = maString & ("Type de Contenu : ") & .Message.Part.ContentType
IF .Message.Part.ContentType NOT LIKE "*multipart*" sContentType = .Message.Body.ContentType iCode = .Message.Body.ContentEncoding maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Part0 -" & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body.Data ELSE 'le test a été fait juste avant inutile de le refaire FOR p = 0 TO .Message.Body.Count - 1 sContentType = .Message.Body[p].ContentType iCode = .Message.Body[p].ContentEncoding maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Body - " & p & " - " & " Code = " & iCode & " - - - - - - - - - - - - - - - - - \n " & .Message.Body[p].Data NEXT ENDIF
IF .Message.Body.Count = 0 THEN 'si .Message.Part.Count=0 la boucle ne tournera pas donc inutile de le tester ' FOR p = 0 TO .Message.Part.Count - 1 sContentType = .Message.Part[p].ContentType IF sContentType LIKE "*multipart/signed*" THEN iCode = .Message.Part[.Message.Part.Count - 1].ContentEncoding ELSE iCode = .Message.Part[p].ContentEncoding ENDIF maString2 = maString2 & "\n - - - - - - - - - - -- - - - - - - - " & " ContentType = " & sContentType & " - Part - " & p & " - " & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - \n " & .Message.Part[p].Data NEXT ENDIF
FOR p = 0 TO .Message.Part.Count - 1 IF .Message.Part[p].ContentType LIKE "*image*" AND .Message.Part[p].ContentDisposition NOT LIKE "*attachment*" THEN ' 'image incluse sContentID = .Message.Part[p].ContentId sImage = sContentID sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) 'ajout des else pour eviter des tests inutiles ELSE IF .Message.Part[p].ContentDisposition LIKE "*attachment*" THEN ' ******************* ' attachment sFileName = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sFileName, sDecode) monIndice += 1 maPiece.Add(File.Name(Module1.dirTemp &/ sFileName), monIndice) ELSE IF .Message.Part[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" 'si il y a plusieurs Part de type html, les contenus vont s'écraser, est-ce voulu ? sDecode = .Message.Part[p].Data sDecode = Replace$(sDecode, "cid:", "") File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) ENDIF NEXT
FOR p = 0 TO .Message.Body.Count - 1 IF .Message.Body[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" 'même remarque qu'au dessus sDecode = .Message.Body[p].Data sDecode = Replace$(sDecode, "cid:", "") File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) ENDIF NEXT
maString1 = .Message.ToString() END WITH ENDIF Module1.POP.Close() Module1.POP = NULL ENDIF
END
|
Flachy Joe |
valaquarus | #3 Posté le 28/3/2019 à 22:09:26 |
---|
-- Unus Ex Altera -- | Bonsoir Flachy Joe,
La partie du module concernant le serveur POP :
1
2
3
4
5
6
7
8
9
10
11
| PUBLIC FUNCTION serveurPop(i AS INTEGER) 'définition du serveur pop
POP = NEW Pop3Client POP.host = FMain.Accounts[i].Server POP.User = FMain.Accounts[i].User POP.Password = FMain.Accounts[i].Pass POP.port = FMain.Accounts[i].Port POP.Encrypt = IIf(FMain.Accounts[i].SSL, net.ssl, Net.none) RETURN
END
|
Pour te répondre :
'le test a été fait juste avant inutile de le refaire Je suis pleinement d'accord même si je ne mesure pas l'écart entre les deux écritures.
'ajout des else pour eviter des tests inutiles Je ne mesure pas très bien le gain entre les deux écritures mais je le prends en compte.
'si il y a plusieurs Part de type html, les contenus vont s'écraser, est-ce voulu ? Ce n'est pas voulu, je n'y ai pas pensé étant persuadé qu'il n'y aurait qu'un part de type html.(pris en compte et modifié) Par contre quand il y a une pièce jointe et une image incluse, elle n'est pas sauvegardée comme si elle était masquée par la pièce jointe.
Philippe.
P.S. merci de tes commentairesSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #4 Posté le 30/3/2019 à 20:39:12 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Simplifier le programme permet de gagner du temps de calcul (même si l'intérêt est limité dans ce cas) et du temps de débogage. Flachy Joe |
spheris | #5 Posté le 7/4/2019 à 09:07:23 |
---|
| Aurais-tu un petit soft pour pouvoir tester l'ensemble de ton code ici présent? |
valaquarus | #6 Posté le 7/4/2019 à 11:22:27 |
---|
-- Unus Ex Altera -- | Oui Spheris je peux mettre tout le soft à disposition (il fait 672KO) Puis je le déposer directement en message privée? PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
valaquarus | #7 Posté le 7/4/2019 à 11:58:27 |
---|
-- Unus Ex Altera -- | Spheris, regarde en MP je t'y ai mis un lien. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
spheris | #8 Posté le 14/4/2019 à 08:21:56 |
---|
| Accès interdit malgré le mot de passe rentré. :( |
valaquarus | #9 Posté le 22/4/2019 à 11:00:55 |
---|
-- Unus Ex Altera -- | Personne n'est intéressé par me répondre aux questions que je pose malgré un grand nombre de lecteurs de mes posts. Je vous salue PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
spheris | #10 Posté le 23/4/2019 à 20:48:33 |
---|
| Si il n'y a pas de réponse, probablement que personne n'a la solution exacte. Je t'ai répondu par message privé |
linuxos | #11 Posté le 26/4/2019 à 23:54:58 |
---|
Un peu de sel, de poivre et la crevette sera... | Bonjour valaquerus,
Malheureusement nous n'avons pas toujours le temps pour répondre aux questions, encore faut il que nous ayons les connaissances pour cela. Il y a bien sur plusieurs lecteurs, tout simplement car pour pouvoir répondre il faut déja prendre connaissance du sujet et en cela nous sommes des lecteurs. Dans le cas présent, comme dans beaucoup de cas il sera difficile de trouver ce qui cloche dans ton code et de t'aider sans avoir le projet et l'environnement lié. Bien des fois il m'a été impossible fournir mes projets pour que l'on m'aide car fournir l'ensemble des fichiers nécessaires n'étaient pas possible ou trop volumineux dans mon cas.
Cela n’empêche pas que nous faisons de notre mieux pour aider les utilisateurs du Forum selon nos disponibilités et compétences.
Le plus facile pour t'aider serait d'avoir le projet ou un extrait fonctionnel et comment et quoi faire pour reproduire le soucis que tu rencontres.
Olivier Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous. |