急,用winsock编写的发送邮件中的附件问题 发送过程中附件的编码需要采用Base64格式,请教高手发附件是怎么样的过程,如何实现,请高手指教,如测试通过追加100分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 附件是编码在MIME格式的信里的,你要做的就是编码一份MIME的信来。然后就和普通的信一样发就行 mime的格式协议对话,你可以用 网络监视软件看看foxmail outlook的网络数据就行 电子邮件发附件的过程和普通发邮件的过程是一样的,是完全没有区别的。只是带附件的邮件里内容比普通的邮件内容多了由MIME编码的文件内容而已。如果你想了解邮件的格式,可以拿OutLook创建邮件,然后另存为eml文件,可以用记事本打开eml文件的方法来观察邮件内容格式。至于MIME编码是如何进行的?其原理在网络上也有很多说明。MIME编码分为两种,一种是16进制,一种是64进制16进制接触了很多了,通常我们平常看到的是这样的16进制:D3 F2 C3 FB在网页的URL编码里是这样表示的%D3%F2%C3%FB而在邮件里则是这样而已=D3=F2=C3=FB64进制在平时就接触得少一点,不过也不是很难的是,说白了就是进制转换的问题我们在VB里使用的最小的单位是字节,而一个字节的范围是0-255,如果想存256这个数字就必须由两个字节来存储,也就是到了256就进了一个字节位,也就是说是256进制。如果要将文件的字节内容转换成邮件的附件内容,其实就是个进制转换的问题。其实可以选择用16进制或64进制的,只是因为如果要将字节内容转换为文本形势的16进制数占用的实际空间要比64进制表是的文本内容大,所以通常都会用64进制的方式进行编码。其实一个字节的数值范围是0-255,255在二进制里表示则是11111111,即8个二进制位所组成,而64进制的数值范围是0-63,而63在二进制里表示则是111111,即6个二进制位而64进制的表示码是:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/A 表示数值 0B 表示数值 1C 表示数值 2D 表示数值 3...8 表示数值 609 表示数值 61+ 表示数值 62/ 表示数值 63比如要将4个字节转换成64进制表是可以这样来看字符串 域 名ASCII码16进制 D3 F2 C3 FB二进制表示 11010011 11110010 11000011 11111011上面是以二进制8位的排列方式排列的,下面我们按6位,即64进制的排列方法看一下MIME64二进制 110100 111111 001011 000011 111110 110000MIME64码数值 52 63 11 3 62 48MIME64码 0 / L D + w因为实际的二进制位只有 110100 111111 001011 000011 111110 11因为最后的字节需要补齐 110100 111111 001011 000011 111110 110000如果差两个二进制位由一个“=”补充说明,现在差4个二进制位,所以就以“==”补充说明这也是MIME编码的规则之一MIME64码结果可以这样表示 0/LD+D== 谢谢楼上捧场,不过我贴错了,呵呵MIME64码结果可以这样表示 0/LD+w== http://topic.csdn.net/u/20080629/14/dced8969-21d9-4ab4-9227-da7f62010d9f.html 上面的代码原VB代码当中是不支持附件发送的,所以基本上只是说明一个原理,需要自己进行一些修改.下面是一个Base64编码(很多年前的代码了,未考虑效率)Function MyASC(OneChar) If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)End FunctionPrivate Function Base64Encode(inData) Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" Dim cOut, sOut, i For i = 1 To Len(inData) Step 3 Dim nGroup As Long Dim pOut, sGroup nGroup = &H10000 * Asc(Mid(inData, i, 1)) + &H100 * MyASC(Mid(inData, i + 1, 1)) + MyASC(Mid(inData, i + 2, 1)) sGroup = Oct(nGroup) sGroup = String(8 - Len(sGroup), "0") & sGroup pOut = Mid(Base64, CLng("&o" & Mid(sGroup, 1, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 3, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 5, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 7, 2)) + 1, 1) sOut = sOut + pOut If (i + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf Next Select Case Len(inData) Mod 3 Case 1: sOut = Left(sOut, Len(sOut) - 2) + "==" Case 2: sOut = Left(sOut, Len(sOut) - 1) + "=" End Select Base64Encode = sOutEnd Function 如果你想了解邮件的格式,可以拿OutLook创建邮件,然后另存为eml文件, 可以用记事本打开eml文件的方法来观察邮件内容格式。而且你还可以把你要发送的邮件内容存成文件的形势,如:mail.eml然后用OutLook打开看看结果对了没有。 我想发附件的编码没什么问题了,但接收到的邮件附件却是一堆乱码,即是之前的编码,并没有解码?请问怎么解决?公司邮件软件用的Lotus,对应解析是否有问题呢? 换句话说如何编一份MIME的信,请帮忙,谢谢!!! 就是你的邮件格式有问题,不然不会邮件编码没问题而不解码的。告诉你的方法你要去试验去观察去求证,不要自以为是先好不好。你先用Outlook做一个你想自己发的内容的eml文件,然后你对比一下和你的有什么不同再说。如果你的和Outlook一样,这样还不行,那就是那个邮件查看器的问题了。 楼上的一番话犹如当头棒喝,你说的很对,我仔细看了下邮件格式,发现是MIME格式有问题 求助:有关数码相机照片EXIF信息的问题 初学者的几个小疑问? 谢谢 ! 如何将文件放入回收站? 如何查询时间为空?? 在线等待:一句sql代码关联一个库中两个用户的表,在VB中执行出问题,请各位看一下代码,帮我分析一下原因! 如何修改正在运行的程序的文件? 新手求助,关于文件问题?? vb中怎样用DELPHI中的Tstringgrid控件啊,急着给分 请教:vb的打包向导出了问题 我如何在水晶报表中动态的显示表头 請問在VB6中如何禁止鼠標事件,當處理程序結束后允許 快来看呀
协议对话,你可以用 网络监视软件看看foxmail outlook的网络数据就行
只是带附件的邮件里内容比普通的邮件内容多了由MIME编码的文件内容而已。
如果你想了解邮件的格式,可以拿OutLook创建邮件,然后另存为eml文件,
可以用记事本打开eml文件的方法来观察邮件内容格式。
至于MIME编码是如何进行的?其原理在网络上也有很多说明。
MIME编码分为两种,一种是16进制,一种是64进制
16进制接触了很多了,通常我们平常看到的是这样的16进制:
D3 F2 C3 FB
在网页的URL编码里是这样表示的
%D3%F2%C3%FB
而在邮件里则是这样而已
=D3=F2=C3=FB64进制在平时就接触得少一点,不过也不是很难的是,说白了就是进制转换的问题
我们在VB里使用的最小的单位是字节,而一个字节的范围是0-255,
如果想存256这个数字就必须由两个字节来存储,也就是到了256就进了一个字节位,
也就是说是256进制。如果要将文件的字节内容转换成邮件的附件内容,其实就是个
进制转换的问题。其实可以选择用16进制或64进制的,只是因为如果要将字节内容
转换为文本形势的16进制数占用的实际空间要比64进制表是的文本内容大,所以通常
都会用64进制的方式进行编码。其实一个字节的数值范围是0-255,255在二进制里表示则是11111111,即8个二进制位所组成,
而64进制的数值范围是0-63,而63在二进制里表示则是111111,即6个二进制位
而64进制的表示码是:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
A 表示数值 0
B 表示数值 1
C 表示数值 2
D 表示数值 3
...
8 表示数值 60
9 表示数值 61
+ 表示数值 62
/ 表示数值 63比如要将4个字节转换成64进制表是可以这样来看字符串 域 名
ASCII码16进制 D3 F2 C3 FB
二进制表示 11010011 11110010 11000011 11111011
上面是以二进制8位的排列方式排列的,下面我们按6位,即64进制的排列方法看一下
MIME64二进制 110100 111111 001011 000011 111110 110000
MIME64码数值 52 63 11 3 62 48
MIME64码 0 / L D + w
因为实际的二进制位只有 110100 111111 001011 000011 111110 11
因为最后的字节需要补齐 110100 111111 001011 000011 111110 110000
如果差两个二进制位由一个“=”补充说明,现在差4个二进制位,所以就以“==”补充说明
这也是MIME编码的规则之一MIME64码结果可以这样表示 0/LD+D==
MIME64码结果可以这样表示 0/LD+w==
下面是一个Base64编码(很多年前的代码了,未考虑效率)
Function MyASC(OneChar)
If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function
Private Function Base64Encode(inData)
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim cOut, sOut, i
For i = 1 To Len(inData) Step 3
Dim nGroup As Long
Dim pOut, sGroup
nGroup = &H10000 * Asc(Mid(inData, i, 1)) + &H100 * MyASC(Mid(inData, i + 1, 1)) + MyASC(Mid(inData, i + 2, 1))
sGroup = Oct(nGroup)
sGroup = String(8 - Len(sGroup), "0") & sGroup
pOut = Mid(Base64, CLng("&o" & Mid(sGroup, 1, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 3, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 5, 2)) + 1, 1) + Mid(Base64, CLng("&o" & Mid(sGroup, 7, 2)) + 1, 1)
sOut = sOut + pOut
If (i + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
Next
Select Case Len(inData) Mod 3
Case 1:
sOut = Left(sOut, Len(sOut) - 2) + "=="
Case 2:
sOut = Left(sOut, Len(sOut) - 1) + "="
End Select
Base64Encode = sOut
End Function
可以用记事本打开eml文件的方法来观察邮件内容格式。而且你还可以把你要发送的邮件内容存成文件的形势,如:mail.eml
然后用OutLook打开看看结果对了没有。
并没有解码?请问怎么解决?
公司邮件软件用的Lotus,对应解析是否有问题呢?
就是你的邮件格式有问题,不然不会邮件编码没问题而不解码的。
告诉你的方法你要去试验去观察去求证,不要自以为是先好不好。
你先用Outlook做一个你想自己发的内容的eml文件,然后你对比一下和你的有什么不同再说。
如果你的和Outlook一样,这样还不行,那就是那个邮件查看器的问题了。