golang--自动下载邮件的附件

来源:互联网 发布:mac搜狗五笔无法使用 编辑:程序博客网 时间:2024/05/18 15:25

这个是之前做的一个小应用,主要用到的是golang的go-imap这个库。之前看到php和java都有完整的自动下载邮件的程序,现在也分享一个golang的,其中主要麻烦的是判断邮件的状态,是否未读,然后就是获取附件并且下载,具体代码如下:

package mainimport ("io""io/ioutil""log""os""github.com/emersion/go-imap""github.com/emersion/go-imap/client""github.com/emersion/go-message/mail")/*函数名称:mk_dir函数作用:新建目录输入参数:dir_path(目录路径)输出参数:新建目录路径*/func mk_dir(dir_path string) string {var path stringif os.IsPathSeparator('\\') { //前边的判断是否是系统的分隔符path = "\\"} else {path = "/"}//fmt.Println(path)dir, _ := os.Getwd()                            //当前的目录err := os.Mkdir(dir+path+dir_path, os.ModePerm) //在当前目录下生成md目录if err != nil {log.Println(err)}return dir + path + dir_path}/*函数名称:checkFileIsExist函数作用:检查文件是否存在,不存在则新建文件输入参数:filename(文件名)输出参数:是否新建成功*/func checkFileIsExist(filename string) bool {var exist = trueif _, err := os.Stat(filename); os.IsNotExist(err) {exist = false}return exist}/*函数名称:write_to_file函数作用:写内容到文件输入参数:filename(文件名),content(内容)输出参数:无*/func write_to_file(filename string, content string) {var f *os.Filevar err errorif checkFileIsExist(filename) { //如果文件存在f, err = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件log.Println("文件存在")} else {f, err = os.Create(filename) //创建文件log.Println("文件不存在")}check_error(err)_, err = io.WriteString(f, content) //写入文件(字符串)check_error(err)}/*函数名称:check_error函数作用:捕抓错误输入参数:error输出参数:无*/func check_error(e error) {if e != nil {log.Fatal(e)}}func main() {arg_num := len(os.Args)if arg_num != 3 {log.Println("参数有错,请以此输入邮箱名称和密码,如./download.exe 123@qq.com 123123123")return}log.Println("Connecting to server...")// 连接服务器c, err := client.DialTLS("imap.qq.com:993", nil)check_error(err)log.Println("连接服务器")// 结束后退出登录defer c.Logout()// 登录//args[1]是用户名,args[2]是imap密码if err := c.Login(os.Args[1], os.Args[2]); err != nil {log.Fatal(err)}log.Println("登陆邮箱")// 获取邮箱列表mailboxes := make(chan *imap.MailboxInfo, 10)done := make(chan error, 1)go func() {done <- c.List("", "*", mailboxes)}()log.Println("邮箱列表:")for m := range mailboxes {log.Println("* " + m.Name)}if err := <-done; err != nil {log.Fatal(err)}// 选择收件箱mbox, err := c.Select("INBOX", false)if err != nil {log.Fatal(err)}from := uint32(1)to := mbox.Messagesseqset := new(imap.SeqSet)seqset.AddRange(from, to)attrs := []string{"BODY[]", imap.FlagsMsgAttr}messages := make(chan *imap.Message, 10)done = make(chan error, 1)go func() {done <- c.Fetch(seqset, attrs, messages)}()for msg := range messages {//判断是否未读邮件if len(msg.Flags) == 0 {r := msg.GetBody("BODY[]")if r == nil {log.Fatal("Server didn't returned message body")}mr, err := mail.CreateReader(r)if err != nil {log.Fatal(err)}header := mr.Header//获取邮件日期mail_date, errs := header.Date()check_error(errs)for {p, err := mr.NextPart()if err == io.EOF {break} else if err != nil {log.Fatal(err)}//提取邮件的附件switch h := p.Header.(type) {case mail.TextHeader:log.Println("just mail")case mail.AttachmentHeader:filename, _ := h.Filename()log.Println("Got attachment: %v", filename)dir := mk_dir(mail_date.Format("01-02-2006"))filename = dir + "\\" + filenamecontent, _ := ioutil.ReadAll(p.Body)write_to_file(filename, string(content))}}} else {log.Println("已读邮件")}}if err := <-done; err != nil {log.Fatal(err)}}


github地址如下:稍后补上

0 0