Smtp邮件服务原理与排错

背景:最近给一家客户安装服务,发现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后才响应,排查中..

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦