Помогите раскодировать строки

я начинающий программист и я пишу на языке 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
}
→ Ссылка