Gambas France BETA


Pas de compte ? Incription

src "cid:1184456@KDE"

Ce sujet est résolu.

1
AuteurMessages
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.3
Flachy Joe#2 Posté le 20/3/2019 à 21:38:53
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut,
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.3
Flachy Joe#4 Posté le 21/3/2019 à 20:02:06
Iguane : Il Gambas Uniquement pour Activer ses NEuronesDe 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.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
Flachy Joe#6 Posté le 21/3/2019 à 21:07:18
Iguane : Il Gambas Uniquement pour Activer ses NEuronesIl 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
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
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.3
Flachy Joe#9 Posté le 22/3/2019 à 20:50:44
Iguane : Il Gambas Uniquement pour Activer ses NEuronesEst-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!
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
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; ">&nbsp;</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; ">&nbsp;</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; ">&nbsp;</p></body></html>
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
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.3
1