急,用winsock编写的发送邮件中的附件问题

murphy1005 2008-09-19 04:09:39
发送过程中附件的编码需要采用Base64格式,请教高手发附件是怎么样的过程,如何实现,请高手指教,如测试通过追加100分
...全文
214 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
murphy1005 2008-09-25
  • 打赏
  • 举报
回复
楼上的一番话犹如当头棒喝,你说的很对,我仔细看了下邮件格式,发现是MIME格式有问题
现在还是人类 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiamaoting 的回复:]
我想发附件的编码没什么问题了,但接收到的邮件附件却是一堆乱码,即是之前的编码,
并没有解码?请问怎么解决?
公司邮件软件用的Lotus,对应解析是否有问题呢?
[/Quote]

就是你的邮件格式有问题,不然不会邮件编码没问题而不解码的。
告诉你的方法你要去试验去观察去求证,不要自以为是先好不好。
你先用Outlook做一个你想自己发的内容的eml文件,然后你对比一下和你的有什么不同再说。
如果你的和Outlook一样,这样还不行,那就是那个邮件查看器的问题了。
murphy1005 2008-09-24
  • 打赏
  • 举报
回复
换句话说如何编一份MIME的信,请帮忙,谢谢!!!
murphy1005 2008-09-24
  • 打赏
  • 举报
回复
我想发附件的编码没什么问题了,但接收到的邮件附件却是一堆乱码,即是之前的编码,
并没有解码?请问怎么解决?
公司邮件软件用的Lotus,对应解析是否有问题呢?
僵哥 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiamaoting 的回复:]
把附件的文件内容读出来编码,然后作为邮件体的一部分发出去,结果接收邮件时并没有发现附件,内容倒有,只是没有提取出来,请教是不是邮件服务器是不是对附件设立了什么标志呢?
[/Quote]
要么是编码错误,要么是接收端对附件解析不正确.服务器不做附件处理.
murphy1005 2008-09-23
  • 打赏
  • 举报
回复
把附件的文件内容读出来编码,然后作为邮件体的一部分发出去,结果接收邮件时并没有发现附件,内容倒有,只是没有提取出来,请教是不是邮件服务器是不是对附件设立了什么标志呢?
现在还是人类 2008-09-23
  • 打赏
  • 举报
回复
如果你想了解邮件的格式,可以拿OutLook创建邮件,然后另存为eml文件,
可以用记事本打开eml文件的方法来观察邮件内容格式。

而且你还可以把你要发送的邮件内容存成文件的形势,如:mail.eml
然后用OutLook打开看看结果对了没有。
僵哥 2008-09-20
  • 打赏
  • 举报
回复
上面的代码原VB代码当中是不支持附件发送的,所以基本上只是说明一个原理,需要自己进行一些修改.
下面是一个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
现在还是人类 2008-09-20
  • 打赏
  • 举报
回复
谢谢楼上捧场,不过我贴错了,呵呵
MIME64码结果可以这样表示 0/LD+w==
tzwsoho 2008-09-20
  • 打赏
  • 举报
回复
3楼好帖~~~学习~~~留印.....
zzyong00 2008-09-19
  • 打赏
  • 举报
回复
精辟!
现在还是人类 2008-09-19
  • 打赏
  • 举报
回复
电子邮件发附件的过程和普通发邮件的过程是一样的,是完全没有区别的。
只是带附件的邮件里内容比普通的邮件内容多了由MIME编码的文件内容而已。
如果你想了解邮件的格式,可以拿OutLook创建邮件,然后另存为eml文件,
可以用记事本打开eml文件的方法来观察邮件内容格式。
至于MIME编码是如何进行的?其原理在网络上也有很多说明。
MIME编码分为两种,一种是16进制,一种是64进制
16进制接触了很多了,通常我们平常看到的是这样的16进制:
D3 F2 C3 FB
在网页的URL编码里是这样表示的
%D3%F2%C3%FB
而在邮件里则是这样而已
=D3=F2=C3=FB

64进制在平时就接触得少一点,不过也不是很难的是,说白了就是进制转换的问题
我们在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==
dragronboy 2008-09-19
  • 打赏
  • 举报
回复
mime的格式
协议对话,你可以用 网络监视软件看看foxmail outlook的网络数据就行
dragronboy 2008-09-19
  • 打赏
  • 举报
回复
附件是编码在MIME格式的信里的,你要做的就是编码一份MIME的信来。然后就和普通的信一样发就行


7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧