golang imap 郵件標題解碼


最近開發有關郵件相關的應用時遇到的附件以及標題有時候是編碼格式的,需要進行解碼操作

下面是要進行轉碼的字符串

//=?gb2312?B?udjT2sXtv62197avtcTNqNaq?=
//=?UTF-8?B?44CQ5Y2H57qn5YWs5ZGK44CR5aSp6J6N5L+h572R?= =?UTF-8?B?57uc5a6J5YWo5oqA5pyv5pyJ6ZmQ5YWs5Y+4VA==?= =?UTF-8?B?b3BXQUYoV0FGKeaUu+WHu+ajgOa1i+inhOWImeW6k+WNh+e6p+WFrOWRig==?=
//=?gb18030?B?YWxsLTIuMCAoMjAyMDAxMDmjqS50YXI=?=

package main

import (
	"github.com/emersion/go-imap/client"
	"log"
	"github.com/emersion/go-imap"
	"time"
	"net/mail"
	"mime"
	"io"
	"io/ioutil"
	"bytes"
	"fmt"
	"github.com/axgle/mahonia"
)

const (
	server = "mail.xxx.com.cn:993"
	//username= "xxx.com.cn"
	//password="Txxxx"
	username= "zhxxx.com.cn"
	password="Txxx2"
)
// 任意編碼轉特定編碼
func ConvertToStr(src string, srcCode string, tagCode string) string {
	srcCoder := mahonia.NewDecoder(srcCode)
	srcResult := srcCoder.ConvertString(src)
	tagCoder := mahonia.NewDecoder(tagCode)
	_, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
	result := string(cdata)
	return result
}

func main(){
	var c *client.Client
	var err error

	c,err=client.DialTLS(server,nil)
	if err!=nil{
		log.Println("連接失敗!")
	}
	log.Println("連接成功!")

	err=c.Login(username,password)

	if err!=nil{
		log.Fatal("登陸失敗!")

	}

	defer c.Logout()
	mbox,err:=c.Select("INBOX",false)
	if err!=nil{
		log.Fatal(err)
	}
	log.Println(mbox.Name)
	log.Println("Login success!")
	criteria := imap.NewSearchCriteria()
	//criteria.WithoutFlags=[]string{imap.SeenFlag}
	timeSince:="2020-01-07 00:00:00"
	tpl:= "2006-01-02 15:04:05"
	loc,_:=time.LoadLocation("Local")
	t,_:=time.ParseInLocation(tpl,timeSince,loc)
	log.Println(t)
	criteria.Since=t
	ids,err:=c.Search(criteria)
	if err!=nil{
		log.Fatal("Search:",err)
	}
	if len(ids)>0{
		log.Println("IDs found:", ids)
		seqset:=new(imap.SeqSet)
		seqset.AddNum(ids...)
		sect :=&imap.BodySectionName{}
		messages:=make(chan *imap.Message,10)
		done :=make(chan error,1)
		go func() {
			done<-c.Fetch(seqset,[]imap.FetchItem{sect.FetchItem()},messages)

		}()

		log.Println("Unseen messages:")

		//r,_:=regexp.Compile(`[\w\W]*?考勤[\w\W]*?`)
		dec :=new(mime.WordDecoder)
		dec.CharsetReader= func(charset string, input io.Reader) (io.Reader, error) {
			switch charset {
			case "gb2312":
				content, err := ioutil.ReadAll(input)
				if err != nil {
					return nil, err
				}
				//ret:=bytes.NewReader(content)
				//ret:=transform.NewReader(bytes.NewReader(content), simplifiedchinese.HZGB2312.NewEncoder())

				utf8str:=ConvertToStr(string(content),"gbk","utf-8")
				t:=bytes.NewReader([]byte(utf8str))
				//ret:=utf8.DecodeRune(t)
				//log.Println(ret)
				return t, nil
			case "gb18030":
				content, err := ioutil.ReadAll(input)
				if err != nil {
					return nil, err
				}
				//ret:=bytes.NewReader(content)
				//ret:=transform.NewReader(bytes.NewReader(content), simplifiedchinese.HZGB2312.NewEncoder())

				utf8str:=ConvertToStr(string(content),"gbk","utf-8")
				t:=bytes.NewReader([]byte(utf8str))
				//ret:=utf8.DecodeRune(t)
				//log.Println(ret)
				return t, nil
			default:
				return nil,fmt.Errorf("unhandle charset:%s",charset)

			}
		}
		for msg:=range messages{
			//subject :=msg.Envelope.Subject
			//
			//log.Println("* "+r.FindString(subject))
			//log.Println("* ",msg.Envelope.Date)
			r:=msg.GetBody(sect)
			m,err:=mail.ReadMessage(r)
			if err!=nil{
				log.Println(err)
			}
			header:=m.Header
			log.Println("Date:",header.Get("Date"))
			//log.Println("From:",header.Get("From"))
			//log.Println("To:",header.Get("To"))

			log.Println("Sunject:",header.Get("Subject"))
			ret,err:=dec.Decode(header.Get("Subject"))
			if err!=nil{
				ret,_=dec.DecodeHeader(header.Get("Subject"))
			}
			log.Println("Sunject:",ret)
		}
		if err:=<-done;err!=nil{
			log.Fatal(err)
		}
	}
	log.Println("Done!")
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM