Gambas France BETA


Pas de compte ? Incription

multipart/mixed et image incluse

Ce sujet est résolu.

1
AuteurMessages
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
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
Flachy Joe#2 Posté le 28/3/2019 à 21:08:04
Iguane : Il Gambas Uniquement pour Activer ses NEuronesBonsoir,
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 commentaires
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
Flachy Joe#4 Posté le 30/3/2019 à 20:39:12
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSimplifier 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?
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#7 Posté le 7/4/2019 à 11:58:27
-- Unus Ex Altera --Spheris,
regarde en MP je t'y ai mis un lien.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
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
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
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.
1