Javascript 我能';无法读取到SMTP服务器的连接上的响应

Javascript 我能';无法读取到SMTP服务器的连接上的响应,javascript,node.js,email,Javascript,Node.js,Email,这是我的密码: socket = new net.Socket().connect(465, 'smtp.gmail.com', () => { console.log('Connected') socket.write('HELO smtp.gmail.com\r\n') }).on('data', (data) => console.log(data)) 当我运行它时,我得到,当转换成文本时,它是不可读的。 如何将其转换为可读的JSON/text/无论它是什么?这里的问

这是我的密码:

socket = new net.Socket().connect(465, 'smtp.gmail.com', () => {
  console.log('Connected')
  socket.write('HELO smtp.gmail.com\r\n')
}).on('data', (data) => console.log(data))
当我运行它时,我得到
,当转换成文本时,它是不可读的。
如何将其转换为可读的JSON/text/无论它是什么?

这里的问题是您正在打开一个针对TLS服务器的套接字。您得到的是二进制数据,而不是纯文本字符串

如果将响应纯文本(JSON字符串)连接到端点,则可以使用toJSON()方法,例如:

console.log(data.toJSON())
如果数据不是JSON,只需使用toString()方法获取字符串:

console.log(data.toString());

有关缓冲区类的更多详细信息,请参见此处的官方文档

感谢@white11和@jfriend00的帮助,我找到了答案:


有关解码TLS流的信息,请参阅。

您得到的显然是二进制的。它不是可读的文本。字节
15 03 01 00 02
都是非文本的。在有人说:“使用nodemailer!”之前,我知道nodemailer是什么。我只想使用内置库。@jfriend00我会看看我能用这些信息做些什么。当您试图将其转换为文本时,它是不可读的,因为缓冲区不包含文本。缓冲区的
15 03 01 00 02
部分都是非ascii的(例如二进制)。@jfriend00,它是基于字节还是作为单个数字转换为二进制?我知道。但是你自己试试我的代码。返回的文本不可读。它会给您“不存在字符、不存在字符、不存在字符、空格、不存在字符、不存在字符、F”
。当二进制数据不代表可读字符时,toString()
不会将二进制数据转换为可读字符串。因为您正在连接到Gmail SMTP服务器,我猜您得到的数据流是TLS流,这就解释了为什么数据是不可读的。您必须使用SMTP客户端库连接到该服务器。是的,请更正@jfriend00,我只是认为二进制流代表一个字符串,否则原来的问题就不存在了';这没有真正的意义。顺便说一句,这里的问题在于套接字是向TLS加密服务器(Gmail SMTP)打开的