一般来说,POP3邮件是用MIME进行编码的,在电脑报中有邮件接收和发送邮件的方法,我就不多说了,我单对邮件的MIME编码的解码进行讨论。 邮件MIME编码是由64个安全字符而构成的64进制的字符编码 他们的排序顺序分别是 a→z + A→Z + 0→9 + "+/" 组成 26+26+10+2=64 个安全字符 就像16进制的 0→9 + A→F 一样 下面是完整的代码。Option Explicit Public 进制数(63) As StringPublic Sub 初始化MIME字符集() Dim X As Long For X = 0 To 25 进制数(X) = Chr(65 + X) Next X For X = 0 To 25 进制数(X + 26) = Chr(97 + X) Next X For X = 0 To 9 进制数(X + 52) = Chr(48 + X) Next X 进制数(62) = "+" 进制数(63) = "/" End Sub Public Function 对文字进行MIME编码(要编码字符串 As String) As String Dim X As Long, 字符字节数组() As Byte, 编码数 As Long, 余数 As Long 分析文本为字节 要编码字符串, 字符字节数组
余数 = UBound(字符字节数组) Mod 3 Select Case 余数 Case 0: For X = 1 To UBound(字符字节数组) Step 3 编码数 = 合并字节数组为整数(字符字节数组, X, 3) 对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数) Next X
Case 1: For X = 1 To UBound(字符字节数组) - (UBound(字符字节数组) Mod 3) Step 3 编码数 = 合并字节数组为整数(字符字节数组, X, 3) 对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数) Next X 编码数 = (合并字节数组为整数(字符字节数组, UBound(字符字节数组) - UBound(字符字节数组) Mod 3 + 1, UBound(字符字节数组) Mod 3)) * 16 对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
Case 2: For X = 1 To UBound(字符字节数组) - (UBound(字符字节数组) Mod 3) Step 3 编码数 = 合并字节数组为整数(字符字节数组, X, 3) 对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数) Next X 编码数 = (合并字节数组为整数(字符字节数组, UBound(字符字节数组) - UBound(字符字节数组) Mod 3 + 1, UBound(字符字节数组) Mod 3)) * 4 对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数) End Select End FunctionPublic Function 解释MIME编码为文本(MIME编码 As String) As String Dim 余数 As Long, 循环总数 As Long, 循环数 As Long, 临时字符 As String, 十进制数 As Long, 综合数组() As Long, 中文区位码 As Long 余数 = Len(MIME编码) Mod 4 循环总数 = (Len(MIME编码) - 余数) / 4 Select Case 余数 Case 0: ReDim 综合数组(1 To 循环总数 * 3) Case 1: ReDim 综合数组(1 To 循环总数 * 3 + 1) 综合数组(循环总数 * 3 + 1) = Int(六十四进制转十进制(Right(MIME编码, 1), 进制数) / 16)
Case 3: 临时字符 = Right(MIME编码, 余数) 十进制数 = Int(六十四进制转十进制(临时字符, 进制数) / 4) ReDim 综合数组(1 To 循环总数 * 3 + 2) 综合数组(循环总数 * 3 + 2) = 十进制数 Mod 256 综合数组(循环总数 * 3 + 1) = Int(十进制数 / 256) Mod 256 End Select For 循环数 = 1 To 循环总数 临时字符 = Left(MIME编码, 循环数 * 4) 临时字符 = Right(临时字符, 4) 十进制数 = 六十四进制转十进制(临时字符, 进制数) 综合数组((循环数 - 1) * 3 + 3) = 十进制数 Mod 256 综合数组((循环数 - 1) * 3 + 2) = Int(十进制数 / 256) Mod 256 综合数组((循环数 - 1) * 3 + 1) = Int(十进制数 / 256 / 256) Mod 256 Next 循环数 For 循环数 = LBound(综合数组) To UBound(综合数组) If 综合数组(循环数) >= 33 And 综合数组(循环数) <= 127 Then 解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数)) Else If UBound(综合数组) >= 循环数 + 1 Then If 综合数组(循环数 + 1) >= 127 Then 中文区位码 = 综合数组(循环数) * 256 中文区位码 = 中文区位码 + 综合数组(循环数 + 1) 中文区位码 = 将长数进行16位整数转换(中文区位码) 解释MIME编码为文本 = 解释MIME编码为文本 & Chr(中文区位码) 循环数 = 循环数 + 1 Else 解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数)) End If Else 解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数)) End If End If Next 循环数 End Function Public Function 六十四进制转十进制(六十四进制数 As String, 六十四进制编码() As String) As Variant Dim X As Long, Y As Long, 临时字符 As String, 当前编码数 As Long For X = 1 To Len(六十四进制数) 临时字符 = Left(六十四进制数, X) 临时字符 = Right(临时字符, 1) For Y = 0 To 63 If 临时字符 = 六十四进制编码(Y) Then 当前编码数 = Y Exit For End If Next Y 六十四进制转十进制 = 六十四进制转十进制 + 当前编码数 * 64 ^ (Len(六十四进制数) - X) Next X End Function 使用时必须先使用 "初始化MIME字符集()" 函数 然后再操作 MIME 便编码 这些代码绝对可靠,我已经作了一个类似 Microsoft OutLook 的程序,解码方面绝对没问题 只是可能在代码中有些我自定义的函数我没有注意到的没有放上去,你就自己研究一下吧。因为我的模块都是中文的,相信看起来也比较容易。 好了,给分吧。
下载附件和下载信头一样,只要接收,再取出各部分(包括附件——一般是被base64编码的)
就行了.
邮件MIME编码是由64个安全字符而构成的64进制的字符编码
他们的排序顺序分别是 a→z + A→Z + 0→9 + "+/" 组成 26+26+10+2=64 个安全字符
就像16进制的 0→9 + A→F 一样
下面是完整的代码。Option Explicit
Public 进制数(63) As StringPublic Sub 初始化MIME字符集()
Dim X As Long
For X = 0 To 25
进制数(X) = Chr(65 + X)
Next X
For X = 0 To 25
进制数(X + 26) = Chr(97 + X)
Next X
For X = 0 To 9
进制数(X + 52) = Chr(48 + X)
Next X
进制数(62) = "+"
进制数(63) = "/"
End Sub
Public Function 对文字进行MIME编码(要编码字符串 As String) As String
Dim X As Long, 字符字节数组() As Byte, 编码数 As Long, 余数 As Long
分析文本为字节 要编码字符串, 字符字节数组
余数 = UBound(字符字节数组) Mod 3
Select Case 余数
Case 0: For X = 1 To UBound(字符字节数组) Step 3
编码数 = 合并字节数组为整数(字符字节数组, X, 3)
对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
Next X
Case 1: For X = 1 To UBound(字符字节数组) - (UBound(字符字节数组) Mod 3) Step 3
编码数 = 合并字节数组为整数(字符字节数组, X, 3)
对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
Next X
编码数 = (合并字节数组为整数(字符字节数组, UBound(字符字节数组) - UBound(字符字节数组) Mod 3 + 1, UBound(字符字节数组) Mod 3)) * 16
对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
Case 2: For X = 1 To UBound(字符字节数组) - (UBound(字符字节数组) Mod 3) Step 3
编码数 = 合并字节数组为整数(字符字节数组, X, 3)
对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
Next X
编码数 = (合并字节数组为整数(字符字节数组, UBound(字符字节数组) - UBound(字符字节数组) Mod 3 + 1, UBound(字符字节数组) Mod 3)) * 4
对文字进行MIME编码 = 对文字进行MIME编码 & 十进制转六十四进制(编码数, 进制数)
End Select
End FunctionPublic Function 解释MIME编码为文本(MIME编码 As String) As String
Dim 余数 As Long, 循环总数 As Long, 循环数 As Long, 临时字符 As String, 十进制数 As Long, 综合数组() As Long, 中文区位码 As Long
余数 = Len(MIME编码) Mod 4
循环总数 = (Len(MIME编码) - 余数) / 4
Select Case 余数
Case 0: ReDim 综合数组(1 To 循环总数 * 3)
Case 1: ReDim 综合数组(1 To 循环总数 * 3 + 1)
综合数组(循环总数 * 3 + 1) = Int(六十四进制转十进制(Right(MIME编码, 1), 进制数) / 16)
Case 2: 临时字符 = Right(MIME编码, 余数)
十进制数 = Int(六十四进制转十进制(临时字符, 进制数) / 16)
ReDim 综合数组(1 To 循环总数 * 3 + 1)
综合数组(循环总数 * 3 + 1) = 十进制数
Case 3: 临时字符 = Right(MIME编码, 余数)
十进制数 = Int(六十四进制转十进制(临时字符, 进制数) / 4)
ReDim 综合数组(1 To 循环总数 * 3 + 2)
综合数组(循环总数 * 3 + 2) = 十进制数 Mod 256
综合数组(循环总数 * 3 + 1) = Int(十进制数 / 256) Mod 256
End Select
For 循环数 = 1 To 循环总数
临时字符 = Left(MIME编码, 循环数 * 4)
临时字符 = Right(临时字符, 4)
十进制数 = 六十四进制转十进制(临时字符, 进制数)
综合数组((循环数 - 1) * 3 + 3) = 十进制数 Mod 256
综合数组((循环数 - 1) * 3 + 2) = Int(十进制数 / 256) Mod 256
综合数组((循环数 - 1) * 3 + 1) = Int(十进制数 / 256 / 256) Mod 256
Next 循环数
For 循环数 = LBound(综合数组) To UBound(综合数组)
If 综合数组(循环数) >= 33 And 综合数组(循环数) <= 127 Then
解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数))
Else
If UBound(综合数组) >= 循环数 + 1 Then
If 综合数组(循环数 + 1) >= 127 Then
中文区位码 = 综合数组(循环数) * 256
中文区位码 = 中文区位码 + 综合数组(循环数 + 1)
中文区位码 = 将长数进行16位整数转换(中文区位码)
解释MIME编码为文本 = 解释MIME编码为文本 & Chr(中文区位码)
循环数 = 循环数 + 1
Else
解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数))
End If
Else
解释MIME编码为文本 = 解释MIME编码为文本 & Chr(综合数组(循环数))
End If
End If
Next 循环数
End Function
Public Function 六十四进制转十进制(六十四进制数 As String, 六十四进制编码() As String) As Variant
Dim X As Long, Y As Long, 临时字符 As String, 当前编码数 As Long
For X = 1 To Len(六十四进制数)
临时字符 = Left(六十四进制数, X)
临时字符 = Right(临时字符, 1)
For Y = 0 To 63
If 临时字符 = 六十四进制编码(Y) Then
当前编码数 = Y
Exit For
End If
Next Y
六十四进制转十进制 = 六十四进制转十进制 + 当前编码数 * 64 ^ (Len(六十四进制数) - X)
Next X
End Function
使用时必须先使用 "初始化MIME字符集()" 函数
然后再操作 MIME 便编码
这些代码绝对可靠,我已经作了一个类似 Microsoft OutLook 的程序,解码方面绝对没问题
只是可能在代码中有些我自定义的函数我没有注意到的没有放上去,你就自己研究一下吧。因为我的模块都是中文的,相信看起来也比较容易。
好了,给分吧。