最近開發有關郵件相關的應用時遇到的附件以及標題有時候是編碼格式的,需要進行解碼操作
下面是要進行轉碼的字符串
//=?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!")
}