Ai
1 Star 0 Fork 0

go-better/go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
conn.go 1.98 KB
一键复制 编辑 原始数据 按行查看 历史
proce 提交于 2022-03-20 18:50 +08:00 . save
package email
import (
"context"
"crypto/tls"
"errors"
"log"
"net"
"net/smtp"
"strings"
"time"
)
type Conn struct {
*smtp.Client
conn *tls.Conn
}
func Dial(ctx context.Context, addr string, auth smtp.Auth) (*Conn, error) {
deadline, hasDeadline := ctx.Deadline()
conn, err := tls.DialWithDialer(&net.Dialer{Deadline: deadline}, "tcp", addr, nil)
if err != nil {
return nil, err
}
if hasDeadline {
if err := conn.SetDeadline(deadline); err != nil {
conn.Close()
return nil, err
}
}
host, _, _ := net.SplitHostPort(addr)
client, err := smtp.NewClient(conn, host)
if err != nil {
conn.Close()
return nil, err
}
if auth != nil {
if ok, _ := client.Extension("AUTH"); ok {
if err = client.Auth(auth); err != nil {
conn.Close()
return nil, err
}
}
}
if hasDeadline {
if err := conn.SetDeadline(time.Time{}); err != nil {
conn.Close()
return nil, err
}
}
return &Conn{Client: client, conn: conn}, nil
}
func (c *Conn) Send(ctx context.Context, from string, to []string, msg []byte) (err error) {
if err = validateLine(from); err != nil {
return
}
for _, recp := range to {
if err = validateLine(recp); err != nil {
return
}
}
if deadline, ok := ctx.Deadline(); ok {
if err = c.conn.SetDeadline(deadline); err != nil {
return
}
defer func() {
if err2 := c.conn.SetDeadline(time.Time{}); err2 != nil {
if err == nil {
err = err2
} else {
log.Println("email: conn.SetDeadline:", err2)
}
}
}()
}
if err = c.Mail(from); err != nil {
return
}
for _, addr := range to {
if err = c.Rcpt(addr); err != nil {
return
}
}
w, err := c.Data()
if err != nil {
return
}
defer w.Close()
// "net/textproto".Writer will convert "\n" to "\r\n"
_, err = w.Write(msg)
return
}
// validateLine checks to see if a line has CR or LF as per RFC 5321
func validateLine(line string) error {
if strings.ContainsAny(line, "\n\r") {
return errors.New("mail: A line must not contain CR or LF")
}
return nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/go-better/go.git
git@gitee.com:go-better/go.git
go-better
go
go
d31700df43a9

搜索帮助