问:

SMTP 协议不能传输2进制数据问题

答:
SMTP 协议是一种文本协议,它只能传输ASCII编码的文本数据,不能直接传输二进制数据。这是因为:
1. SMTP 使用的传输通道是TCP,TCP是一个字节流协议,不区分传输的是文本还是二进制数据。
2. SMTP 协议本身是一种文本协议,它的命令和响应都是ASCII编码的字符串,不支持二进制数据。
3. 邮件内容也要符合邮件格式标准,比如MIME格式,这也要求邮件内容主要是文本和文本编码的二进制内容,而不是原生二进制内容。
为了解决这个问题,SMTP引入了一些机制来传输二进制数据:
1. 将二进制数据进行Base64编码变成ASCII文本后再传输。接收方再进行Base64解码得到原始二进制数据。这是最常用的方法。
2. 使用MIME的二进制编码机制,将二进制数据包装到MIME消息中传输。这样SMTP仍然只传输文本,但文本中包含了编码后的二进制数据。
3. 不直接在SMTP中传输二进制数据,而是在SMTP消息中提供二进制数据的URL,让接收方从那个URL下载二进制数据。
4. 使用SMTP的8BITMIME扩展,这是一个非正式的扩展,允许二进制数据按原样传输,但是并不是所有的SMTP服务器和客户端都支持这个扩展。
所以综上,如果要在SMTP中传输二进制数据,需要对数据进行编码和封装,让其符合SMTP 的文本协议格式要求。纯粹的大块二进制数据流SMTP仍然无法直接传输。 эт都是因为SMTP是一个相当老的协议了,当初设计时还没有考虑到今天这种大规模二进制数据传输的需求。