书接上文邮件实现详解,这里我们及我们简单复习一下smtp的指令如下:
telnet smtp.163.com 25
[outpout]
ehlo dz45693
[outpout]
auth login
[outpout]
输入用户名base64
[outpout]
输入密码base64
mail from:<dz45693@163.com>
[outpout]
rcpt to:<dz45693@sina.com>
[outpout]
data
[outpout]
from:<dz45693@163.com>
to:<dz45693@sina.com>
subject:hello world
This is the first email sent by hand using the SMTP protocol
.
quit
好,那我们下现在用go实现代码让如下:这里只是一个demo,主要熟悉smtp命令
package main
import (
"bufio"
"encoding/base64"
"fmt"
"net"
"strconv"
"strings"
)
func main() {
testSmtp()
}
var gConn net.Conn
var gRead *bufio.Reader
var gWrite *bufio.Writer
//可以放到这样的类里
type TcpClient struct {
Conn net.Conn
Read *bufio.Reader
Write *bufio.Writer
} //
func Connect(host string, port int) (net.Conn, *bufio.Reader, *bufio.Writer) {
addr := host + ":" + strconv.Itoa(port)
conn, err := net.Dial("tcp", addr)
if err != nil {
return nil, nil, nil
}
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
return conn, reader, writer
} //
//收取一行,可再优化
func RecvLine() string {
line, err := gRead.ReadString('\n') //如何设定超时?
if err != nil {
fmt.Print(err)
return ""
}
line = strings.Split(line, "\r")[0] //还要再去掉 "\r",其实不去掉也可以
return line
}
func SendLine(line string) {
gWrite.WriteString(line + "\r\n")
gWrite.Flush()
}
//解码一行命令,这里比较简单就是按空格进行分隔就行了
func DecodeCmd(line string, sp string) []string {
tmp := strings.Split(line, sp)
var cmds = []string{"", "", "", "", ""} //先定义多几个,以面后面使用时产生异常
for i := 0; i < len(tmp); i++ {
if i >= len(cmds) {
break
}
cmds[i] = tmp[i]
}
return cmds
}
//读取多行结果
func RecvMCmd() string {
i := 0
rs := ""
mLine := ""
for i = 0; i < 50; i++ {
rs = RecvLine() //只收取一行
mLine = mLine + rs + "\r\n"
if len(rs) < 4 {
break
} //长度要足够
c4 := rs[4-1] //第4个字符
if ' ' == c4 {
break
} //第4个字符是空格就表示读取完了//也可以判断 "250[空格]"
}
return mLine
}
//简单的测试一下 smtp
func testSmtp() {
//连接
gConn, gRead, gWrite = Connect("smtp.163.com", 25)
defer gConn.Close()
//收取一行
line := RecvLine()
fmt.Println("recv:" + line)
//解码一下,这样后面