最好不用自己遍,用外界的控件,我知道最好的是jmail.dll,不过,还是把程序给你吧;
模块一
Public Function UUDecodeToFile(strUUCodeData As String, strFilePath As String)    Dim vDataLine   As Variant
    Dim vDataLines  As Variant
    Dim strDataLine As String
    Dim intSymbols  As Integer
    Dim intFile     As Integer
    Dim strTemp     As String
    If Left$(strUUCodeData, 6) = "begin " Then
        strUUCodeData = Mid$(strUUCodeData, InStr(1, strUUCodeData, vbLf) + 1)
    End If
    If Right$(strUUCodeData, 5) = "end" + vbCrLf Then
        strUUCodeData = Left$(strUUCodeData, Len(strUUCodeData) - 10)
    End If
    intFile = FreeFile
    Open strFilePath For Binary As intFile
        vDataLines = Split(strUUCodeData, vbCrLf)
        For Each vDataLine In vDataLines
                strDataLine = CStr(vDataLine)
                intSymbols = Asc(Left$(strDataLine, 1)) - 32
                strDataLine = Mid$(strDataLine, 2)
                strDataLine = Replace(strDataLine, "`", " ")
                For i = 1 To Len(strDataLine) Step 4
                    '1 byte
                    strTemp = strTemp + Chr((Asc(Mid(strDataLine, i, 1)) - 32) * 4 + _
                              (Asc(Mid(strDataLine, i + 1, 1)) - 32) \ 16)
                    '2 byte
                    strTemp = strTemp + Chr((Asc(Mid(strDataLine, i + 1, 1)) Mod 16) * 16 + _
                              (Asc(Mid(strDataLine, i + 2, 1)) - 32) \ 4)
                    '3 byte
                    strTemp = strTemp + Chr((Asc(Mid(strDataLine, i + 2, 1)) Mod 4) * 64 + _
                              Asc(Mid(strDataLine, i + 3, 1)) - 32)
                Next i
                strTemp = Left(strTemp, intSymbols)
                'write decoded line to the file
                Put intFile, , strTemp
                'clear buffer for next line
                strTemp = ""
        Next
    Close intFile
End Function

解决方案 »

  1.   

    模块二
    Public Function UUEncodeFile(strFilePath As String) As String
    '对文件进行编码
    Dim intFile         As Long      'file handler
    Dim intTempFile     As Long      'temp file
    Dim lFileSize       As Long         'size of the file
    Dim strFileName     As String      'name of the file
    Dim strFileData     As String       'file data chunk
    Dim lEncodedLines   As Long         'number of encoded lines
    Dim strTempLine     As String       'temporary string
    Dim i               As Long         'loop counter
    Dim j               As Long      'loop counter
    Dim LenStr As Long '长度
    Dim Begin As Long, Over As Long
    Dim strResult       As String
    Dim StrBin() As Byte  '读进来字节
    'On Error GoTo Err:
    strFileName = Mid$(strFilePath, InStrRev(strFilePath, "\") + 1)
    '插入标志"begin 664 ..."
    strResult = "begin 664 " + strFileName + vbLf
    '得到文件尺寸[字节]
    lFileSize = FileLen(strFilePath)
    lEncodedLines = lFileSize \ 45 + 1
    '打开文件
    intFile = FreeFile
    Open strFilePath For Binary As intFile
    ReDim StrBin(FileLen(strFilePath) - 1) '全部读入
    Get intFile, 1, StrBin() '开始读出数据
    strFileData = StrConv(StrBin(), vbUnicode)
    If (LenB(StrConv(strFileData, vbFromUnicode)) Mod 3) Then '不够用空格;
       strFileData = strFileData + Space(3 - (LenB(StrConv(strFileData, vbFromUnicode)) Mod 3))
    End If
    '如果不全部读出来,而是分开读,如果分界正好是汉字,一边一半的时候,往往前一半为00了,无法读出;
    '这里直接读取是不可以的,因为汉字也当一个字符读出来,而不是一个字节
    '用LeftB截取也不行,最后的半个汉字符没有拉
      For i = 1 To lEncodedLines
          '加上M标志,UUEncode标示
          Begin = (i - 1) * 45 + 1 '开始字节数
          If i = lEncodedLines Then
            Over = LenB(StrConv(strFileData, vbFromUnicode)) - Begin + 1 '结束字节数
            strTempLine = Chr(LenB(MidB(StrConv(strFileData, vbFromUnicode), Begin, LenB(StrConv(strFileData, vbFromUnicode)) - Begin + 1)) + 32)
            LenStr = LenB(StrConv(strFileData, vbFromUnicode)) Mod 45
          Else
            Over = (i - 1) * 45 + 45 '结束字节数
            strTempLine = "M"
            LenStr = 45
            'strTempLine = Chr(Len(strFileData) + 32)
          End If
          For j = 1 To LenStr Step 3
              '3个字节转换成为4个;
              '1 byte
              strTempLine = strTempLine + Chr(AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j - 1, 1)) \ 4 + 32)
              '2 byte
              strTempLine = strTempLine + Chr((AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j - 1, 1)) Mod 4) * 16 _
                             + (AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j, 1))) \ 16 + 32)
              '3 byte
              strTempLine = strTempLine + Chr((AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j, 1)) Mod 16) * 4 _
                             + (AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j + 1, 1))) \ 64 + 32)
              '4 byte
              strTempLine = strTempLine + Chr(AscB(MidB(StrConv(strFileData, vbFromUnicode), Begin + j + 1, 1)) Mod 64 + 32)
          Next j
          
          '替换空格
          strTempLine = Replace(strTempLine, " ", "`")
          '返回字符串需要加上换行
          strResult = strResult + strTempLine + vbLf
          '清空缓冲字符串
          strTempLine = ""
      Next i
    Close intFile
    '加上结束标示符号
    strResult = strResult & "`" & vbLf + "end" + vbLf
    '返回值
    UUEncodeFile = strResult
    Exit Function
    Err:
    UUEncodeFile = ""
    End Function
      

  2.   

    我见意看看下面的文章,可能对你有帮助:
    作者:吴斌 
    发送和接收电子邮件,对于某些执行特殊任务的应用程序而言,是一个十分有用的功能。例如,一个监视网络服务器资源使用情况的工具软件,如果它具有自动发送电子邮件的功能,那么当它发现服务器的资源使用已经接近事先设定的临界状态时,便可以向系统管理员发送一封告警的电子邮件,从而使系统管理员能够及时地采取措施,以避免重大事故的出现。在Visual Basic中,应用程序可以通过调用微软公司的MAPI(Messaging Application Programming Interface,消息应用程序编程接口),实现收发电子邮件的功能。笔者将在本文中结合简单实例,向大家介绍在VB程序中实现电子邮件收发功能的编程方法。
    编制具有收发电子邮件功能的VB程序,必须使用Visual Basic 4.0以上的版本,因为只有4.0以上的Visual Basic才带有两个实现电子邮件收发功能的核心控件:MAPI会话控件和MAPI消息控件。MAPI会话控件用于建立和控制一个Microsoft Mail会话,MAPI消息控件用于创建和收发邮件消息。此外,程序必须运行在采用遵从MAPI的消息系统(如:Microsoft Exchange、Microsoft Mail、Outlook等)的环境中。
    在开始编程之前,首先需要将MAPI控件加入VB工具箱。具体操作是:在VB菜单栏中选择Tools菜单项中的Custom Controls命令,调出"Custom Controls"对话框,在其中的"Available Controls"列表框中选中"Microsoft MAPI Controls"表项,然后按"OK"命令按钮退出该对话框。此后,工具箱中将新添两个图标,这就是MAPI会话控件和MAPI消息控件的图标。下面,笔者将以两个简单的VB程序为例,分别介绍发送邮件和接收邮件的程序编制方法。邮件发送程序
    邮件发送程序的基本处理过程是:根据用户输入信息组成邮件,然后使用MAPI
    消息控件的Send方法将邮件发出。编程步骤如下:
    1、新建一个VB项目。
    2、将缺省窗体Form1的Caption属性设置为"发送邮件"。
    3、将MAPI控件加入VB工具框。
    4、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。
    5、在Form1中加入三个文本框控件,将它们的Name属性分别设置为txtSendTo、txtSubject、txtMessage,并将txtMessage的Multiline属性设置为True。这三个文本框控件将分别用于填写邮件的收件人、主题和内容。
    6、在Form1中加入三个标签控件,将它们的Caption属性分别设置为"收件人"、"主题"和"内容",并将它们放在合适的位置用以标注相应的文本框控件。
    7、在Form1中加入一个命令按钮控件,将其Caption属性和Name属性分别设置为"发送"和"cmdSend"。
    8、将下列代码加入Form1的Form_Load事件:
    Private Sub Form_Load()
    MAPISession1.SignOn
    End Sub
    9、将下列代码加入Form1的Form_Unload事件:
    Private Sub Form_Unload(Cancel As Integer)
    MAPISession1.SignOff
    End Sub
    10、将下列代码加入cmdSend的Click事件:
    Private Sub cmdSend_Click()
    With MAPIMessages1
    .MsgIndex = -1
    .RecipDisplayName = txtSendTo.Text
    .MsgSubject = txtSubject.Text
    .MsgNoteText = txtMessage.Text
    .SessionID = MAPISession1.SessionID
    .Send
    End With
    MsgBox "邮件发送完毕!", , "发送邮件"
    End Sub
    程序运行后如图3所示。在填写完邮件的收件人、主题和内容后,按"发送"命令按钮,如果没有出现运行时错误提示,那么就表明邮件已经成功地发往目的地了,否则,请检查填写的收件人地址是否准确无误以及系统中运行的消息系统工作是否正常。邮件接收程序邮件接收程序比邮件发送程序稍微复杂一些。首先需要使用MAPI消息控件的Fetch方法读取邮件,这个过程将把用户收件箱中所有未读邮件全部装入MAPI消息控件中。然后,检查MAPI消息控件的MsgCount属性以确定通过Fetch方法读取的邮件的总数。接着,可以通过设置MAPI消息控件的MsgIndex属性来指定具体需要处理哪一封邮件。需要说明的是,MsgIndex属性值的计数是从0开始的,也就是说,第一封邮件的索引号是0,第二封邮件的索引号是1,依次类推。编程步骤如下:
    1、新建一个VB项目。
    2、将缺省窗体Form1的Caption属性设置为"接收邮件"。
    3、将MAPI控件加入VB工具框。
    4、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。
    5、在Form1中加入三个标签控件和一个文本框控件,将三个标签控件的Name属性分别设置为lblMsgDateReceived、lblMsgOrigDisplayName、lblMsgSubject,将文本框控件的Name属性设置为txtMsgNoteText,并将标签控件的Caption属性和文本框控件的Text属性的内容清空。这四个控件将分别用于显示邮件的日期、发件人、主题和内容。
    6、将txtMsgNoteText控件的Locked属性和Multiline属性设置为True,ScrollBars属性设置为2 - Vertical。
    7、在Form1中再加入四个标签控件用于标注上述四个控件,将它们的Caption属性分别设置为"日期"、"发件人"、"主题"、"内容"。
    8、在Form1中加入一个标签控件,将其Name属性设置为lblMsgCount,Caption属性设置为"第 0 封邮件,总计 0 封邮件"。该控件用于显示接收的邮件总数以及当前正在处理第几封邮件。
    9、在Form1中加入三个命令按钮控件,将它们的Name属性分别设置为cmdPrevious、cmdNext、cmdClose,Caption属性分别设置为"上一封"、"下一封"、"关闭"。
    10、编写一个窗体级子例程FetchNewMail:
    Public Sub FetchNewMail()
    MAPIMessages1.FetchUnreadOnly = True
    MAPIMessages1.Fetch
    End Sub
    11、编写一个窗体级子例程DisplayMessage:
    Public Sub DisplayMessage()
    lblMsgCount.Caption = "第 " & _
    Ltrim(Str(MAPIMessages1.MsgIndex + 1)) & " 封邮件,总计 " & _
    Ltrim(Str(MAPIMessages1.MsgCount)) & " 封邮件"
    lblMsgDateReceived.Caption = MAPIMessages1.MsgDateReceived
    txtMsgNoteText.Text = MAPIMessages1.MsgNoteText
    lblMsgOrigDisplayName.Caption = MAPIMessages1.MsgOrigDisplayName
    lblMsgSubject.Caption = MAPIMessages1.MsgSubject
    End Sub
    12、将下列代码加入Form1的Form_Load事件:
    Private Sub Form_Load()
    MAPISession1.SignOn
    MAPIMessages1.SessionID = MAPISession1.SessionID
    FetchNewMail
    DisplayMessage
    End Sub
    13、将下列代码加入cmdPrevious的Click事件:
    Private Sub cmdPrevious_Click()
    If MAPIMessages1.MsgIndex > 0 Then
    MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex - 1
    DisplayMessage
    Else
    Beep
    End If
    End Sub
    14、将下列代码加入cmdNext的Click事件:
    Private Sub cmdNext_Click()
    If MAPIMessages1.MsgIndex < MAPIMessages1.MsgCount - 1 Then
    MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex + 1
    DisplayMessage
    Else
    Beep
    End If
    End Sub
    15、将下列代码加入cmdClose的Click事件:
    Private Sub cmdClose_Click()
    Unload Me
    End Sub
    程序运行后如图4所示。在窗体加载过程中,窗体Load事件中的代码会读取新邮件,如果有新邮件,就显示第一个新邮件。如果有多个新邮件,则可以使用"上一封"和"下一封"命令按钮前后翻阅。接收邮件本例是读取用户收件箱中所有未读邮件,如果要读取收件箱中所有的邮件,那么只需在执行Fetch方法之前,将MAPI消息控件的FetchUnreadOnly属性设置为False。具体接收的邮件是否已经读过,可以通过MsgRead属性来判别。如果邮件的正文或附件曾经被浏览过,那么该邮件就会自动标记为已读,不过只浏览邮件的主题不会标记该邮件已读。邮件附件
    与处理邮件的方式一样,MAPI也为邮件的附件提供了一个计数器和一个索引。在处理收到的邮件时,可以通过检查AttachmentCount属性来确定该邮件携带了多少个附件,然后可以通过设置AttachmentIndex属性依次处理每一个附件。
    AttachmentIndex的合法取值范围为0至AttachmentIndex-1。在设置了AttachmentIndex属性值后,可以读取附件的下列属性:
    AttachmentName:当附件是一个文件时,该属性用于指定文件的名称。当附件是一个OLE对象时,该属性用于指定对象的类型。
    AttachmentPath:该属性用于指定做为附件的文件的全路径名。
    AttchmentPosition:该属性用于指定附件在邮件内容部分中的位置。当邮件收发程序显示邮件内容时,将使用该属性提供的信息把附件的标志放在合适的位置。
    AttachmentType:该属性用于指定附件的类型,其合法取值为三个整数型数值,在VB中分别由下列常量表示:
    ·mapData-附件是一个数据文件
    ·mapEOLE-附件是一个嵌入式OLE对象
    ·mapSOLE-附件是一个静态OLE对象
    发送邮件时,上述属性的使用方法与接收邮件时相同,只不过由读操作改为写操作了。值得一提的是AttachmentIndex属性,发送邮件时可以将其设置为任意值。而AttachmentCount属性则会自动设置为正确的值,无需人为设置。小结
    通过分析上述两个程序的代码,可以归纳出具有收发电子邮件功能的VB程序的基本流程如下:
    1、使用MAPI会话控件建立一个邮件会话。
    2、使用MAPI消息控件进行邮件的处理工作。
    3、再次使用MAPI会话控件释放邮件会话。
    由于上述两个VB程序只是简单的示例,因而略去了一些与本文主题关系不大的细节,如错误处理等。在编制实用程序时,为了保证程序的可靠性,应该考虑加入这些细节部分。 你不妨到VB编程乐园中转转,里面有许多例子!
    也可以在这搜索一下,关于邮件的论坛!
      

  3.   

    发送模块
    Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
    '发送信件
      ''On Error GoTo Err:
      Dim strServerResponse   As String
      Dim strResponseCode     As String
      Dim strDataToSend       As String '发送的数据
      Dim Conn As New ADODB.Connection
      
      m_StopTime = 0 '无响应时间归零
      Winsock.GetData strServerResponse
      '从缓冲区里读出来数据,基本上是代码数字和其他信息,和短信息发送一样
      '例如:220 sm8.163.com ESMTP
      '得到服务器返回的代码(first three symbols)
      strResponseCode = Left(strServerResponse, 3)
       '只有三个返回代码可以告诉我们结果
      '如果命令成功我们就可以继续了
      If strResponseCode = 235 Or strResponseCode = "250" Or strResponseCode = "334" Or strResponseCode = "220" Or strResponseCode = "354" Then
        Select Case m_State
          Case MAIL_CONNECT
              '改变当前状态的值:发送EHLO[Helo是不需要验证的邮局],表示申请连接
              m_State = MAIL_AUTH
              '发送Hello到服务器
              Winsock.SendData "EHLO " & m_Email.SmtpServer & vbCrLf
              '"发送连接服务器标识"
          Case MAIL_AUTH
              m_State = MAIL_USER
              Winsock.SendData "AUTH login" & vbCrLf
              '"标识成功,发送连接验证申请"
          Case MAIL_USER
              m_State = MAIL_PSW
              Winsock.SendData StrToBase64(Left$(m_Email.MailName, InStr(1, m_Email.MailName, "@") - 1)) & vbCrLf
              '"验证被接收,发送用户名称"
          Case MAIL_PSW
              '改变当前状态
              m_State = MAIL_HELO
              'Send DATA command to the server
              Winsock.SendData StrToBase64(m_Email.MailPass) & vbCrLf
              '"用户名称正确,发送密码"
          Case MAIL_HELO
             '改变当前状态:发送信件发送位置
              m_State = MAIL_FROM
              '从哪里发信,发送人信息
              Winsock.SendData "MAIL FROM:" & m_Email.MailName & vbCrLf
              '"验证全部通过,发送邮件地址"
          Case MAIL_FROM
              '改变当前状态:发送到哪里去
              m_State = MAIL_RCPTTO
              '发送发送到那里的信息
              Winsock.SendData "RCPT TO:" & m_Info.ToFrom & vbCrLf
              '"发送接收地址"
          Case MAIL_RCPTTO
              '改变当前状态
              m_State = MAIL_DATA
              Winsock.SendData "DATA" & vbCrLf
              '"准备发送信息"
          Case MAIL_DATA
              '改变当前状态
              m_State = MAIL_DOT
              Winsock.SendData "Subject:" & m_Info.Topic & vbLf & vbCrLf
              Dim varLines    As Variant
              Dim varLine     As Variant
              Dim strMessage  As String
              '加入附件
              strMessage = m_Info.Content & vbCrLf & vbCrLf & m_strEncodedFiles
              m_strEncodedFiles = ""
              varLines = Split(strMessage, vbCrLf)
              strMessage = ""
              For Each varLine In varLines
                  Winsock.SendData CStr(varLine) & vbLf
              Next
              Winsock.SendData "." & vbCrLf
              '"信息发送完毕"
          Case MAIL_DOT
              '改变当前状态
              m_State = MAIL_QUIT
              Winsock.SendData "QUIT" & vbCrLf
              '"发送退出信号"
          Case MAIL_QUIT
              '关闭连接
              Winsock.Close
              '"关闭连接"
        End Select
      Else
        '关闭;退出
        Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Password=dir941421;User ID=kiss;Data Source=" & App.Path & "\OAData\OAData.mdb;Persist Security Info=True;Jet OLEDB:System database=" & App.Path & "\OAData\Secured.mdw"
        If m_State = MAIL_QUIT Then '发送成功啦/失败的在发送的时候处理了,不用管了
          Conn.Execute "Update ztblMailBox Set SendState=True Where Id=" & m_Info.EmailId
        End If
        Winsock.Close
        SendEmailOver
      End If
      Exit Sub
    Err:
      If Winsock.State <> 0 Then Winsock.Close
      SendEmailOver
    End Sub
    当然,中间的声明之类的来不及找了,我的程序不光是这些功能,挺乱的;有了这些,你就能够编制了;不过我这个用的是UUDecode编码的;比较慢;
    还有好多种编码方式,VB对字符处理慢,所以最好用外部的控件,能快一点;
      

  4.   

    外部控件需要另外安装吗?我这好想没有,谁能给我发来吗?我email:[email protected]
      

  5.   

    http://www2.ccw.com.cn/tips/9901/01221_11.asp