背景:最近给一家客户安装服务,发现nodemailer邮件服务怎么发送都失败
开始的报错是greeting never received
,然后各种尝试添加各种配置项,并未解决问题
终端测试:
telnet xxx 25 -->220
HELO xxx -->250
auth login -->334(等待服务器返回后输入账号密码对应的base64码)
mail from: xxx -->250
rcpt to: xxx, xxx
data
Subject: xxx
Hello,
xxx
.
发送成功会返回success
base64加密解密
客户加了白名单,跳过auth login这一步,通过终端测试发现可以发送邮件
通过nodemail发送失败
在终端测试的过程中发现,telnet 25端口后等待时间很长才会返回20x的响应码
抓包分析
从抓包文件可以看到:
123 | 三次握手后,等待了10s,服务端没有响应 |
45 | 10s后客户端发起挥手 |
6 | 挥手时服务端又返回220 |
789 | 这时客户端再发起挥手,结束一次请求 |
smtp包传输正常应该是
- ->tcp三次握手 [SYN],[SYN, ACK],[ACK]
- ->smtp交互完成
- ->tcp挥手 [FIN, ACK],[ACK]
处理
从日志看,服务端10s是有返回的,而客户端10s后则开始挥手,终端测试正常
所以发现,nodemailer默认的超时时间是10s,于是找到node_modules中smtp-connection/src/smtp-connection.js
修改320行,将10000超时时间设置为20000,重启邮件服务,解决
但问题根本在于网络请求服务端等待10s后才响应,排查中..