Skip to content

fix(smtp): 在 Reset 中清理会话状态 - #373

Open
0clickjacking0 wants to merge 1 commit into
Jinnrry:masterfrom
0clickjacking0:fix/smtp-session-reset-pr
Open

0clickjacking0 wants to merge 1 commit into
Jinnrry:masterfrom
0clickjacking0:fix/smtp-session-reset-pr

Conversation

@0clickjacking0

@0clickjacking0 0clickjacking0 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

问题

go-smtp 在重置连接时会回调 Session.Reset(),包括 DATA 结束后以及收到 RSET 命令时。

PMail 在 Session.From 和 Session.To 中保存当前邮件的发件人和收件人状态,但当前实现是空函数:

func (s *Session) Reset() {}

go-smtp 会清理框架自身的 fromReceived 和 recipients 状态,但不会清理 PMail 业务层保存的 From / To。因此当同一条 SMTP 连接被复用时,下一封邮件可能继承上一封邮件的收件人,导致同连接上的邮件串发。

修复

在 Session.Reset() 中清理业务层会话状态:

func (s *Session) Reset() {
    s.From = ""
    s.To = nil
}

测试

新增单元测试覆盖:

  • Reset() 清理已有 From / To 状态
  • Reset() 对空状态和重复调用保持幂等

本地验证命令:

cd server
go test ./listen/smtp_server/ -run '^TestSessionReset(ClearsState|IsIdempotent)$' -v

@0clickjacking0 0clickjacking0 changed the title fix(smtp): clear session state in Reset fix(smtp): 在 Reset 中清理会话状态 Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant