使用 go-imap 很轻松就可以完成一个邮件客户端
最近有收取邮件分析的需求,于是就使用 golang 中的 go-imap 包进行邮件处理,将代码和过程分享出来。
首先在 GO MODULE 申明依赖
1 | module Test |
接着新建一个 mail.go 里面来写如何处理邮件
连接邮件服务器 我这里用的是网易邮箱
1 | c, err := client.DialTLS("imap.163.com:993", nil) |
登录邮件服务器
接着是登录邮件服务器,这里有个地方要注意,基于 RFC 2971 协议 - IMAP4 ID extension 需要
申明自己身份 否则可能会被拒绝登录,收到错误信息,例如网易邮箱会提示 “NO SELECT Unsafe Login”。协议主要约定了客
户端需要定义一个 ID 字段用以表明身份方便统计分析和定位问题,字段
内的字段名不超过 30 个 8 位字节,值不超过 1024 个 8 位字节,
主要字段有以下几个
1 | name Name of the program |
而 go-imap 作者 emersion 也有支持 IMAP4 ID extension 的包 go-imap-id 已经导入了 简单使用就行
1 | idClient := id.NewClient(c) |
选择邮箱文件夹
不多赘述了看代码就行
1 | // 登录 |
处理邮件正文
处理邮件正文,包里已经封装处理好了,包括多字节字符的处理,只需要调用就行了。这里需要用到 emersion/go-message 包 设置 imap.CharsetReader 以支持除了 UTF-8 和 ASCII 以外的字符编码,如果不设置则支持 UTF-8 和 ASCII ,像 gb2312、gb18030 这些是无法处理的。
1 | imap.CharsetReader = charset.Reader |
其中
1 | section := imap.BodySectionName{} |
这里获取的是全部邮件内容,如果只想获取信封头的话可以使用 imap.FetchEnvelope
相关GITHUB地址:go-imap
我的知乎文章地址:知乎