smtp-protocol中文文档|smtp-protocol js中文教程|解析
smtp-protocol
编写 smtp 客户端和服务器
该模块本身不中继任何消息或执行磁盘 I/O。
例子
服务器
var smtp = ;var server = smtp;server;
用法:
$ node example/server.js
别处:
$ nc localhost 9025
250 beep
helo
250
mail from:<beep@localhost>
250
rcpt to:<boop@localhost>
250
data
354
Beep boop.
I am a computer.
.
250
quit
221 Bye!
同时:
from: beep@localhost
to: boop@localhost
Beep boop.
I am a computer.
客户
var smtp = ;var fs = ;smtp;
输出:
$ node example/client.js
[ 'beep ESMTP Postfix (Ubuntu)' ]
{ helo: 250,
from: 250,
to: 250,
data: 354,
message: 250,
quit: 221 }
服务器方法
var smtp = require(‘smtp-protocol’)
smtp.createServer(opts, cb)
返回一个新的,net.Server
这样你就可以.listen()
在一个端口上。
可选:
opts.domain
– 在 hello 消息中使用的域opts.tls
– 在开始时监听 TLS 而不是使用 STARTTLS 升级opts.key
,opts.cert
,opts.pfx
– 配置 tls
cb(req)
触发新连接。请参阅下面的“请求”部分。
服务器请求
事件
每一个可以举办的活动
ack.accept()
如果没有注册侦听器,除了“消息”之外的每个可确认事件都将隐式调用。
如果有任何可确认事件的侦听器,则只有一个侦听器必须调用ack.accept()
或ack.reject()
。
‘命令’, cmd, r
每个 smtp 命令都会触发此事件。cmd
具有命令名称 as
cmd.name
和cmd.data
as 命令数据。
如果要覆盖命令的默认行为,请调用
r.preventDefault()
,然后调用r.write(code, data)
以写入响应以及
r.next()
何时应处理下一个命令。
‘问候’,cmd,确认
发射时HELO
,EHLO
或LHLO
接收到的命令。
用 读取命令的名称cmd.greeting
。使用 读取可选的主机名参数cmd.hostname
。
‘来自’,来自,确认
的时发射MAIL FROM:
被接收的命令。
from
是作为字符串的发件人的电子邮件地址。
‘到’,到,确认
的时发射RCPT TO:
被接收的命令。
to
是作为字符串的收件人的电子邮件地址。
“消息”,流,确认
的时发射DATA
被接收的命令。
如果消息请求被接受,消息正文将通过 流式传输
stream
。
ack.accept()
当没有侦听器时,此事件没有隐式。
“收到”,确认
DATA
命令完成后的正文时发出。
‘重启’
从RSET
命令重置连接时发出。
‘退出’
从QUIT
命令关闭连接时发出。
‘tls’
当客户端将连接升级到 TLS 时发出。
特性
请求来自
发件人的电子邮件地址作为字符串。
请求来自Ext
如果作为字符串发送,则扩展发件人数据。
要求
作为字符串的收件人电子邮件地址数组。
请求到Ext
如果作为字符串发送,则为扩展收件人数据的数组。
请求问候
问候命令。其中一个'helo'
,'ehlo'
或'lhlo'
。
请求主机名
问候语中指定的主机名。
请求套接字
底层 tcp 套接字。如果您需要使用 验证远程主机的地址,这很方便req.socket.remoteAddress
。
服务器确认
许多请求事件都有一个尾随ack
参数。
如果有任何可确认事件的侦听器,则只有一个侦听器必须调用ack.accept()
或ack.reject()
。
请查阅此方便的 SMTP 代码列表,
了解在确认响应中使用哪些代码。
ack.accept(代码=250,消息)
接受命令。执行来自命令的内部阶段状态修改。
ack.reject(代码,消息)
拒绝命令。来自命令的任何暂存状态修改都将被丢弃。
客户方法
对于所有client
方法,cb(err, code, lines)
随服务器响应触发。
var stream = smtp.connect(host=’localhost’, port=25, options={}, cb)
创建新的 SMTP 客户端连接。
host
, port
,options
和cb
由它们在参数数组中的类型检测,因此它们可以按任何顺序排列。cb(client)
当连接准备好时触发。
您可以通过提供匹配的字符串参数来使用 unix 套接字/^[.\/]/
。
或者提供您自己的流opts.stream
(流必须已经连接)。
要使用 TLS 建立连接,请设置opts.tls
为true
(为了获得更多控制,您还可以指定传递到 的选项tls.connect
。)您还可以随时通过调用 将连接升级到 TLS client.startTLS()
。
默认情况下,与未授权服务器的连接将关闭,错误将作为'error'
流对象上的事件发出,但您可以通过执行以下操作来提供自己的授权逻辑:
stream
client.helo(主机名,cb)
用hostname
字符串向服务器打招呼。
cb(err, code, lines)
与服务器响应一起触发。
client.from(addr, ext=undefined, cb)
将发件人设置为addr
带有可选扩展数据的电子邮件地址ext
。
cb(err, code, lines)
与服务器响应一起触发。
client.to(addr, ext=undefined, cb)
将收件人设置为addr
带有可选扩展数据的电子邮件地址ext
。
cb(err, code, lines)
与服务器响应一起触发。
客户端数据(CB)
告诉服务器我们将要传输数据。
cb(err, code, lines)
与服务器响应一起触发。
var stream = client.message(cb)
返回一个可写的流以在消息正文中将数据发送到服务器。例如,你可以这样做:
fs;
cb(err, code, lines)
与服务器响应一起触发。
client.quit(cb)
要求服务器切断连接。
cb(err, code, lines)
与服务器响应一起触发。
客户端重置(CB)
要求服务器重置连接。
cb(err, code, lines)
与服务器响应一起触发。
client.startTLS(opts={}, cb)
opts
通过传递到
将当前连接升级到 TLS tls.connect(opts)
。
如果opts.servername
未给出,则其值将从 HELO/EHLO 主机名值中获取,否则 TLS 库将抱怨证书名称如何不匹配。
您可能还希望传入opts.ca
此处以满足 TLS 机制。
客户端验证(用户名,CB)
为 发送 VRFY username
。
cb(err, code, lines)
与服务器响应一起触发。
client.login(用户名、密码、authType、cb)
使用给定的用户名和密码登录。authType
可以是PLAIN
,LOGIN
和 之一CRAM-MD5
。
cb(err, code, lines)
与服务器响应一起触发。
客户事件
“问候”,代码,行
当流初始化时触发。这应该是服务器发送的第一条消息。
‘tls’, clearTextStream
当连接升级到 TLS 时,将触发此事件。
安装
用npm做:
npm install smtp-protocol
执照
麻省理工学院