package main
import (
"fmt"
"net/smtp"
"strings"
)
type Email struct {
Host string
Server string
User string
Password string
To string
Subject string
Msg string
}
return nil
}
func SendEmail(email *Email) error {
auth := smtp.PlainAuth("", email.User, email.Password, email.Host)
sendTo := strings.Split(email.To, ";")
for _, v := range sendTo {
str := strings.Replace("From:"+email.User+"~To :"+v+"~Subject:"+email.Subject+"~Content-Type: text/plain;charset=UTF-8~", "~", "\r\n", -1) + "\r\n" + email.Msg
fmt.Println("Content:", str)
err := smtp.SendMail(email.Server, auth, email.User, []string{v}, []byte(str))
if err != nil {
return err
}
}
return nil
}
func main() {
email := Email{
Host: "smtp.qq.com",
Server: "smtp.qq.com:25",
User: "*********@qq.com",
Password: "***********",
To: "**********@qq.com",
Subject: "你好 !!!!",
Msg: "你好 !!!!!!!",
}
err := SendEmailqq(&email)
fmt.Println("result:", err)
}
package main
import (
"crypto/tls"
"fmt"
"net"
"net/smtp"
"strings"
)
type Client struct {
user string
addr string
nickName string
isSSL bool
auth smtp.Auth
}
func main() {
client := New("0000000000000@qq.com", "00000000000", "username", "smtp.qq.com", 465, true)
if err := client.SendEmail([]string{"xxxxxx@xxxxx.net"}, "email send test", "this is a test email for sending.\r\nJust Testing"); err != nil {
fmt.Println(err)
}
}
func New(user, password, nickName, host string, port int, isSsl bool) *Client {
ec := &Client{
user: user,
addr: fmt.Sprintf("%s:%d", host, port),
isSSL: isSsl,
auth: smtp.PlainAuth("", user, password, host),
}
if nickName == "" {
ec.nickName = user
} else {
ec.nickName = nickName
}
return ec
}
func (ec *Client) generateEmailMsg(toUser []string, subject, content string) []byte {
return ec.generateEmailMsgByte(toUser, subject, []byte(content))
}
func (ec *Client) generateEmailMsgByte(toUser []string, subject string, body []byte) []byte {
msgStr := fmt.Sprintf("To: %s\r\nFrom: %s<%s>\r\nSubject: %s\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n",
strings.Join(toUser, ","), ec.nickName, ec.user, subject)
return append([]byte(msgStr), body...)
}
func (ec *Client) sendMailTLS(toUser []string, msg []byte) error {
host, _, _ := net.SplitHostPort(ec.addr)
tlsconfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
conn, err := tls.Dial("tcp", ec.addr, tlsconfig)
if err != nil {
return fmt.Errorf("DialConn:%v", err)
}
client, err := smtp.NewClient(conn, host)
if err != nil {
return fmt.Errorf("Client:generateClient:%v", err)
}
defer client.Close()
if ec.auth != nil {
if ok, _ := client.Extension("AUTH"); ok {
if err = client.Auth(ec.auth); err != nil {
return fmt.Errorf("Client:clientAuth:%v", err)
}
}
}
if err = client.Mail(ec.user); err != nil {
return fmt.Errorf("Client:clientMail:%v", err)
}
for _, addr := range toUser {
if err = client.Rcpt(addr); err != nil {
return fmt.Errorf("Client:Rcpt:%v", err)
}
}
w, err := client.Data()
if err != nil {
return fmt.Errorf("Client:%v", err)
}
_, err = w.Write(msg)
if err != nil {
return fmt.Errorf("Client:WriterBody:%v", err)
}
err = w.Close()
if err != nil {
return fmt.Errorf("Client:CloseBody:%v", err)
}
return client.Quit()
}
func (ec *Client) sendMail(toUser []string, msg []byte) error {
return smtp.SendMail(ec.addr, ec.auth, ec.user, toUser, msg)
}
func (ec *Client) SendEmail(toUser []string, subject string, content string) error {
msg := ec.generateEmailMsg(toUser, subject, content)
if ec.isSSL {
return ec.sendMailTLS(toUser, msg)
}
return ec.sendMail(toUser, msg)
}
func (ec *Client) SendEmailByte(toUser []string, subject string, body []byte) error {
msg := ec.generateEmailMsgByte(toUser, subject, body)
if ec.isSSL {
return ec.sendMailTLS(toUser, msg)
}
return ec.sendMail(toUser, msg)
}