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(`
`, 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
}