Gambas France BETA


Pas de compte ? Incription

Format MIME pour mail

Ce sujet est résolu.

1
AuteurMessages
valaquarus#1 Posté le 3/3/2019 à 11:38:27
-- Unus Ex Altera --Bonjour à tous,
voici la question que je pose sur internet :
comment récupérer la structure d'un mail par programmation
J'ai tous les langages qui sortent les uns après les autres mais pas grand chose sur la structure et la récupération de celle-ci par programmation.
Apparemment ceux qui savent se taisent et se cachent.
Un mail est constitué de plusieurs couches imbriquées les unes dans les autres avec des entêtes et des corps de message sans parler de pièces attachées. De plus chaque partie peut être encodée différemment (olé), donc vous aurez compris l'usine à gaz à produire pour lire simplement un mail, morceau par morceau et pièce par pièce avec le bon décodage pour lecture.
Et beh j'y arrive pas.
Pour l'instant je récupère du brut lisible pour contrôle minimal (choix d'importer ou d'effacer du serveur le dit mail) mais ce n'est pas suffisant intellectuellement.
Si quelqu'un s'est déjà penché sur le sujet qu'il sorte des bois (Non je ne pensais pas directement à toi Didier18, en parlant de bois) et se présente, il sera accueilli à bras ouvert.

Olé Hombras
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#2 Posté le 3/3/2019 à 17:50:58
peut être ça:

http://gambaslinux.fr/articles.php?lng=fr&pg=1985

;)
valaquarus#3 Posté le 3/3/2019 à 21:04:45
-- Unus Ex Altera --Merci Spheris,
j'ai déjà fouiner le site de gambix de fond en comble mais pas de réponse, ce que tu me mets en lien renvoi à l'envoi tranquille de mail. Ce que je cherche c'est la structure des mails pour la réception et décodage de ceux-ci qui est nettement plus difficile à contrôler et à programmer. Pour l'instant je récupère la structure brute et pis c'est tout. Je décode pas chaque partie du mail, je ne récupère pas les pièces jointes éventuelles pour les copier dans un répertoire temporaire. pour l'instant je fais le tri, celui là je garde, celui là j'efface ce qui était mon objectif de départ donc atteint mais j'en veux plus, être capable de faire un vrai client de messagerie.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#4 Posté le 3/3/2019 à 22:31:24
N'insulte pas gambix :D
C'est mon site internet. Gambix a un niveau excellence par rapport à nous. Il est dans l'équipe des développeurs gambas.
Je ne sais pas si tu parles italien mais sur le site italien tu as aussi un gars qui est vraiment très fort.
Peut être t'aidera-t-il pour ton souci de mail? son pseudo est Vuot.
;)
valaquarus#5 Posté le 4/3/2019 à 18:42:33
-- Unus Ex Altera --Oh loin de moi l'idée d'insulter qui que ce soit et surtout pas gambix quant au site, ton site je n'ai qu'un seul mot bravo et je le pense vraiment ce n'est pas de la forfanterie. Je suis formateur de métier et je trouve ce site très structuré et pédagogique. Quant à Vuott, son nom me dit quelque chose mais je ne parles pas italien même si google est mon ami, je vais suivre ton conseil et essayer de le contacter.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#6 Posté le 4/3/2019 à 20:21:27
valaquarus,
Après une piste qui pourrait t'aider:
Quand je ne sais pas faire un truc sous gambas, j'utilise un programme externe en lui donnant des paramètres , en l'exécutant directement dans gambas.

Exemple d'envoi de mail avec Mutt en ligne de commande.

dans le code gb, j'écris :
1
EXEC ["mutt", monemaill@toto.com]


Cela me permet de trouver une solution rapide à un problème sur gambas.
;)
valaquarus#7 Posté le 6/3/2019 à 10:44:55
-- Unus Ex Altera --Bonjour Spheris,
je suis allé voir les italiens comme tu me l'a conseillé et effectivement leur forum est un peu plus remuant que le notre, j'y ai trouvé un morceau de réponse pour récupérer les pièces jointes dans un fichier temporaire qu'il faut que j'aille chercher et ouvrir (sais pas encore faire mais j'apprends, c'est le but) je n'ai pas réussi à m'inscrire sur le forum malgré l'aide de google mais on va s'en sortir.
Pas encore testé ton astuce bien que déjà utilisé le shell ou exec mais c'est une piste que je ne laisse pas de côté.
Philippe
PS je t'ai laissé des traces de pas sur ton forum
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#8 Posté le 6/3/2019 à 14:07:24
-- Unus Ex Altera --Bonjour à tous,
voici un bout de 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
WITH Module1.POP[n]

' '**********pièce jointe*********************************************************************************
IF .Message.Part.ContentDisposition LIKE "*attachment*" THEN
sFileName = .Message.Part.FileName
iCode = .Message.Part.ContentEncoding
sIDHeader = .Message.Part.ContentId
sContenu = .Message.Part.ToString()
sDati_allegato = Scan(sContenu, "*" & sIDHeader & ">\n*")[n]
sDecode = Mime.Decode(sDati_allegato, iCode)
File.Save("/tmp" &/ sFileName, sDecode)
ENDIF
' '************ entête ************************************************************************************
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.Body.ContentType
' '*********message**************************************************************************************
IF .Message.Part.Count = 0 THEN
maString2 = .Message.Body.Data ' body decode auto
ELSE
' maString2 = Mime.Decode(.Message.Body.ToString(), 5) ' textarea4 corps message
FOR EACH hPart IN .Message.Part
iCode = .Message.Part.ContentEncoding
sIDHeader = .Message.Part.ContentId
sContenu = .Message.Part.ToString()
sDati_allegato = Scan(sContenu, "*" & sIDHeader & ">\n*")[n]
sDecode = Mime.Decode(sDati_allegato, iCode)
maString2 = sDecode
NEXT
ENDIF
maString1 = .Message.ToString()
'***********************************************************************************************************

END WITH

La ligne 28 suivante : iCode = .Message.Part.ContentEncoding provoque systématiquement une erreur "Not a Part", ah que pourquoi, moi y en a pas comprendre.
Philippe

Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#9 Posté le 6/3/2019 à 21:12:05
As-tu regardé qui a-t-il dans la variable Icode au moment du crash?
Tu dois attendre un Integer à ce que je vois dans la doc.
;)
valaquarus#10 Posté le 7/3/2019 à 08:00:15
-- Unus Ex Altera --Bonjour Spheris,
oui c'est un integer (j'essaye d'utiliser la methode hongroise, pas si évident que ça) mais c'est la suite qui fait crasher module1.pop[n].message.part.contentencoding, il me dit que ce n'est pas une part c'est à dire une partie de message et là je ne comprends pas pourquoi si je commente cette ligne tout le reste jusqu'à sDecode, bien sûr puisque il ne sait pas ce qu'est iCocode, est reconnu comme une partie de message comprends pas la différence.
1
2
3
4
5
DIM sFileName, sDati_allegato, sIDHeader AS STRING
DIM sContenu, sDecode AS STRING
DIM iCode AS INTEGER
DIM sContentType AS STRING
DIM hPart AS MimePart

Je vais faire un print iCode dans la console des fois qu'il trouve autre chose qu'un integer.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#11 Posté le 7/3/2019 à 08:11:29
-- Unus Ex Altera --Voici la réponse de la console :
gmime-CRITICAL **: g_mime_content_disposition_to_string: assertion 'GMIME_IS_CONTENT_DISPOSITION (disposition)' failed
Ça se soigne comment ce truc?
1
2
3
4
5
6
7
8
9
10
FOR EACH .Message.Part
sIDHeader = .Message.Part.ContentId
PRINT "sIDHeader="; sIDHeader
'iCode = .Message.Part.ContentEncoding
sContenu = .Message.Part.ToString()
PRINT "sContenu="; sContenu
sDati_allegato = Scan(sContenu, "*" & sIDHeader & ">\n*")[n]
PRINT "sDati_allegato="; sDati_allegato
' sDecode = Mime.Decode(sDati_allegato, iCode)
NEXT

La console retourne tous les print sauf sIDHeader

Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#12 Posté le 7/3/2019 à 09:34:43
-- Unus Ex Altera --en fait c'est cette toute première phrase
1
IF .Message.Part.ContentDisposition LIKE "*attachment*" THEN
qui provoque l'erreur mentionnée dans le précédent message ce qui fait que je suis de retour à la case départ, avec mon code fonctionnel mais pas intellectuellemnt suffisant :
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
Module1.serveurPop(i)
TRY Module1.POP.Open

IF NOT ERROR THEN
IF Module1.POP.Count > 0 THEN
WITH Module1.POP[n]

' '************ entête ************************************************************************************
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.Body.ContentType
' '*********message**************************************************************************************
IF .Message.Part.Count = 0 THEN
maString2 = .Message.Body.Data ' body decode auto
ELSE
maString2 = Mime.Decode(.Message.Body.ToString(), 5) ' textarea4 corps message

ENDIF
maString1 = .Message.ToString()
'***********************************************************************************************************
END WITH
ENDIF
Module1.POP.Close()
Module1.POP = NULL
ENDIF

J'aimerai faire mieux que ça mais j'y arrive point.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#13 Posté le 8/3/2019 à 08:39:09
-- Unus Ex Altera --Bonjour,
voici mon dernier code de lecture des mails avec les lignes commentées qui ne fonctionnent pas :
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
PUBLIC SUB lectureMail(i AS INTEGER, n AS INTEGER) 'lecture du mail sélectionné

' Dim sFileName, sDati_allegato, sIDHeader As String
' Dim sContenu, sDecode As String
' Dim iCode As Integer
' Dim sContentType As String
DIM p AS INTEGER

Module1.serveurPop(i)
TRY Module1.POP.Open

IF NOT ERROR THEN
IF Module1.POP.Count > 0 THEN
WITH Module1.POP[n]
' '************ entête ************************************************************************************
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.Body.ContentType
' '*********message**************************************************************************************
IF .Message.Part.Count = 0 THEN
maString2 = .Message.Body.Data ' body decode auto
ELSE
' maString2 = Mime.Decode(.Message.Body.ToString(), 5) ' textarea4 corps message

FOR p = 0 TO .Message.Part.Count - 1
' sContentType = .Message.Body[p].ContentType
' sIDHeader = .Message.Part[p].ContentId
' sContenu = .Message.Body[p].ToString()
' sDati_allegato = Scan(sContenu, "*" & sIDHeader & ">\n*")[1]
' iCode = .Message.Body[p].ContentEncoding
' sDecode = Mime.Decode(sDati_allegato, iCode)

' Print "sContentType="; sContentType
' Print "sIDHeader="; sIDHeader
' Print "sContenu="; sContenu
' Print "sDati_allegato="; sDati_allegato
' Print "iCode="; iCode
' Print "sDecode="; sDecode
''* * * * Pi èce jointe******************************************************************************************
' If .Message.Part[p].ContentDisposition Like "attachment" Then
' sFileName = .Message.Part.FileName
' File.Save("/tmp" &/ sFileName, sDecode)
' Endif
maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body[p].Data
NEXT
ENDIF
maString1 = .Message.ToString()
END WITH
ENDIF
Module1.POP.Close()
Module1.POP = NULL
ENDIF

END
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#14 Posté le 8/3/2019 à 10:55:08
-- Unus Ex Altera --Rebonjour,
on fini par avoir quand même des erreurs avec la structure de certains mails du style content-type =mixed d'où une petite correction :
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
PUBLIC SUB lectureMail(i AS INTEGER, n AS INTEGER) 'lecture du mail sélectionné

DIM sContentType AS STRING
DIM p AS INTEGER

Module1.serveurPop(i)
TRY Module1.POP.Open

IF NOT ERROR THEN
IF Module1.POP.Count > 0 THEN
WITH Module1.POP[n]
' '************ entête ************************************************************************************
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.Body.ContentType
' '*********message**************************************************************************************
IF .Message.Part.Count = 0 THEN
sContentType = .Message.Part.ContentType
maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body.Data
ELSE
IF .Message.Body.Count > 0 THEN
FOR p = 0 TO .Message.Body.Count - 1
sContentType = .Message.Part[p].ContentType
maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - " & p & " - - - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body[p].Data
NEXT
ELSE
FOR p = 0 TO .Message.Part.Count - 1
sContentType = .Message.Part[p].ContentType
maString2 = maString2 & "\n - - - - - - - - - - -- - - - - - - - - - - - " & " ContentType = " & sContentType & " - " & p & "- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - \n " & Mime.Decode(.Message.Part.ToString(), 5)
NEXT
ENDIF
ENDIF
maString1 = .Message.ToString()
END WITH
ENDIF
Module1.POP.Close()
Module1.POP = NULL
ENDIF

END

Cette structure emboîtée qui emboîte d'autres structures emboîtées est une horreur à comprendre, la seule page internet compréhensible que j'ai trouvé est plutôt lacunaire :
https://www.commentcamarche.net/contents/175-standard-mime-multipurpose-internet-mail-extensions

Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
valaquarus#15 Posté le 9/3/2019 à 12:56:45
-- Unus Ex Altera --Bonjour à tous,
voici un bout de code à peu près fonctionnel (il faut se battre et sortir des conventions)
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
PUBLIC SUB lectureMail(i AS INTEGER, n AS INTEGER) 'lecture du mail sélectionné

DIM sDati_allegato, sIDHeader AS STRING
DIM sContenu, sDecode AS STRING
DIM sFileName AS STRING

DIM sContentType AS STRING
DIM p AS INTEGER
DIM iCode AS INTEGER

Module1.serveurPop(i)
TRY Module1.POP.Open

IF NOT ERROR THEN
IF Module1.POP.Count > 0 THEN
WITH Module1.POP[n]
' '************ entête ************************************************************************************
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.Body.ContentType
' '*********message**************************************************************************************
IF .Message.Part.Count = 0 THEN
sContentType = .Message.Body.ContentType
iCode = .Message.Body.ContentEncoding

IF sContentType LIKE "*image*" THEN
iCode = .Message.Part[p].ContentEncoding
sContentType = .Message.Part[p].ContentType
sIDHeader = .Message.Part[p].ContentId
sDecode = .Message.Part[p].Data
ENDIF

maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Part0 -" & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - - - - - - - \n " & .Message.Body.Data & "\n" & sDecode

ELSE
IF .Message.Body.Count > 0 THEN
FOR p = 0 TO .Message.Body.Count - 1
sContentType = .Message.Body[p].ContentType
iCode = .Message.Body[p].ContentEncoding
' iCode = .Message.Body[.Message.Body.Count - 1].ContentEncoding

IF sContentType LIKE "*image*" THEN
iCode = .Message.Part[p].ContentEncoding
sContentType = .Message.Part[p].ContentType
sIDHeader = .Message.Part[p].ContentId
sDecode = .Message.Part[p].Data
ENDIF

maString2 = maString2 & "\n - - - - - - - - - - - - - - - - - - - - - " & " ContentType = " & sContentType & " - Body - " & p & " - " & " Code = " & iCode & " - - - - - - - - - - - - - - - - - \n " & .Message.Body[p].Data & "\n" & sDecode

NEXT
' Endif
' If .Message.Part.Count > 0 Then
ELSE
FOR p = 0 TO .Message.Part.Count - 1
sContentType = .Message.Part[p].ContentType
iCode = .Message.Part[p].ContentEncoding
' iCode = .Message.Part[.Message.Part.Count - 1].ContentEncoding
' maString2 = maString2 & "\n - - - - - - - - - - -- - - - - - - - " & " ContentType = " & sContentType & " - Part - " & p & " - " & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - \n " & Mime.Decode(.Message.Part[p].ToString(), 5)

IF sContentType LIKE "*image*" THEN
iCode = .Message.Part[p].ContentEncoding
sContentType = .Message.Part[p].ContentType
sIDHeader = .Message.Part[p].ContentId
sDecode = .Message.Part[p].Data
ENDIF

maString2 = maString2 & "\n - - - - - - - - - - -- - - - - - - - " & " ContentType = " & sContentType & " - Part - " & p & " - " & " Code = " & iCode & "- - - - - - - - - - - - - - - - - - - - \n " & .Message.Part[p].Data & "\n" & sDecode

NEXT

ENDIF

IF .Message.Part[.Message.Part.Count - 1].ContentDisposition LIKE "*attachment*" THEN
sFileName = .Message.Part[.Message.Part.Count - 1].FileName
iCode = .Message.Part[.Message.Part.Count - 1].ContentEncoding
sContentType = .Message.Part[.Message.Part.Count - 1].ContentType
sIDHeader = .Message.Part[.Message.Part.Count - 1].ContentId
sContenu = .Message.Part[.Message.Part.Count - 1].ToString()
sDecode = .Message.Part[.Message.Part.Count - 1].Data
File.Save("/tmp" &/ sFileName, sDecode)
ENDIF

ENDIF

maString1 = .Message.ToString()
END WITH
ENDIF
Module1.POP.Close()
Module1.POP = NULL
ENDIF

END


Pour l'instant les pièces jointes sont bien sauvegardées dans le répertoire temporaire, reste plus qu'à les récupérer et les faire afficher si demandé.
Quant aux images intégrées pour l'instant ça ne veut pas mais j'y arriverai.

Philippe

Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
1