Помогите раскодировать строки
я начинающий программист и я пишу на языке golang. Сейчас у меня не большой проект где нужно реализовать сервис который слушает почту и принимает письма из ящика.
Для реализации всего этого я использую библиотеки:
- github.com/emersion/go-imap/client
- github.com/emersion/go-imap
При получении письма я вывожу на консоль его header(для проверки) но у меня выводиться текст в непонятной мне кодировке и это только с русскими символами.
- To: =?koi8-r?B?7MHa1dTLyc4g5MHOycwg88XSx8XF18ne?= [email protected] -- Почту я изменил
- Subject: =?koi8-r?B?UkU6IMvP0tDP0sHUydfOwdEg0M/e1ME=?=
Нуждаюсь в помощи расшифровки этих символов, использовал уже кучу библиотек, но они не помогают
Мой код:
func GetUnseenMsg(client *c.Client) error {
SearchCriteria := imap.NewSearchCriteria()
SearchCriteria.WithoutFlags = []string{imap.SeenFlag}
ids, err := client.Search(SearchCriteria)
if err != nil {
log.Println("Msg: Error search msg:", err)
return err
}
log.Println("IDs found msg:", ids)
if len(ids) == 0 {
log.Println("Msg: Server not found msg")
return nil
}
SeqSet := new(imap.SeqSet)
SeqSet.AddNum(ids...)
Section := &imap.BodySectionName{}
Items := []imap.FetchItem{Section.FetchItem()}
Message := make(chan *imap.Message, 10)
done := make(chan error, 1)
go func() {
done <- client.Fetch(SeqSet, Items, Message)
}()
for msg := range Message {
r := msg.GetBody(Section)
if r == nil {
log.Println("Msg: Server dont return body meesage")
return nil
}
m, err := mail.ReadMessage(r)
if err != nil {
log.Println("Msg: Error read msg:", err)
}
header := m.Header
log.Println("Date:", header.Get("Date"))
log.Println("From:", header.Get("From"))
log.Println("To:", header.Get("To"))
log.Println("Subject:", header.Get("Subject"))
}
if err := <-done; err != nil {
log.Println("Msg: Error FETCH:", err)
return err
}
return nil
}```
Ответы (2 шт):
Автор решения: Антон
→ Ссылка
Вот небольшой пример
package main
import (
"encoding/base64"
"fmt"
"golang.org/x/text/encoding/charmap"
)
func main() {
data := "7MHa1dTLyc4g5MHOycwg88XSx8XF18ne?="
encData, _ := base64.StdEncoding.DecodeString(data)
decoder := charmap.KOI8R.NewDecoder()
reader, _ := decoder.Bytes(encData)
fmt.Println(string(reader))
}
Output: Лазуткин Данил Сергеевич
Автор решения: Данил
→ Ссылка
Нашел библиотеку которая делать то что мне нужно: github.com/jhillyerd/enmime
Она раскодировала весь head для моего сообщения
Вот код для примера
func (m *Message) ParseHead() error {
headbyte := fmt.Sprintf("To: %s\nFrom: %s\nDate: %s\nSubject: %s", m.Header.Get("To"), m.Header.Get("From"), m.Header.Get("Date"), m.Header.Get("Subject"))
//Decode Header
s, err := enmime.DecodeHeaders([]byte(headbyte), []string{"To", "From", "Date", "Subject"}...)
if err != nil {
log.Println("ParseHeader: error decoding head:", err)
return err
}
//Parse datetime
t, err := time.Parse(time.RFC1123Z, s["Date"][0])
if err != nil {
log.Println("ParseHeader: error parse date in msg:", err)
return err
}
//Save Header
m.From = s["From"][0]
m.Time = t.Format("02-01-2006 15:04:05")
m.Subject = s["Subject"][0]
return nil
}