100分求高人路过驻足:winsock发附件,大致是如何个步骤呢?是不是先base64加密,然后才发数据?不能直接发

100分求高人路过驻足:winsock发附件,大致是怎么个步骤呢?是不是先base64加密,然后才发数据?不能直接发?类

100分求高人路过驻足:winsock发附件,大致是怎么个步骤呢?是不是先base64加密,然后才发数据?不能直接发?
类似这样的数据?:看不懂

VB code
        wsk.SendData "--Unique-Boundary" & vbCrLf        wsk.SendData "Content-Type: multipart/parallel; boundary=Unique-Boundary-2" & vbCrLf & vbCrLf        wsk.SendData "--Unique-Boundary-2" & vbCrLf        wsk.SendData "Content-Type: application/octet-stream;" & vbCrLf        wsk.SendData " name=" & strAttachName & vbCrLf'strAttachName是附件含路径名        wsk.SendData "Content-Transfer-Encoding: base64" & vbCrLf        wsk.SendData "Content-Disposition: inline;" & vbCrLf        wsk.SendData " filename=" & strAttachName & vbCrLf & vbCrLf'strAttachName是附件含路径名        wsk.SendData txtEncodedFile.Text & "==" & vbCrLf'这个是干嘛的? 更多代码详见下面        wsk.SendData "--Unique-Boundary-2----Unique-Boundary--"


完整代码:包括一个窗体和一个模块:太长了,模块在2 3楼.或者劳驾移步下载:http://download.csdn.net/detail/j88198188/4078600
窗体:
VB code
Option ExplicitPrivate Sub cmdAbout_Click()    frmAbout.Show vbModalEnd SubPrivate Sub cmdClose_Click()    Unload MeEnd SubPrivate Sub cmdSelect_Click()            cmdDialog.ShowOpen    txtAttach = cmdDialog.FileName    End SubPrivate Sub cmdSend_Click()        cmdSend.Enabled = False        If ValidateEntry = False Then MsgBox "Either the server name or to address were left empty.", vbCritical + vbOKOnly, Me.Caption: cmdSend.Enabled = True: Exit Sub        If txtAttach.Text <> "" Then        lblStatus = "Encoding file attachment"        Base64EncodeFile txtAttach.Text, rtfAttach, txtOutput    End If        lblStatus = "Connecting to POP Server"    ConnectToServer txtServer.Text, Winsock1    End SubPrivate Sub Form_Load()        txtAttach = ""    txtBody = ""    txtFromAddress = ""    txtServer = ""    txtSubject = ""    txtToAddress = ""        End SubPrivate Sub Winsock1_Connect()        lblStatus = "Connected to POP Server"        Wait 0.5        lblStatus = "Sending mail"        If txtAttach.Text = "" Then            SendMail txtFromAddress, txtToAddress, txtSubject, txtBody, Winsock1        Else            SendMail txtFromAddress, txtToAddress, txtSubject, txtBody, Winsock1, txtAttach, txtOutput        End If        lblStatus = "Mail sent"        cmdSend.Enabled = True        lblStatus = "Status:"    End SubPrivate Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)        MsgBox "Error Number: " & Number & vbCrLf & Description & vbCrLf & Source, vbCritical + vbOKOnly, Me.Caption    End SubPrivate Function ValidateEntry() As Boolean        ValidateEntry = True        If txtServer.Text = "" Or txtToAddress = "" Then ValidateEntry = False    End Function



[解决办法]
前面我说得不准确
在收邮件的时候,除了附件显示是BASE64密文外,登陆、服务器响应,都是明文的
发邮件的时候,登陆时的用户名密码需要用BASE64密文,附件需要BASE64密文,其它都是明文(包括邮件正文,邮箱地址,主题等)
 "=="可能充当的是“数据尾”的功能,与回车换行一起表示数据发送完毕
我再研究一下
[解决办法]
发送电子邮件附件


与简单电子邮件发送程序相比,本示例程序多了框架控件及其中的内容。框架中的列表框用来显示附件的路径,另外两个按钮的作用相信你一看就知道。真正发送附件的代码在Send message按钮的Click事件中。在该事件中多了一小段代码:

For i = 0 To lstAttachments.ListCount - 1
lstAttachments.ListIndex = i


m_strEncodedFiles = m_strEncodedFiles & _
UUEncodeFile(lstAttachments.Text) & vbCrLf
Next i 
上面的代码将附件的路径作为参数传递给UUEncodeFile函数。该函数的作用是按照我们前面所讲的算法对字符进行编码。编码后的数据被保存在一个模块级变量m_strEncodedFile中。然后该变量的内容被添加到邮件正文中:

'Add atacchments 
strMessage = txtMessage & vbCrLf & vbCrLf & m_strEncodedFiles

剩下的事情就再清楚不过了。编码后的数据作为邮件的一部分发送出却,你不需编写特别的代码处理SMTP服务器。下面的函数UUEncodeFile的代码:

Public Function UUEncodeFile(strFilePath As String) As String

Dim intFile As Integer 'file handler
Dim intTempFile As Integer '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 Integer 'loop counter

Dim strResult As String
'
'Get file name
strFileName = Mid$(strFilePath, InStrRev(strFilePath, "\") + 1)
'
'Insert first marker: "begin 664 ..."
strResult = "begin 664 " + strFileName + vbLf
'
'Get file size
lFileSize = FileLen(strFilePath)
lEncodedLines = lFileSize \ 45 + 1
'
'Prepare buffer to retrieve data from
'the file by 45 symbols chunks
strFileData = Space(45)
'
intFile = FreeFile
'
Open strFilePath For Binary As intFile
For i = 1 To lEncodedLines
'Read file data by 45-bytes cnunks
'
If i = lEncodedLines Then
'Last line of encoded data often is not
'equal to 45, therefore we need to change
'size of the buffer
strFileData = Space(lFileSize Mod 45)
End If
'Retrieve data chunk from file to the buffer
Get intFile, , strFileData
'Add first symbol to encoded string that informs
'about quantity of symbols in encoded string.
'More often "M" symbol is used.
strTempLine = Chr(Len(strFileData) + 32)
'
If i = lEncodedLines And (Len(strFileData) Mod 3) Then
'If the last line is processed and length of
'source data is not a number divisible by 3, 
'add one or two blankspace symbols
strFileData = strFileData + Space(3 - (Len(strFileData) Mod 3))
End If

For j = 1 To Len(strFileData) Step 3
'Breake each 3 (8-bits) bytes to 4 (6-bits) bytes
'
'1 byte
strTempLine = strTempLine + Chr(Asc(Mid(strFileData, j, 1)) \ 4 + 32)
'2 byte
strTempLine = strTempLine + _
Chr((Asc(Mid(strFileData, j, 1)) Mod 4) * 16 + Asc(Mid(strFileData, j + 1, 1)) \ 16 + 32)
'3 byte
strTempLine = strTempLine + _
Chr((Asc(Mid(strFileData, j + 1, 1)) Mod 16) * 4 + Asc(Mid(strFileData, j + 2, 1)) \ 64 + 32)
'4 byte
strTempLine = strTempLine + _
Chr(Asc(Mid(strFileData, j + 2, 1)) Mod 64 + 32)
Next j
'add encoded line to result buffer
strResult = strResult + strTempLine + vbLf
'reset line buffer
strTempLine = ""
Next i
Close intFile
'add the end marker
strResult = strResult & "'" & vbLf + "end" + vbLf
'asign return value
UUEncodeFile = strResult

End Function

我不敢说上面的代码的运行速度是最快的,但却是我试验多次达到的最快速度。VB处理字符并不是它的特长,所以如果速度对你来讲至关重要的话,请尝试用C++或Delphi开发的库或组件。




[解决办法]
試試看在.net之下,外寄郵件會省事許多
Dim mailMessage As New System.Net.Mail.MailMessage()
mailMessage.To.Add(xxx)'寄至郵件地址
mailMessage.From = New System.Net.Mail.MailAddress(xxx)'寄出郵件地址
mailMessage.Subject = xxx'郵件主題
mailMessage.Body = xxx'郵件內容
Dim client As New System.Net.Mail.SmtpClient()
client.Credentials = New System.Net.NetworkCredential(xxx, xxx)'寄出郵件地址,密碼
client.Port = 25
client.Host = "smtp.mail.yahoo.com"
client.EnableSsl = True'是否使用ssl加密


client.Send(mailMessage)

短短幾行就完成了,但您若一定堅持使用winsock可參加這個api說明網址
http://pinvoke.net/default.aspx/ws2_32.WSASocket
[解决办法]
严格地说,Base64 是一种编码方法,而不是加密。

因为历史原因,互联网的有些网段可能是采用 7-bit 传输的。就好像铁路网中间,有些路段是窄轨。为了保证 Email 传输的数据能够通过所有网段,因此要将数据采用 Base64 编码,使所有的数据都以最高位为 0 的 ASCII 编码来表示。显然,由于每字节的信息量小了,就必然要增加字节数,以保证足够的信息量。

因此,凡是需要传递到收件人的信息,都必须采用 Base64 编码。