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



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

原始主题:

Raport z eksportu ogłoszeńnieruchomości

编码主题:

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

解码主题:"Raportz eksportu ogłosze▒ ▒nieruchomości"

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

我的代码很简单:

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

为什么,解码后的主题被打破了?其他主题被正确解码。这是一个编码错误的主题吗?

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

如果您将这两个部分连接到一个单独的编码字符串中,则可以返回原始主题:

s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXFhCBuaWVydWNob21vxZtjaQ==?="
fmt.Println(RFC2047.Decode(s))
// Dom.eu - raport z eksportu ogłoszeń nieruchomości

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

如果你使用的是旧版本的Go,你可以使用我的替代品。

示例:

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
}

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

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) + "?="
   }
}

相关内容

最新更新