月夜钓钱江鱼

醉后不知天在水,满船清梦压星河。

在VB工程中,增加Jmail组件的引用,然后拷贝Base64的编码解码的函数过程到公共BAS文件中
base64.bas

Option Explicit
Public Const cstBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Public arrBase64() As String
Public Function Base64Encode(strSource As String) As String '编码
   On Error Resume Next
   If UBound(arrBase64) = -1 Then
       arrBase64 = Split(StrConv(cstBase64, vbUnicode), vbNullChar)
   End If
   Dim arrB() As Byte, bTmp(2)  As Byte, bT As Byte
   Dim i As Long, J As Long
   arrB = StrConv(strSource, vbFromUnicode)
   
   J = UBound(arrB)
   For i = 0 To J Step 3
       Erase bTmp
       bTmp(0) = arrB(i + 0)
       bTmp(1) = arrB(i + 1)
       bTmp(2) = arrB(i + 2)
       
       bT = (bTmp(0) And 252) / 4
       Base64Encode = Base64Encode & arrBase64(bT)
       
       bT = (bTmp(0) And 3) * 16
       bT = bT + bTmp(1) \ 16
       Base64Encode = Base64Encode & arrBase64(bT)
       
       bT = (bTmp(1) And 15) * 4
       bT = bT + bTmp(2) \ 64
       If i + 1 <= J Then
           Base64Encode = Base64Encode & arrBase64(bT)
       Else
           Base64Encode = Base64Encode & "="
       End If
       
       bT = bTmp(2) And 63
       If i + 2 <= J Then
           Base64Encode = Base64Encode & arrBase64(bT)
       Else
           Base64Encode = Base64Encode & "="
       End If
   Next
End Function
Public Function Base64Decode(strEncoded As String) As String '解码
   On Error Resume Next
   Dim arrB() As Byte, bTmp(3)  As Byte, bT As Long, bRet() As Byte
   Dim i As Long, J As Long
   arrB = StrConv(strEncoded, vbFromUnicode)
   J = InStr(strEncoded & "=", "=") - 2
   ReDim bRet(J - J \ 4 - 1)
   For i = 0 To J Step 4
       Erase bTmp
       bTmp(0) = (InStr(cstBase64, Chr(arrB(i))) - 1) And 63
       bTmp(1) = (InStr(cstBase64, Chr(arrB(i + 1))) - 1) And 63
       bTmp(2) = (InStr(cstBase64, Chr(arrB(i + 2))) - 1) And 63
       bTmp(3) = (InStr(cstBase64, Chr(arrB(i + 3))) - 1) And 63
       bT = bTmp(0) * 2 ^ 18 + bTmp(1) * 2 ^ 12 + bTmp(2) * 2 ^ 6 + bTmp(3)
       bRet((i \ 4) * 3) = bT \ 65536
       bRet((i \ 4) * 3 + 1) = (bT And 65280) \ 256
       bRet((i \ 4) * 3 + 2) = bT And 255
   Next
   Base64Decode = StrConv(bRet, vbUnicode)
End Function

引入BaseToUtfToUnicode.bas作为字符转换

Option Explicit
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Const CP_ACP = 0        ' default to ANSI code page
Private Const CP_UTF8 = 65001   ' default to UTF-8 code page
Function StrToBytes(ByVal Source As String) As Byte()
    Dim bB64Str() As Byte
    bB64Str = StrConv(Source, vbFromUnicode)
    Dim lB64Len As Long
    lB64Len = InStrB(bB64Str, ChrB$(Asc("="))) - 1
    Dim lLenPad As Long
    lLenPad = (4 - lB64Len Mod 4) Mod 4
    Dim lLen As Long
    lLen = ((lB64Len + lLenPad) \ 4) * 3
    Dim bStr() As Byte
    If lLen = 0 Then
        ReDim bStr(lLen)
    Else
        ReDim bStr(lLen - 1)
    End If
    
    lLen = lLen - lLenPad
    Dim i As Long
    Dim lBuffer As Long
    For i = 0 To lB64Len - 1 Step 4
        lBuffer = DeB64CodeA(bB64Str(i + 0)) * &H40000 Or DeB64CodeA(bB64Str(i + 1)) * &H1000& _
                Or DeB64CodeA(bB64Str(i + 2)) * &H40& Or DeB64CodeA(bB64Str(i + 3))
        bStr((i \ 4) * 3 + 2) = lBuffer And &HFF&
        lBuffer = lBuffer \ &H100&
        bStr((i \ 4) * 3 + 1) = lBuffer And &HFF&
        lBuffer = lBuffer \ &H100&
        bStr((i \ 4) * 3 + 0) = lBuffer And &HFF&
        lBuffer = lBuffer \ &H100&
    Next
    ReDim Preserve bStr(lLen - 1)
    StrToBytes = bStr
End Function
Private Function DeB64CodeA(ByVal Char As Byte) As Byte
    Select Case Char
        Case Asc("A") To Asc("Z"): DeB64CodeA = Char - Asc("A")
        Case Asc("a") To Asc("z"): DeB64CodeA = Char - Asc("a") + 26
        Case Asc("0") To Asc("9"): DeB64CodeA = Char - Asc("0") + 52
        Case Asc("+"): DeB64CodeA = 62
        Case Asc("/"): DeB64CodeA = 63
        Case Asc("="): DeB64CodeA = 64
    End Select
End Function
Function Utf8ToUnicode(ByRef Utf() As Byte) As String
    Dim lRet As Long
    Dim lLength As Long
    Dim lBufferSize As Long
    lLength = UBound(Utf) - LBound(Utf) + 1
    If lLength <= 0 Then Exit Function
    lBufferSize = lLength * 2
    Utf8ToUnicode = String$(lBufferSize, Chr(0))
    lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf(0)), lLength, StrPtr(Utf8ToUnicode), lBufferSize)
    If lRet <> 0 Then
        Utf8ToUnicode = Left(Utf8ToUnicode, lRet)
    End If
End Function
View Code

然后在窗体上增加按钮,点击按钮增加收信代码

Option Explicit
Dim i&, Attachment&
Dim att         As Object
Dim EmailMsg         As Object
Dim atts        As Object
Dim JMail       As Object
Dim EmailList$, Subject$, EmailID&
Dim X$()
Private Sub Command1_Click()
    Dim J#
    Set JMail = CreateObject("JMail.POP3")
    JMail.Connect "用户名@163.com", "密码AhjahudpddpsstrswAddfe", "pop.163.com" 'JMail.Connect "邮箱名", "密码", "服务器" [,"端口号"]
'    Debug.Print "你有" & JMail.Count & "封邮件"     '邮件数量
    For i = 1 To JMail.Count
'        EmailID = JMail.GetMessageUID(I)           '邮件唯一ID标识
        Set EmailMsg = JMail.Messages.Item(i)       '取得一条邮件信息
'-----------------------------------------------------------------------------取得附件数量并下载
        Set atts = EmailMsg.Attachments             '附件集合
        Attachment = atts.Count                     '附件的数量
        If Attachment > 0 Then
            For J = 0 To Attachment - 1
                Set att = atts(J)
                If Dir(App.Path & "\" & att.Name) = "" Then 'att.Name附件的名称,如果存在同名文件而不加判断则会出错
                    att.SaveToFile App.Path & "\" & att.Name
                End If
            Next
        End If
'------------------------------------------------------------------------------以下为各种参数设置
'        EmailMsg.Charset = "gb2312"                '编码方式
'        EmailMsg.ContentTransferEncoding = "base64"'解码方式
'        EmailMsg.Encoding = "base64"
'        EmailMsg.ContentType = "multipart/mixed"   '发送邮件时
'        EmailMsg.ContentType = "text/html"         '接收邮件时
'        EmailMsg.ISOEncodeHeaders = False'True     '功能不清?
'-----------------------------------------------------------------------------可以取得的各元素
'        MsgBox EmailMsg.Priority                   '邮件的优先级,1-5,1最高,正常情况为3。
'        MsgBox EmailMsg.From                       '邮件的发送人的信箱地址
'        MsgBox EmailMsg.FromName                   '邮件的发送人
'        MsgBox EmailMsg.Date                       '邮件日期
'        MsgBox EmailMsg.Body                       '邮件内容
'        MsgBox EmailMsg.Size                       '邮件大小
'----------------------------------------------------------------------------
        Subject = EmailMsg.Headers.GetHeader("Subject") '邮件标题,可正常解码,但UTF-8格式的标题取不全
        X = Split(EmailMsg.Headers.GetHeader("Subject"), "?")
        If X(1) = "UTF-8" Then
            'Subject = Utf8ToUnicode(StrToBytes(X(3)))
            Subject = X(3)
        Else
            Subject = Base64Decode(X(3))
        End If
        
        Subject = Subject & EmailMsg.Headers.GetHeader("From")   '发件人,可解码
        
        'Subject = Subject + EmailMsg.Headers.GetHeader("FromName")
        EmailList = EmailList & CStr(i) & "" & Subject & EmailMsg.Body & vbCrLf
        DoEvents
    Next
    Text1.Text = EmailList
    JMail.Disconnect
End Sub

注:在申请的邮箱上设置允许POP3和STMP,这样邮件客户端才可以接收邮件。

posted on 2015-08-25 10:44  湘灵  阅读(507)  评论(0)    收藏  举报