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