直接上代码:
package main
import (
"encoding/base64"
"fmt"
"net"
"time"
)
type Sender struct {
UserName string
Password string
From string
To string
Subject string
Text string
Host string
}
func NewSender(host, userName, password string, to string, subject, text string) (r_sender Sender) {
r_sender.UserName = userName
r_sender.Password = password
r_sender.From = userName
r_sender.To = to
r_sender.Subject = subject
r_sender.Text = text
r_sender.Host = host
return
}
func (this *Sender) SendMail() (e error) {
var (
deadline time.Duration = 5 * time.Second
encoding *base64.Encoding
buf []byte = make([]byte, 512)
r int
)
encoding = base64.StdEncoding
conn, e := net.Dial("tcp", this.Host)
if e != nil {
return
}
defer conn.Close()
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r-1]))
conn.Write([]byte("EHLO Juxuny\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r]))
conn.Write([]byte("AUTH LOGIN\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[0:r]))
fmt.Println(encoding.EncodeToString([]byte(this.UserName)))
conn.Write([]byte(encoding.EncodeToString([]byte(this.UserName)) + "\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r]))
fmt.Println(encoding.EncodeToString([]byte(this.Password)))
conn.Write([]byte(encoding.EncodeToString([]byte(this.Password)) + "\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r]))
conn.Write([]byte("MAIL FROM: <" + this.From + ">" + "\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r]))
conn.Write([]byte("RCPT TO: <" + this.To + ">\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
return
}
fmt.Println(string(buf[:r]))
conn.Write([]byte("DATA\r\n"))
conn.Write([]byte("From: <" + this.From + ">\r\n"))
conn.Write([]byte("To: <" + this.To + ">\r\n"))
conn.Write([]byte("Subject: " + this.Subject + "\r\n"))
conn.Write([]byte("\r\n"))
conn.Write([]byte(this.Text))
conn.Write([]byte("\r\n.\r\n"))
time.Sleep(5e9)
conn.Write([]byte("QUIT\r\n"))
conn.SetDeadline(time.Now().Add(deadline))
r, e = conn.Read(buf)
if e != nil {
fmt.Println(e)
return
}
fmt.Println(string(buf[:r]))
return
}
func main() {
s := NewSender("smtp.qq.com:25",
"a@qq.com",
"pwd",
"abc@qq.com",
"主题",
"内容")
e := s.SendMail()
if e != nil {
fmt.Println(e)
}
}
声明:Nansheng.Su 发表于 2019-04-28 16:55:33 ,共计9字。
转载请署名:GO语言net实现SMTP | www.sunansheng.com