package utils
import (
"bytes"
"errors"
"fmt"
"net/smtp"
"regexp"
"strings"
)
const (
addr = "mail-out.sys.xxx.com:25"
)
// IsEmailValid 函数用于判断给定的字符串是否为有效的电子邮件地址
// 参数 email 为待验证的电子邮件地址
// 返回值为 bool 类型,如果电子邮件地址有效则返回 true,否则返回 false
func IsEmailValid(email string) bool {
// Email regex pattern
pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
// Compile the regex pattern
regex := regexp.MustCompile(pattern)
// Check if the email matches the pattern
return regex.MatchString(email)
}
// SendMail 使用服务发送邮件
func SendEmail(sender, to, cc, subject, body string, annex []string) error {
toList := strings.Split(to, ";")
if len(cc) > 0 {
toList = append(toList, strings.Split(cc, ";")...)
}
for _, v := range toList {
if !IsEmailValid(v) {
return errors.New(v + " email format error")
}
}
mime := bytes.NewBuffer(nil)
//设置邮件
mime.WriteString(fmt.Sprintf("From: %s\r\nTo: %s\r\nCC: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\n",
sender,
strings.ReplaceAll(to, ";", "\r\n ,"),
strings.ReplaceAll(cc, ";", "\r\n ,"),
subject))
//邮件普通Text正文
mime.WriteString("Content-Type: multipart/mixed; boundary=boundary\r\n\r\n")
for a := range annex {
mime.WriteString("--boundary\r\n")
mime.WriteString(fmt.Sprintf("Content-ID: <image%d>\r\n", a))
mime.WriteString(fmt.Sprintf("Content-Type: image/png;name=\"image%d\"\r\n", a))
mime.WriteString("Content-Transfer-Encoding: base64\r\n")
mime.WriteString(fmt.Sprintf("Content-Disposition: inline; filename=image%d.png\r\n\r\n", a))
mime.WriteString(annex[a] + "\r\n")
}
mime.WriteString("--boundary\r\n")
//邮件普通HTML正文
mime.WriteString("Content-Type: text/html; charset=utf-8\r\n\r\n")
mime.WriteString(body + "\r\n\r\n")
//邮件结束
return smtp.SendMail(addr, nil, sender, toList, mime.Bytes())
}
go语言发送邮件email,并支持附件并直接在正文中展示图片
于 2024-08-11 10:28:08 首次发布