代码拉取完成,页面将自动刷新
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。