Dim state As Boolean
Private Enum SMTP_State
    MAIL_CONNECT
    MAIL_HELO
    MAIL_from
    MAIL_RCPTTO
    MAIL_DATA
    MAIL_DOT
    MAIL_QUIT
    MAIL_USER
    MAIL_PASS
    mail_login
End Enum
Private m_State As SMTP_State
Private m_strEncodedFiles As StringPublic Sub Send()      '邮件发送
    Winsock1.Close
    Winsock1.LocalPort = 0
    strserver = "smtp.163.com"
    lngPort = 25
    Winsock1.Connect strserver, lngPort
    m_State = MAIL_CONNECT    '
    StatusTxt = "试图与服务器连接"
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strServerResponse   As String
    Dim strResponseCode     As String
    Dim strDataToSend       As String    '
    Const RandString As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
    Dim Globalstr As String
    For jd = 1 To 24
        uniquey = Int(Rnd * Len(RandString)) + 1
        Globalstr = Globalstr + Mid(RandString, uniquey, 1)
    Next jd
    strime1 = "Subject:" + Chr(32) + subject + vbCrLf ' Subject of E-Mail
    strime = txtMessage + vbCrLf ' E-mail message body
    strime2 = "X-Mailer:程序太平洋:邮件发送软件V1.0" + vbCrLf ' What program sent the e-mail, customize this
    'MULTI-PART Edit
    strime = "------=_NextPart_" + Globalstr + vbCrLf + "Content-type: text/plain; charset=gb2312" + vbCrLf + vbCrLf + strime
    strime = strime + "------=_NextPart_" + Globalstr + vbCrLf + "Content-type: text/HTML" + vbCrLf + vbCrLf + txtmessage1 + vbCrLf + vbCrLf
    strime = strime + "------=_NextPart_" + Globalstr + "--" + vbCrLf
    strime1 = strime1 + "MIME-Version: 1.0" + vbCrLf + "Content-Type: multipart/alternative; " + vbCrLf + Chr(9) + "boundary=""----=_NextPart_" + Globalstr + """" + vbCrLf + vbCrLf + "This mail is In MIME format. Your mail interface does Not appear To support this format." + vbCrLf + vbCrLf
    strimeall = strime2 + strime1
    Winsock1.GetData strServerResponse
    strResponseCode = Left(strServerResponse, 3)
    If strResponseCode = "250" Or _
       strResponseCode = "220" Or _
       strResponseCode = "354" Or _
       strResponseCode = "334" Or _
       strResponseCode = "235" Then
        Select Case m_State
            Case MAIL_CONNECT
                m_State = MAIL_HELO
                strDataToSend = Trim$("很远的地方")   '显示从那里来的
                 Winsock1.SendData "HELO " & strDataToSend & vbCrLf
                 StatusTxt = "登陆服务器"
            Case MAIL_HELO
                 m_State = MAIL_USER
                 Winsock1.SendData "AUTH LOGIN" & vbCrLf
                 StatusTxt = "正在校验用户名"
            Case MAIL_USER
                 m_State = MAIL_PASS
                 Winsock1.SendData (Base64_Encode(user)) & vbCrLf '用户名
                 StatusTxt = "校验用户密码"
            Case MAIL_PASS
                 m_State = mail_login
                 Winsock1.SendData (Base64_Encode(pwd)) & vbCrLf    '密码
                 StatusTxt = "发送人邮件地址"
            Case mail_login
                 m_State = MAIL_from
                 Winsock1.SendData "MAIL FROM:很远的地方" & vbCrLf  '显示从那里来的
                 StatusTxt = "接收人邮件地址"
            Case MAIL_from
                 m_State = MAIL_RCPTTO
                 Winsock1.SendData "RCPT TO:" & address & vbCrLf  '发送的目的地
                 StatusTxt = "邮件发送之中..."
            Case MAIL_RCPTTO
                 m_State = MAIL_DATA
                 Winsock1.SendData "DATA" & vbCrLf
                 StatusTxt = "获取邮件内容"
            Case MAIL_DATA
                m_State = MAIL_DOT
                Winsock1.SendData "From:bob<zxb>" & vbCrLf
                Winsock1.SendData "To:xiaoqiang <xiaoqiang>" & vbCrLf
                Winsock1.SendData strimeall & vbCrLf
                Winsock1.SendData strime & vbCrLf
                Winsock1.SendData "." & vbCrLf
                StatusTxt = "邮件送完毕"
            Case MAIL_DOT
                m_State = MAIL_QUIT
                Winsock1.SendData "QUIT" & vbCrLf
                StatusTxt = "邮件成功发送!!!"
                MsgBox "asd"
              Case MAIL_QUIT
                 Winsock1.Close
                 StatusTxt = "待命之中..."
         End Select
    Else
         Winsock1.Close
    End If
Debug.Print strServerResponse
End Sub