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.5 |
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. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
spheris | #4 Posté le 3/3/2019 à 22:31:24 |
---|
| N'insulte pas gambix 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. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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 forumSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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.5 |
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. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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
PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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. PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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.5 |
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
PhilippeSystème d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5 |
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.5 |