37 lines
1.0 KiB
Go
37 lines
1.0 KiB
Go
package mailx
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// htmlTagPattern 匹配 HTML 开标签:< 标签名 [属性...]>
|
|
// 不匹配注释、DTD、结束标签(</)、处理指令(<?),避免普通文本 "a < b > c" 被误判。
|
|
var htmlTagPattern = regexp.MustCompile(`<[a-zA-Z][a-zA-Z0-9-]*(?:\s+[^>]*)?>`)
|
|
|
|
// IsHTML 判断文本是否为 HTML:要求包含至少一个完整的 HTML 开标签。
|
|
func IsHTML(s string) bool {
|
|
return htmlTagPattern.MatchString(s)
|
|
}
|
|
|
|
// EscapeHTML 将纯文本转义为 HTML 安全的文本。
|
|
func EscapeHTML(s string) string {
|
|
s = strings.ReplaceAll(s, "&", "&")
|
|
s = strings.ReplaceAll(s, "<", "<")
|
|
s = strings.ReplaceAll(s, ">", ">")
|
|
s = strings.ReplaceAll(s, `"`, """)
|
|
return s
|
|
}
|
|
|
|
// fileBaseName 取路径中的文件名,同时兼容 / 与 \ 分隔符。
|
|
// 用于从文件路径推导附件/内嵌图片的默认名称。
|
|
func fileBaseName(p string) string {
|
|
if i := strings.LastIndexAny(p, `/\`); i >= 0 {
|
|
p = p[i+1:]
|
|
}
|
|
if p == "" || p == "." {
|
|
return "attachment"
|
|
}
|
|
return p
|
|
}
|