Skip to content

Instantly share code, notes, and snippets.

@iamspark1e
Created October 21, 2022 06:11
Show Gist options
  • Save iamspark1e/46bbb2facc0da2a7d058c3327d896732 to your computer and use it in GitHub Desktop.
Save iamspark1e/46bbb2facc0da2a7d058c3327d896732 to your computer and use it in GitHub Desktop.
import (
"crypto/tls"
"encoding/base64"
"fmt"
"log"
"net"
"net/smtp"
"strings"
)
func SendMail(addr string, a smtp.Auth, from string, to []string, cc []string, bcc []string, subject string, msg []byte, use_tls bool) error {
if use_tls {
conn, err := tls.Dial("tcp", addr, nil)
if err != nil {
log.Println("Dialing Error:", err)
return err
}
//分解主机端口字符串
host, _, _ := net.SplitHostPort(addr)
c, err := smtp.NewClient(conn, host)
if err != nil {
log.Println("SMTP New client Error:", err)
return err
}
defer c.Close()
if a != nil {
if ok, _ := c.Extension("AUTH"); ok {
if err = c.Auth(a); err != nil {
fmt.Println("check auth with err:", err)
return err
}
}
}
if err = c.Mail(from); err != nil {
return err
}
for _, addr := range to {
if err = c.Rcpt(addr); err != nil {
return err
}
}
w, err := c.Data()
if err != nil {
return err
}
header := make(map[string]string)
header["Subject"] = subject
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/plain; charset=\"utf-8\""
header["Content-Transfer-Encoding"] = "base64"
header["From"] = from
header["To"] = strings.Join(to, ";")
header["CC"] = strings.Join(cc, ";")
message := ""
for k, v := range header {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + base64.StdEncoding.EncodeToString(msg)
_, err = w.Write([]byte(message))
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
return c.Quit()
} else {
// host, port, _ := net.SplitHostPort(addr)
err := smtp.SendMail(
addr,
a,
from,
to,
[]byte(msg),
)
return err
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment