123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"crypto/tls"
|
||
|
"fmt"
|
||
|
"net/smtp"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/flipped-aurora/gin-vue-admin/server/plugin/email/global"
|
||
|
|
||
|
"github.com/jordan-wright/email"
|
||
|
)
|
||
|
|
||
|
//@author: [maplepie](https://github.com/maplepie)
|
||
|
//@function: Email
|
||
|
//@description: Email发送方法
|
||
|
//@param: subject string, body string
|
||
|
//@return: error
|
||
|
|
||
|
func Email(To, subject string, body string) error {
|
||
|
to := strings.Split(To, ",")
|
||
|
return send(to, subject, body)
|
||
|
}
|
||
|
|
||
|
//@author: [SliverHorn](https://github.com/SliverHorn)
|
||
|
//@function: ErrorToEmail
|
||
|
//@description: 给email中间件错误发送邮件到指定邮箱
|
||
|
//@param: subject string, body string
|
||
|
//@return: error
|
||
|
|
||
|
func ErrorToEmail(subject string, body string) error {
|
||
|
to := strings.Split(global.GlobalConfig.To, ",")
|
||
|
if to[len(to)-1] == "" { // 判断切片的最后一个元素是否为空,为空则移除
|
||
|
to = to[:len(to)-1]
|
||
|
}
|
||
|
return send(to, subject, body)
|
||
|
}
|
||
|
|
||
|
//@author: [maplepie](https://github.com/maplepie)
|
||
|
//@function: EmailTest
|
||
|
//@description: Email测试方法
|
||
|
//@param: subject string, body string
|
||
|
//@return: error
|
||
|
|
||
|
func EmailTest(subject string, body string) error {
|
||
|
to := []string{global.GlobalConfig.To}
|
||
|
return send(to, subject, body)
|
||
|
}
|
||
|
|
||
|
//@author: [maplepie](https://github.com/maplepie)
|
||
|
//@function: send
|
||
|
//@description: Email发送方法
|
||
|
//@param: subject string, body string
|
||
|
//@return: error
|
||
|
|
||
|
func send(to []string, subject string, body string) error {
|
||
|
from := global.GlobalConfig.From
|
||
|
nickname := global.GlobalConfig.Nickname
|
||
|
secret := global.GlobalConfig.Secret
|
||
|
host := global.GlobalConfig.Host
|
||
|
port := global.GlobalConfig.Port
|
||
|
isSSL := global.GlobalConfig.IsSSL
|
||
|
isLoginAuth := global.GlobalConfig.IsLoginAuth
|
||
|
|
||
|
var auth smtp.Auth
|
||
|
if isLoginAuth {
|
||
|
auth = LoginAuth(from, secret)
|
||
|
} else {
|
||
|
auth = smtp.PlainAuth("", from, secret, host)
|
||
|
}
|
||
|
e := email.NewEmail()
|
||
|
if nickname != "" {
|
||
|
e.From = fmt.Sprintf("%s <%s>", nickname, from)
|
||
|
} else {
|
||
|
e.From = from
|
||
|
}
|
||
|
e.To = to
|
||
|
e.Subject = subject
|
||
|
e.HTML = []byte(body)
|
||
|
var err error
|
||
|
hostAddr := fmt.Sprintf("%s:%d", host, port)
|
||
|
if isSSL {
|
||
|
err = e.SendWithTLS(hostAddr, auth, &tls.Config{ServerName: host})
|
||
|
} else {
|
||
|
err = e.Send(hostAddr, auth)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// LoginAuth 用于IBM、微软邮箱服务器的LOGIN认证方式
|
||
|
type loginAuth struct {
|
||
|
username, password string
|
||
|
}
|
||
|
|
||
|
func LoginAuth(username, password string) smtp.Auth {
|
||
|
return &loginAuth{username, password}
|
||
|
}
|
||
|
|
||
|
func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
|
||
|
return "LOGIN", []byte{}, nil
|
||
|
}
|
||
|
|
||
|
func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
|
||
|
if more {
|
||
|
switch string(fromServer) {
|
||
|
case "Username:":
|
||
|
return []byte(a.username), nil
|
||
|
case "Password:":
|
||
|
return []byte(a.password), nil
|
||
|
default:
|
||
|
// 邮箱服务器可能发送的其他提示信息
|
||
|
prompt := strings.ToLower(string(fromServer))
|
||
|
if strings.Contains(prompt, "username") || strings.Contains(prompt, "user") {
|
||
|
return []byte(a.username), nil
|
||
|
}
|
||
|
if strings.Contains(prompt, "password") || strings.Contains(prompt, "pass") {
|
||
|
return []byte(a.password), nil
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|