1. Introduction▲
Lorsqu'on veut envoyer du courrier électronique en utilisant directement Winsock et une connexion à un serveur SMTP, il peut être intéressant de vouloir envoyer des fichiers attachés.
Pour indiquer au serveur SMTP qu'on est en train d'expédier un fichier attaché, on utilise la syntaxe suivante lorsqu'on est en train de transmettre le corps du message:
1.
2.
3.
4.
begin XXX filename
//
ici le contenu encodé du fichier
`
end
Filename est bien évidemment le nom du fichier (e.g. "monimage.jpg") et XXX correspond aux permissions UNIX d'un fichier dans le cas où celui-ci serait reçu par une machine UNIX (typiquement 664 pour un fichier et 744 pour un exécutable).
Cependant et comme toujours, il y a un hic. Il est impossible de transmettre un fichier binaire encodé sur 8 bits directement dans un courrier électronique qui ne supporte qu'un jeu de caractères de 7 bits (pas de caractères étendus). Et de plus, il ne faut utiliser que les caractères imprimables. Il faut donc procéder à un encodage.
Le principe de l'encodage est le suivant: on prend 3 octets de données (donc 3x8 bits) et on les transforme en 4 morceaux de 6 bits, qu'on complète par des 0 pour avoir un octet ASCII. Ensuite, on ajoute 32 au code ASCII obtenu pour avoir un caractère ASCII imprimable (les 32 premiers ne le sont pas).
La fonction ci-après prend un chemin de fichier (e.g "c:\image\image1.jpg") et retourne une chaîne contenant le fichier encodé.
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.
Public
Function
UUEncodeFile
(
strFilePath As
String
) As
String
Dim
intFile As
Integer
Dim
intTempFile As
Integer
Dim
lFileSize As
Long
Dim
strFileName As
String
Dim
strFileData As
String
Dim
lEncodedLines As
Long
Dim
strTempLine As
String
Dim
i As
Long
Dim
j As
Integer
Dim
strResult As
String
strFileName =
Mid
$(
strFilePath, InStrRev
(
strFilePath, "\"
) +
1
)
strResult =
"begin 664 "
+
strFileName +
vbLf
lFileSize =
FileLen
(
strFilePath)
lEncodedLines =
lFileSize \
45
+
1
strFileData =
Space
(
45
)
intFile =
FreeFile
Open strFilePath For
Binary As
intFile
For
i =
1
To
lEncodedLines
If
i =
lEncodedLines Then
strFileData =
Space
(
lFileSize Mod
45
)
End
If
Get
intFile, , strFileData
strTempLine =
Chr
(
Len
(
strFileData) +
32
)
If
i =
lEncodedLines And
(
Len
(
strFileData) Mod
3
) Then
strFileData =
strFileData +
Space
(
3
-
_
(
Len
(
strFileData) Mod
3
))
End
If
For
j =
1
To
Len
(
strFileData) Step
3
strTempLine =
strTempLine +
_
Chr
(
Asc
(
Mid
(
strFileData, j, 1
)) \
4
+
32
)
strTempLine =
strTempLine +
_
Chr
((
Asc
(
Mid
(
strFileData, j, 1
)) Mod
4
) *
16
_
+
Asc
(
Mid
(
strFileData, j +
1
, 1
)) \
16
+
32
)
strTempLine =
strTempLine +
_
Chr
((
Asc
(
Mid
(
strFileData, j +
1
, 1
)) Mod
16
) *
4
_
+
Asc
(
Mid
(
strFileData, j +
2
, 1
)) \
64
+
32
)
strTempLine =
strTempLine +
_
Chr
(
Asc
(
Mid
(
strFileData, j +
2
, 1
)) Mod
64
+
32
)
Next
j
strResult =
strResult +
strTempLine +
vbLf
strTempLine =
""
Next
i
Close intFile
strResult =
strResult &
"'"
&
vbLf
+
"end"
+
vbLf
UUEncodeFile =
strResult
End
Function
Bien sûr, ce code est un peu rudimentaire, mais il montre bien le principe de la compression UUCP.
Bon courage et bon développement,
grafikm_fr.