Created
October 21, 2022 06:11
-
-
Save iamspark1e/46bbb2facc0da2a7d058c3327d896732 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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