月夜钓钱江鱼

醉后不知天在水,满船清梦压星河。
posts - 50,comments - 8,views - 29026

在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   湘灵  阅读(483)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示