要用MAPI,不是用WINSOCK
你可以在网上搜索一下

解决方案 »

  1.   

    pop协议中的Top指令可以获得邮件头。
       top 邮件号 0
    受到邮件头以后,剩下的就是分析邮件头了,FoxMail的原始信息功能能够察看邮件的原始文本。
    以下是我以前编的头部分析代码Public EM_Subject As String
    Public EM_Date As String
    Public EM_From As String
    Public EM_Size As String
    Public EM_Mime_V As String
    Public EM_Content_Type As String
    Public EM_Return_Path As StringPublic Sub Get_EM_TOP(ByVal EM_Text As String)  '参数是接收到的头文本
    Dim EM_Title, EM_Detail As String
    Dim EM_Temp() As String
    Dim EM_T As StringEM_Temp = Split(EM_Text, vbCrLf & vbCrLf)EM_Title = EM_Temp(0)
    EM_Detail = EM_Temp(1)'***取得Subject***
    If InStr(EM_Title, "Subject:") <> 0 Then
        EM_Temp = Split(EM_Title, "Subject:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_Subject = EM_Temp(0)
        If InStr(EM_Subject, "?") <> 0 Then
            EM_Temp = Split(EM_Subject, "?")
            If StrConv(EM_Temp(2), vbUpperCase) = "B" Then
                EM_Subject = Base64decode(EM_Temp(UBound(EM_Temp) - 1))
            End If
            If StrConv(EM_Temp(2), vbUpperCase) = "Q" Then
                EM_Subject = QPdecode(EM_Temp(UBound(EM_Temp) - 1))
            End If
        End If
        EM_Subject = Trim(EM_Subject)
    End If
    '*****************'***取得Date****
    If InStr(EM_Title, "Date:") <> 0 Then
        Dim EM_Y, EM_M, EM_D, EM_Time As String
        EM_Temp = Split(EM_Title, "Date:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_Date = EM_Temp(0)
        EM_Temp = Split(EM_Date, " ")
        If InStr(EM_Date, ",") <> 0 Then
            EM_D = EM_Temp(2)
            EM_M = EM_Temp(3)
            EM_Y = EM_Temp(4)
            EM_Time = EM_Temp(5)
            EM_Date = EM_D & " " & EM_M & " " & EM_Y
        Else
            EM_D = EM_Temp(1)
            EM_M = EM_Temp(2)
            EM_Y = EM_Temp(3)
            EM_Time = EM_Temp(4)
            EM_Date = EM_D & " " & EM_M & " " & EM_Y
        End If
        EM_Date = Format(EM_Date, "yyyy-mm-dd") & " " & EM_Time
    End If
    '***************'***取得From***
    If InStr(EM_Title, "From:") <> 0 Then
        EM_Temp = Split(EM_Title, "From:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_From = EM_Temp(0)
        If InStr(EM_From, " <") <> 0 Then
            EM_Temp = Split(EM_From, " <")
            EM_From = EM_Temp(0)
        End If
        EM_From = Replace(EM_From, """", " ")
        EM_From = Trim(EM_From)
    End If
    '*************'***取得MimeVersion***
    If InStr(EM_Title, "MIME-Version:") <> 0 Then
        EM_Temp = Split(EM_Title, "MIME-Version:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_Mime_V = EM_Temp(0)
    End If
    '********************'***取得Content_Type***
    If InStr(EM_Title, "Content-Type:") <> 0 Then
        EM_Temp = Split(EM_Title, "Content-Type:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_Content_Type = EM_Temp(0)
    End If
    '*********************'****取得Return-Path****
    If InStr(EM_Title, "Return-Path:") <> 0 Then
        EM_Temp = Split(EM_Title, "Return-Path:")
        EM_T = EM_Temp(1)
        EM_Temp = Split(EM_T, vbCrLf)
        EM_Return_Path = EM_Temp(0)
    End If
    '***********************End Sub
      

  2.   

    GB2312,数字,英文字母的邮件标题,我能够取到,但是UTF-8编码的标题我还没有做。
    另外,附件可以通过下载邮件内容,然后从邮件内容中截取,也可以将邮件下载到本地再做处理。1.邮件标题
    通过winsock.senddata "TOP n 0" & vbcrlf 命令获得返回值,其中n为邮件的序号.格式如下
    +OK
    Received: from Server ([192.168.0.228]) by mail.GBZTG.INT with Microsoft SMTPSVC(5.0.2195.5329);
     Mon, 24 Feb 2003 19:00:22 +0800
    Message-ID: <[email protected]>
    From: "Johnny Lill" <[email protected]>
    To: <[email protected]>,
    "Johnny Lill" <[email protected]>
    Subject: =?gb2312?B?tuDK1bz+yMuy4srU?=
    Date: Mon, 24 Feb 2003 19:00:20 +0800
    MIME-Version: 1.0
    Content-Type: multipart/alternative;
    boundary="----=_NextPart_000_0005_01C2DC36.FAFC0400"
    X-Priority: 3
    X-MSMail-Priority: Normal
    X-Mailer: Microsoft Outlook Express 6.00.2720.3000
    Disposition-Notification-To: "Johnny Lill" <[email protected]>
    X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
    Return-Path: [email protected]
    X-OriginalArrivalTime: 24 Feb 2003 11:00:22.0078 (UTC) FILETIME=[ED130DE0:01C2DBF3]
    .
    反馈信息中的Subject:对应的就是邮件标题。如果是编码后的字符串,则需要相应的解码操作。编码格式 "?=编码方式?B?内容=?" ,是用编码方式对内容进行解码即可。待续
      

  3.   

    2.邮件内容
    使用winsock.senddata "LIST n" & vbcrlf 获得邮件大小,并赋值给变量MailSize
    然后使用winsock.senddata "RETR n" & vbcrlf 获得邮件内容
    注意Winsock_DataArrival(ByVal bytesTotal As Long)事件中的bytesTotal变量。
    如果邮件比较大,一次不能够全部接收,这是,你需要定义一个boolean型的全局变量isDownload 和一个long型的全局变量CurrentBytes,在执行winsock.sendata "RETR n" & vbcrlf 前赋值 isDownLoad=True , CurrentBytes = 0。
    然后在Winsock_DataArrival(ByVal bytesTotal As Long)事件中对CurrentBytes进行累加,直到CurrentBytes = MailSize + 8 时,完成下载操作。注意判断要在写文件之后进行。
    例:在Winsock_DataArrival(ByVal bytesTotal As Long)事件中使用下列代码If Winsock.State = 7 Then
       Winsock.GetData str_GetMail, vbString, bytesTotal
    End IfIf isDownload Then
       Open "C:\1.eml" For Append Access Write As #1
            Print #1, str_GetMail
       Close #1
    End IfCurrentBytes = CurrentBytes + bytesTotal
               
    If CurrentBytes >= MailSize + 8 Then
       isDownload=false
       CurrentBytes=0
       msgbox "下载完毕"
    end if
    如果需要截取附件,要自己进行邮件内容分析,然后按段截取即可完.......