背景:最近给一家客户安装服务,发现nodemailer邮件服务怎么发送都失败
开始的报错是greeting never received
,然后各种尝试添加各种配置项,并未解决问题
终端测试:
telnet smtp.qq.com 25
220 smtp.qq.com Esmtp QQ Mail Server
helo sis(这里随意写helo xxx)
250 smtp.qq.com//服务器返回250 smtp.qq.com
STARTTLS
220 Ready to start TLS//服务器返回 220 准备开启TLS通讯
auth login
334 VXNlcm5hbWU6//服务器返回334 VXNlcm5hbWU6(即Username:)
***/*此处输入base64编码后的qq邮箱名*/
334 UGFzc3dvcmQ6
***/*此处输入base64编码后的授权码,需要到qq邮箱申请,自己百度一下*/
235 Authentication successful
mail from: <3463684353@qq.com>//发件邮箱
250 Ok
rcpt to: <3463684353@qq.com>//发件邮箱
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
to: hello//
from: nian//
subject: this is a test telnet smtp mail
hello,telnet//消息内容
.
250 Ok: queued as
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后才响应,排查中..