gpt4 book ai didi

node.js - 如何使用 Node.js Net 发送 SMTP 消息(不使用 Nodemailer)

转载 作者:太空宇宙 更新时间:2023-11-04 01:36:33 25 4
gpt4 key购买 nike

第一:不要告诉我使用nodemailer。我正在尝试学习网络编程,并希望用多种语言从头开始。

我正在尝试执行一项相当简单的任务:使用 TCP 套接字发送 SMTP 电子邮件。我在 Python 3.6 中有一个有效的实现:

from socket import socket, AF_INET, SOCK_STREAM
# Choose a mail server (e.g. Google mail server) and call it mailserver
mailserver = 'gmail-smtp-in.l.google.com'

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM)

def recv():
print(clientSocket.recv(1024).decode())

# Port number may change according to the mail server
clientSocket.connect((mailserver, 25))
recv()

# Send HELO command and print server response.
clientSocket.send('HELO gmail \r\n'.encode())
recv()

# Send MAIL FROM command and print server response.
clientSocket.send('MAIL FROM: <ethan.arrowood@gmail.com>\r\n'.encode())
recv()

# Send RCPT TO command and print server response.
clientSocket.send('RCPT TO: <ethan.arrowood@gmail.com>\r\n'.encode())
recv()

# Send DATA command and print server response.
clientSocket.send('DATA\r\n'.encode())
recv()

# Send message data. Make sure to include header lines: From, To, Subject
clientSocket.send('FROM: <ethan.arrowood@gmail.com>\r\n'.encode())
clientSocket.send('TO: <ethan.arrowood@gmail.com>\r\n'.encode())
clientSocket.send('SUBJECT: Testing\r\n'.encode())
clientSocket.send('This is cool!\r\n'.encode())
# Message ends with a single period.
clientSocket.send('.\r\n'.encode())
recv()
# Send QUIT command and get server response
clientSocket.send('QUIT\r\n'.encode())
recv()

它可以工作并将以下内容输出到我的控制台中:

220 mx.google.com ESMTP m30si710943qtg.40 - gsmtp

250 mx.google.com at your service

250 2.1.0 OK m30si710943qtg.40 - gsmtp

250 2.1.5 OK m30si710943qtg.40 - gsmtp

354 Go ahead m30si710943qtg.40 - gsmtp

250 2.0.0 OK 1548694151 m30si710943qtg.40 - gsmtp

221 2.0.0 closing connection m30si710943qtg.40 - gsmtp

我现在正在尝试使用 Node.js 11.7.0 使用 Net 模块来实现同样的事情。我的代码:

const net = require('net')

const socket = net.createConnection(25, 'gmail-smtp-in.l.google.com', () => {
console.log('Connected!')

socket.write('HELO gmail\r\n')

socket.write('MAIL FROM: <ethan.arrowood@gmail.com>\r\n')

socket.write('RCPT TO: <ethan.arrowood@gmail.com>\r\n')

socket.write('DATA\r\n')

socket.write('FROM: <ethan.arrowood@gmail.com>\r\n')
socket.write('TO: <ethan.arrowood@gmail.com>\r\n')
socket.write('SUBJECT: Testing\r\n')
socket.write('This is cool!\r\n')
socket.write('.\r\n')

socket.write('QUIT\r\n')
})

socket.on('data', buff => console.log(buff.toString()))

此代码不起作用,并会产生以下终端输出:

Connected!
220 mx.google.com ESMTP 88si682318qte.245 - gsmtp

250 mx.google.com at your service

451 4.5.0 SMTP protocol violation, see RFC 2821 88si682318qte.245 - gsmtp

451 错误没有说明任何问题。我不认为问题出在编码上,因为 Node.js 和 Python3 都默认为 UTF-8。

我认为我的错误与我调用 .write 的方式有关。就像 SMTP 服务器在有机会响应前一个命令之前接收命令一样。这让我相信 Python3 版本中默认提供的 Node.js 实现缺少一些东西。

任何线索或其他想法将不胜感激。

我希望我的 Node.js 实现能够像 Python3 实现一样工作。

最佳答案

socket.write 是一个异步函数。您不能只创建一个 socket.write 列表并期望它们按顺序运行。

您必须使用回调并编写类似的内容

socket.write( msg1 , () =>
socket.write( msg2 , () => {
[ .. ]
} );
} );

关于node.js - 如何使用 Node.js Net 发送 SMTP 消息(不使用 Nodemailer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54407086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com