valaquarus | #1 Posté le 17/3/2019 à 20:34:09 |
---|
-- Unus Ex Altera -- | Voici comment les clients de mail donne l'adresse d'une image embarquée dans un message. Cette adresse est relative au fichier en question pourtant même en copiant avec le bon nom, le fichier dans un répertoire temporaire (temp) le fichier html ne retrouve pas ce fichier qui se trouve à côté de lui dans le dit répertoire temporaire. Comment je lui explique à l'html que le fichier c'est celui là. J'écris ce que me renvoi firefox en cliquant sur le lien de l'image (dans le code html) :
l'adresse n'a pas été reconnue. firefox ne sait pas ouvrir cette adresse car l'un des protocoles suivant (cid) n'est associé à aucun programme ou n'est pas autorisé dans ce contexte. Il est peut être ..bla bla bla.
Qu'est ce? cid, c'est content-ID pour rappel.
Philippe P.S. si je pouvais coller des images ce serait un peu plus facile.(Merci de prendre ma demande en considération)
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #2 Posté le 20/3/2019 à 21:38:53 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Salut, il suffit de remplacer : par %3A dans l'url pour que le navigateur ne considère plus ça comme une entête de protocole :
1
| <img src="cid%3A1184456@KDE" />
|
Ref : http://www.blooberry.com/indexdot/html/topics/urlencoding.htm Flachy Joe |
valaquarus | #3 Posté le 21/3/2019 à 12:10:48 |
---|
-- Unus Ex Altera -- | Bonjour Flachy Joe, encore une fois je me suis mal exprimé et donc j'ai eu une réponse à côté de ma demande (mal exprimée). Merci pour le lien celui là je ne l'avais pas lu et pourtant j'ai mangé du MIME et de la RCF. En fait le problème que j'ai c'est dans l'autre sens, le fichier html est déjà formaté je le télécharge dans un répertoire temporaire (temp, et gambas se débrouille) avec ce fichier html arrive un fichier image (genre : signature.png) le lien vers ce fichier est encodé par le serveur de mail avec cette adresse cid:1184456@KDE (typique de kmail) dans le fichier html, comment je lui dit que cid: c'est cid%3A au fichier html. En cliquant sur l'icône du fichier html j'aimerai que celui-ci récupère l'image qui est dans le même répertoire temporaire que le fichier html et l'affiche correctement au bon endroit. Ouille, si toi y en a compris toi être très grand sachem. Philippe
1
2
| Replace("< img src=" & "*" & " />", "cid:", "cid%3A") pour cela <img src="cid:979595064@KDE" />
|
Ne fonctionne pas.Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #4 Posté le 21/3/2019 à 20:02:06 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | De ce que je comprend, dans ton HTML tu as 1
| <img src="cid:979595064@KDE" />
|
mais le fichier de la pièce jointe n'a absolument pas le même nom : signature.png. C'est ça ? Il me semble tu devrais avoir quelque chose comme ça dans la source brute du message :
1
2
| Content-Type: image/png; name="signature.png" Content-ID: <979595064@KDE>
|
Ce qui te permettra de faire le lien entre le nom utilisé dans le html et le fichier joint. Flachy Joe |
valaquarus | #5 Posté le 21/3/2019 à 20:21:06 |
---|
-- Unus Ex Altera -- | Oui Flachy Joe c'est là dessus que je butte. Voici ce que j'ai fais :
1
2
3
4
5
6
7
8
9
10
11
12
13
| WITH Module1.POP[n] FOR p = 0 TO .Message.Part.Count - 1 IF .Message.Part[p].ContentType LIKE "*image*" THEN ' ****************' ' image incluse dans message sContentID = .Message.Part[p].ContentId sImage = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) PRINT "boucle 1" PRINT "monImage = "; monImage ENDIF NEXT END WITH
|
mais je n'arrive pas à faire le lien pour que le fichier html ouvre bien le fichier image et le positionne là où il doit être dans la page. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #6 Posté le 21/3/2019 à 21:07:18 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Il faut que tu stock les associations CID / Filename puis que tu remplaces dans le html
1
2
3
4
5
6
7
8
9
10
11
12
| DIM lesimages AS Collection, img AS STRING '...
'ta boucle... c.Add(sImage, sContentID) ENDIF NEXT
'remplacement FOR img IN lesimages lehtml = Replace(lehtml, "cid:" & lesimages.Key, img) NEXT
|
EDIT : Tu peux même te passer du fichier temporaire et du décodage si tu veux, en introduisant directement le code base64 dans la balise img. Quelques infos ici : http://www.bellami.fr/encoder-ses-images-en-base64 Flachy Joe |
valaquarus | #7 Posté le 21/3/2019 à 21:19:37 |
---|
-- Unus Ex Altera -- | Flachy Joe : Je cours essayer PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
valaquarus | #8 Posté le 21/3/2019 à 22:22:44 |
---|
-- Unus Ex Altera -- | 1
2
3
4
5
6
7
8
9
10
11
| DIM lesimages AS Collection, img AS STRING lesimages = NEW Collection '*************************************************** IF .Message.Part[p].ContentType LIKE "*image*" THEN sContentID = .Message.Part[p].ContentId sImage = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) lesimages.Add(sImage, sContentID) ENDIF
|
pour l'image
1
2
3
4
5
6
7
8
9
| IF .Message.Part[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) FOR EACH img IN lesimages monHtml = Replace(monHtml, "cid:" & lesimages.Key, img) NEXT ENDIF
|
pour le html
Je n'obtiens rien de plus, dommage, j'aimais bien l'idée ou alors je l'ai très mal exploité. Philippe
EDIT : je conserve le répertoire temporaire car je veux les fichiers provenant du serveur de mails dedans.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
Flachy Joe | #9 Posté le 22/3/2019 à 20:50:44 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Est-ce que tu utilises des points d’arrêt et/ou l’exécution pas à pas pour vérifier ce qui se passe ? Tu peux partager ton code complet ? Flachy Joe |
valaquarus | #10 Posté le 22/3/2019 à 20:57:28 |
---|
-- Unus Ex Altera -- | Bonsoir Flachy Joe, il n'y a aucun problème pour le partage du code. Où veux tu que je le dépose (il fait en tout 670 ko)? Je peux le joindre ici ou le déposer sur la forge (il est fonctionnel mais il me manque ce que j'ai tenté de te décrire). Dis moi! PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
valaquarus | #11 Posté le 22/3/2019 à 21:12:56 |
---|
-- Unus Ex Altera -- | Voici le bout de code où la lecture des mails se fait et où les pièces sont sauvegardées dans le répertoire temporaire.
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
| PUBLIC SUB ReadMail(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.Count = 0 THEN sContentType = .Message.Body.ContentType iCode = .Message.Body.ContentEncoding maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Part0 -" & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body.Data IF .Message.Body.ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Body.Data File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) '******************************* PRINT "part=0 html"; ", p="; p PRINT "monHtml = "; monHtml '******************************* ENDIF IF .Message.Body.ContentType LIKE "*image*" AND .Message.Body.ContentDisposition NOT LIKE "*attachment*" THEN sContentID = .Message.Body.ContentId sImage = .Message.Body.FileName sDecode = .Message.Body.Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) '******************************* PRINT "part=0"; ", p="; p PRINT "monImage = "; monImage '******************************* ENDIF ELSE IF .Message.Body.Count > 0 THEN ' **************** ' multipart/alternative 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 IF .Message.Body[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Body[p].Data File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) '******************************* PRINT "body >0, html"; ", p="; p PRINT "monHtml = "; monHtml '******************************* ENDIF IF .Message.Body[p].ContentType LIKE "*image*" AND .Message.Body[p].ContentDisposition NOT LIKE "*attachment*" THEN sContentID = .Message.Body[p].ContentId sImage = .Message.Body[p].FileName sDecode = .Message.Body[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) '******************************* PRINT "body >0, image"; ", p="; p PRINT "monImage = "; monImage '******************************* ENDIF NEXT ELSE IF .Message.Part.Count > 0 THEN ' *********************** ' multipart/mixed 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 IF .Message.Part[p].ContentType LIKE "*html*" THEN sPartHtml = "Partie Html.html" sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sPartHtml, sDecode) monHtml = File.Name(Module1.dirTemp &/ sPartHtml) '******************************* PRINT "part >0, html"; ", p="; p PRINT "monHtml = "; monHtml '******************************* ENDIF IF .Message.Part[p].ContentType LIKE "*image*" AND .Message.Part[p].ContentDisposition NOT LIKE "*attachment*" THEN sContentID = .Message.Part[p].ContentId sImage = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) '******************************* PRINT "Part >0, image"; ", p="; p PRINT "monImage = "; monImage '******************************* ENDIF NEXT ENDIF ENDIF FOR p = 0 TO .Message.Part.Count - 1 ' ******************* ' attachment IF .Message.Part[p].ContentDisposition LIKE "*attachment*" THEN 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) '******************************* PRINT "attachment "; ", p="; p '******************************* ENDIF IF .Message.Part[p].ContentType LIKE "*image*" AND .Message.Part[p].ContentDisposition NOT LIKE "*attachment*" THEN ' image incluse dans message sContentID = .Message.Part[p].ContentId sImage = .Message.Part[p].FileName sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ sImage) '******************************* PRINT "boucle1, image"; ", p="; p PRINT "monImage = "; monImage '******************************* ENDIF NEXT ENDIF maString1 = .Message.ToString() END WITH ENDIF Module1.POP.Close() Module1.POP = NULL ENDIF
END
|
et comment je récupère les fichiers (dont les images incluses) dans un autre formulaire.
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
| PUBLIC SUB Form_Open() 'ouverture et récupération du message à afficher
DIM i AS INTEGER DIM maPict AS Picture
TextArea1.Clear TextArea2.Clear TextArea3.Clear TextArea4.Clear
TextArea1.Text = FMain.maString TextArea1.Pos = 0 TextArea3.Text = FMain.maString TextArea3.Pos = 0
TextArea2.Text = FMain.maString1 TextArea2.Pos = 0
TextArea4.Text = FMain.maString2 TextArea4.Pos = 0
FMain.Hide()
IF FMain.monIndice <> -1 OR Len(FMain.monHtml) <> 0 OR Len(FMain.monImage) <> 0 THEN pieceJointe.Visible = TRUE
IF Len(FMain.monHtml) <> 0 THEN IF IsNull(Desktop.GetFileIcon(FMain.monHtml, 32, TRUE)) THEN maPict = Picture["internet.png"] ELSE maPict = Desktop.GetFileIcon(FMain.monHtml, 32, TRUE) ENDIF pieceJointe.Add("pièce html" File.Name(FMain.monHtml), maPict) ENDIF
IF FMain.monIndice <> -1 THEN FOR i = 0 TO FMain.monIndice mot.Add("pièce jointe" CStr(i)) SELECT CASE Right(FMain.maPiece[i], 3) ' 'affectation par défaut d'icônes CASE LIKE "png" maPict = Picture["image.png"] CASE LIKE "pdf" maPict = Picture["pdf.png"] CASE ELSE IF IsNull(Desktop.GetFileIcon(FMain.maPiece[i], 32, TRUE)) THEN maPict = Picture["Log.png"] ELSE maPict = Desktop.GetFileIcon(FMain.maPiece[i], 32, TRUE) ENDIF END SELECT pieceJointe.Add(mot[i], File.Name(FMain.maPiece[i]), maPict) ' pieceJointe est l'iconView NEXT ENDIF
IF Len(FMain.monImage) <> 0 THEN IF IsNull(Desktop.GetFileIcon(FMain.monImage, 32, TRUE)) THEN maPict = Picture["image.png"] ELSE maPict = Desktop.GetFileIcon(FMain.monImage, 32, TRUE) ENDIF pieceJointe.Add("Partie Image", File.Name(FMain.monImage), maPict) ENDIF
ENDIF
IF FMain.monIndice = -1 AND Len(FMain.monHtml) = 0 AND Len(FMain.monImage) = 0 THEN pieceJointe.Visible = FALSE pieceJointe.Clear() ENDIF
END
PUBLIC SUB pieceJointe_Activate()
SELECT CASE pieceJointe.Item.Key CASE "pièce html" Desktop.Open(Module1.dirTemp &/ File.Name(FMain.monHtml)) CASE "Partie Image" Desktop.Open(Module1.dirTemp &/ File.Name(FMain.monImage)) CASE "pièce jointe" CInt(Right(pieceJointe.Item.Key Len("pièce jointe)) Desktop.Open(Module1.dirTemp &/ File.Name(FMain.maPiece[CInt(Right(pieceJointe.Item.Key, - Len("pièce jointe"))])) END SELECT
END
|
Sinon je peux tout t'envoyer par messagerie. Philippe EDIT : je rajoute le code d'un fichier html de test d'un mail que je me suis envoyé qui est dans le répertoire temporaire. Tu y reconnaîtra la ligne de la source du fichier image :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "[url=http://www.w3.org/TR/REC-html40/strict.dtd]http://www.w3.org/TR/REC-html40/strict.dtd[/url]"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">test</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br />-- </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Cordialement Philippe </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">GNU/Linux Kubuntu 14.04.5 64 Bits</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><img src="cid:686995197@KDE" /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Unus Ex Altera</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p></body></html>
|
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
valaquarus | #12 Posté le 23/3/2019 à 15:21:39 |
---|
-- Unus Ex Altera -- | Voici ce que j'ai fais, j'ai corrigé chaque fichier html pour que soit effacé cid: dans la source des images incluses et j'ai renommée chaque image incluse comme contendID et ça fonctionne
1
2
3
4
5
6
7
| 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
|
1
2
3
4
5
6
7
| IF .Message.Part[p].ContentType LIKE "*image*" AND .Message.Part[p].ContentDisposition NOT LIKE "*attachment*" THEN sContentID = .Message.Part[p].ContentId sImage = sContentID sDecode = .Message.Part[p].Data File.Save(Module1.dirTemp &/ sImage, sDecode) monImage = File.Name(Module1.dirTemp &/ .Message.Part[p].FileName) ENDIF
|
Firefox ne trouvant plus de "cid:" sur son chemin trouve bien le fichier nommé "1184456@KDE" dans le répertoire et l'affiche. Philippe.
EDIT : Je rajouterai ici que cela ne marche correctement qu'avec les multipart/related et pas avec les mutilpart/mixed qui ne sauvegarde pas le fichier inline, ce qui devrait être le contraire, je ne comprend toujours pas cette bestiole nommé MIME.Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |