1 Star 0 Fork 1

leminewx/gokit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
message.go 2.95 KB
一键复制 编辑 原始数据 按行查看 历史
leminewx 提交于 2025-07-28 22:34 +08:00 . v0.6.0.0
package smtp
import (
"bytes"
"errors"
"fmt"
"net/textproto"
"strings"
"time"
)
type Message struct {
Subject string // 主题
To []string // 主送
Cc []string // 抄送
Bcc []string // 密送
Body []byte // 内容
recipients []string // 主送+抄送+密送
}
func (own *Message) GeneateText(form string) ([]byte, error) {
if err := own.Validate(); err != nil {
return nil, err
}
var buf bytes.Buffer
// 构建邮件头
headers := make(textproto.MIMEHeader)
headers.Set("From", form)
headers.Set("To", strings.Join(own.To, ", "))
// 添加抄送头
if len(own.Cc) > 0 {
headers.Set("Cc", strings.Join(own.Cc, ", "))
}
headers.Set("Subject", own.Subject)
headers.Set("Content-Type", "multipart/mixed; boundary=\"BOUNDARY\"")
headers.Set("MIME-Version", "1.0")
headers.Set("Date", time.Now().Format(time.RFC1123Z))
// 写入邮件头
for k, v := range headers {
buf.WriteString(fmt.Sprintf("%s: %s\r\n", k, v[0]))
}
buf.WriteString("\r\n")
// 写入邮件正文部分
buf.WriteString("--BOUNDARY\r\n")
buf.WriteString("Content-Type: text/plain; charset=utf-8\r\n\r\n")
buf.Write(own.Body)
buf.WriteString("\r\n\r\n")
// 结束边界
buf.WriteString("\r\n--BOUNDARY--\r\n")
return buf.Bytes(), nil
}
func (own *Message) GeneateHTML(form string) ([]byte, error) {
if err := own.Validate(); err != nil {
return nil, err
}
// 创建MIME边界
boundary := "----=_NextPart_" + fmt.Sprintf("%x", time.Now().UnixNano())
var buf bytes.Buffer
// 构建邮件头
headers := make(textproto.MIMEHeader)
headers.Set("From", form)
headers.Set("To", strings.Join(own.To, ", "))
// 添加抄送头
if len(own.Cc) > 0 {
headers.Set("Cc", strings.Join(own.Cc, ", "))
}
headers.Set("Subject", own.Subject)
headers.Set("MIME-Version", "1.0")
headers.Set("Content-Type", "multipart/alternative; boundary=\""+boundary+"\"")
headers.Set("X-Mailer", "GoMailer")
headers.Set("X-Priority", "1 (Highest)")
// 写入邮件头
for k, v := range headers {
buf.WriteString(fmt.Sprintf("%s: %s\r\n", k, v[0]))
}
buf.WriteString("\r\n")
// 写入邮件正文部分
buf.WriteString("--" + boundary + "\r\n")
buf.WriteString("Content-Type: text/html; charset=UTF-8\r\n")
buf.WriteString("Content-Transfer-Encoding: quoted-printable\r\n")
buf.WriteString("\r\n")
buf.Write(own.Body)
buf.WriteString("\r\n")
// 结束边界
buf.WriteString("--" + boundary + "--\r\n")
return buf.Bytes(), nil
}
var (
errEmptySubject = errors.New("smtp: 'Subject' is empty")
errEmptyTo = errors.New("smtp: 'To' is empty")
)
func (own *Message) Validate() error {
if own.Subject == "" {
return errEmptySubject
}
own.recipients = make([]string, 0)
if len(own.To) == 0 {
return errEmptyTo
}
own.recipients = append(own.recipients, own.To...)
if len(own.Cc) > 0 {
own.recipients = append(own.recipients, own.Cc...)
}
if len(own.Bcc) > 0 {
own.recipients = append(own.recipients, own.Bcc...)
}
return nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/leminewx/gokit.git
git@gitee.com:leminewx/gokit.git
leminewx
gokit
gokit
fe1b72bb8dfe

搜索帮助