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 } // BuildReplyMail 生成「收到新回复」提醒邮件 // displayFloor 为页面可见顶层楼号;底部展示帖子主题,不展示路径 URL。 func BuildReplyMail(siteName, authorName, postTitle string, displayFloor int, isNested bool, excerpt, link string) (subject, textBody, htmlBody string) { siteName = strings.TrimSpace(siteName) if siteName == "" { siteName = "姜十三论坛" } authorName = strings.TrimSpace(authorName) if authorName == "" { authorName = "有人" } postTitle = strings.TrimSpace(postTitle) if postTitle == "" { postTitle = "未知帖子" } subject = fmt.Sprintf("【%s】收到新回复", siteName) bodyLine := FormatReplyContent(authorName, postTitle, displayFloor, isNested) textBody = fmt.Sprintf("你好,\n\n%s\n", bodyLine) if excerpt != "" { textBody += "\n摘要:\n" + excerpt + "\n" } textBody += fmt.Sprintf("\n帖子:《%s》\n", postTitle) if link != "" { textBody += "链接:" + link + "\n" } textBody += fmt.Sprintf("\n— %s\n", siteName) safeSite := html.EscapeString(siteName) safeBody := html.EscapeString(bodyLine) safeTitle := html.EscapeString(postTitle) safeExcerpt := html.EscapeString(excerpt) safeLink := html.EscapeString(link) preheader := html.EscapeString(fmt.Sprintf("%s 回复了你在《%s》中的内容", authorName, postTitle)) linkBlock := "" if link != "" { linkBlock = fmt.Sprintf(`

查看讨论

`, safeLink) } excerptBlock := "" if excerpt != "" { excerptBlock = fmt.Sprintf(`
%s
`, safeExcerpt) } htmlBody = fmt.Sprintf(` %s
%s
%s
回复提醒

你好,

%s

%s %s
帖子:《%s》
此邮件由 %s 自动发送,请勿直接回复
`, html.EscapeString(subject), preheader, safeSite, safeBody, excerptBlock, linkBlock, safeTitle, safeSite, ) return subject, textBody, htmlBody } // BuildModerationMail 生成「待审核」提醒邮件;kindLabel 为「帖子」或「评论」 // displayFloor 为可见顶层楼号;评论场景 isNested 区分顶层/子回复文案。 func BuildModerationMail(siteName, kindLabel, authorName, postTitle string, postID uint, displayFloor int, isNested bool, adminLink string) (subject, textBody, htmlBody string) { siteName = strings.TrimSpace(siteName) if siteName == "" { siteName = "姜十三论坛" } kindLabel = strings.TrimSpace(kindLabel) if kindLabel == "" { kindLabel = "内容" } authorName = strings.TrimSpace(authorName) if authorName == "" { authorName = "用户" } postTitle = strings.TrimSpace(postTitle) if postTitle == "" { postTitle = "未知帖子" } subject = fmt.Sprintf("【%s】新的待审核%s", siteName, kindLabel) var detail string switch { case kindLabel == "评论" && isNested && displayFloor > 0: detail = fmt.Sprintf("用户 %s 在《%s》#%d 楼下提交了待审核回复", authorName, postTitle, displayFloor) case kindLabel == "评论" && displayFloor > 0: detail = fmt.Sprintf("用户 %s 在《%s》提交了待审核 #%d 楼评论", authorName, postTitle, displayFloor) default: detail = fmt.Sprintf("用户 %s 提交了待审核%s《%s》(#%d)", authorName, kindLabel, postTitle, postID) } textBody = fmt.Sprintf("你好,\n\n%s。\n请尽快前往管理后台处理。\n", detail) textBody += fmt.Sprintf("\n帖子:《%s》\n", postTitle) if adminLink != "" { textBody += "链接:" + adminLink + "\n" } textBody += fmt.Sprintf("\n— %s\n", siteName) safeSite := html.EscapeString(siteName) safeKind := html.EscapeString(kindLabel) safeDetail := html.EscapeString(detail) safeTitle := html.EscapeString(postTitle) safeLink := html.EscapeString(adminLink) preheader := html.EscapeString(fmt.Sprintf("有新的待审核%s需要处理", kindLabel)) linkBlock := "" if adminLink != "" { linkBlock = fmt.Sprintf(`

前往审核

`, safeLink) } htmlBody = fmt.Sprintf(` %s
%s
%s
待审核提醒

你好,

%s。

请尽快前往管理后台处理该%s。

%s
帖子:《%s》
此邮件由 %s 自动发送,请勿直接回复
`, html.EscapeString(subject), preheader, safeSite, safeDetail, safeKind, linkBlock, safeTitle, safeSite, ) return subject, textBody, htmlBody }