我正在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"))
为什么解码后主题被破坏?其他主题被正确解码。这是一个糟糕的编码主题吗?
答案 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) + "?="
}
}