主题编码电子邮件(RFC2047)。解码错误

时间:2014-10-23 12:13:49

标签: email go

我正在Golang中编写应用程序。我需要解码电子邮件主题。

原创主题:

  

Raport zeksportuogłoszeńnieruchomości

编码主题:

=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?=  =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?=^M

解码主题:“Raport zeksportuogłosze▒▒nieruchomości”

我使用github.com/famz/RFC2047解码电子邮件主题。

我的代码很简单:

RFC2047.Decode(msg.Header.Get("Subject"))

为什么解码后主题被破坏?其他主题被正确解码。这是一个糟糕的编码主题吗?

3 个答案:

答案 0 :(得分:6)

该主题编码错误。 它被分成两个MIME编码字(因为编码的行长度超过76个字符),但它被分割在ń字符的中间。

如果将这两个部分合并为一个编码字符串,则会返回原始主题:

s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXFhCBuaWVydWNob21vxZtjaQ==?="
fmt.Println(RFC2047.Decode(s))

// Dom.eu - raport z eksportu ogłoszeń nieruchomości

答案 1 :(得分:4)

如果您使用的是Go 1.5,则可以使用mime package的新功能。

如果您使用的是旧版Go,则可以使用my drop-in replacement

示例:

package main

import (
    "fmt"
    "mime" // When using Go 1.5
    mime "gopkg.in/alexcesaro/quotedprintable.v3" // When using older Go versions
)

func main() {
    s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?=  =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?="
    dec := new(mime.WordDecoder)
    subject, err := dec.DecodeHeader(s)
    if err != nil {
        panic(err)
    }
    fmt.Println(subject)
    // Output:
    // Dom.eu - raport z eksportu ogłoszeń nieruchomości
}

答案 2 :(得分:0)

在空闲时间我写了这个函数。该函数连接字符串的一部分并返回一个字符串。

func parseSubject(s string) string {
   patternType := regexp.MustCompile("(?i)=\\?.*?\\?.*?\\?")
   resType := patternType.FindString(s)

   if resType == "" {
      return s
   } else {
      pattern := regexp.MustCompile("(?i)=\\?.*?\\?.*?\\?|\\s+|\\?=")
      res := pattern.ReplaceAllLiteral([]byte(s), []byte(""))

      return resType + string(res) + "?="
   }
}