package service import ( "fmt" "html" "strings" ) // BuildRegisterCodeMail 生成注册验证码邮件(纯文本 + HTML) // 预览文案刻意不把验证码与「10分钟」紧邻,避免邮箱摘要显示成 8 位数字。 func BuildRegisterCodeMail(siteName, code string, ttlMinutes int) (subject, textBody, htmlBody string) { siteName = strings.TrimSpace(siteName) if siteName == "" { siteName = "姜十三论坛" } if ttlMinutes <= 0 { ttlMinutes = 10 } subject = fmt.Sprintf("【%s】注册验证码", siteName) // 纯文本:验证码单独成段,数字间加空格,有效期另起一段 spaced := strings.Join(strings.Split(code, ""), " ") textBody = fmt.Sprintf( "你好,\n\n你正在注册 %s。请在注册页填写以下验证码:\n\n%s\n\n(共 %d 位数字)\n\n有效期:%d 分钟。\n如非本人操作,请忽略本邮件。\n\n— %s\n", siteName, spaced, len(code), ttlMinutes, siteName, ) safeSite := html.EscapeString(siteName) safeCode := html.EscapeString(code) // 预览摘要:不含验证码数字,避免与有效期粘连 preheader := html.EscapeString(fmt.Sprintf("完成 %s 注册:请填写邮件中的验证码,有效期 %d 分钟。", siteName, ttlMinutes)) htmlBody = fmt.Sprintf(` %s
%s
%s
注册邮箱验证

你好,

你正在注册 %s。请在注册页面输入下方验证码:

验 证 码
%s

共 %d 位数字,请完整输入

有效期:%d 分钟
超时请返回注册页重新获取验证码。

如非本人操作,请忽略本邮件。请勿将验证码告知他人。

此邮件由 %s 自动发送,请勿直接回复
`, html.EscapeString(subject), preheader, safeSite, safeSite, safeCode, len(code), ttlMinutes, safeSite, ) return subject, textBody, htmlBody }