GO语言net实现SMTP

直接上代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值