在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
然后在窗体上增加按钮,点击按钮增加收信代码
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,这样邮件客户端才可以接收邮件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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