go smtp示例

书接上文邮件实现详解,这里我们及我们简单复习一下smtp的指令如下:

telnet smtp.163.com 25
[outpout]
ehlo dz45693
[outpout]
auth login
[outpout]
输入用户名base64
[outpout]
输入密码base64
mail from:<[email protected]>
[outpout]
rcpt to:<[email protected]>
[outpout]
data
[outpout]
from:<[email protected]>
to:<[email protected]>
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)

	//解码一下,这样后面的 EHLO 才能有正确的第二个参数
	cmds
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang提供了smtp包,可以用于构建SMTP邮件解析服务。SMTP(简单邮件传输协议)是用于电子邮件传输的标准协议。使用SMTP包,我们可以编写一个程序,用于接收和解析传入的电子邮件。 首先,我们需要导入smtp包,并创建一个监听SMTP服务器的实例。使用Listen函数,我们可以指定监听的端口和地址。然后,我们可以调用Accept方法,等待客户端连接。 一旦接收到连接,我们可以使用来自smtp包的Parse方法解析传入的邮件。Parse方法接收一个io.Reader类型的参数,我们可以使用它来从连接中读取邮件内容。解析后的邮件将被返回为Mail类型的结构体,其中包含发件人、收件人、主题和正文等信息。 我们可以根据需要对解析出的邮件进行处理。例如,可以提取发件人、收件人和主题等信息,以进行进一步的逻辑操作。我们还可以从Mail类型的结构体中获取正文和附件等内容。 在处理完邮件后,我们可以通过调用Close方法来关闭与客户端的连接。 在实际使用中,我们可以将这个SMTP邮件解析服务与其他功能结合起来,例如自动回复、自动转发或将邮件保存到数据库中等。通过利用Golang的并发特性,我们可以实现同时处理多个邮件的能力,从而提高邮件处理的效率。 总之,利用Golang的smtp包,我们可以快速搭建一个SMTP邮件解析服务。无论是构建自己的邮件系统,还是对接第三方服务,该解析服务都可以帮助我们方便地处理和管理传入的电子邮件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值