猿问

附件名称中的 Unicode 字符

我正在尝试编写一个使用 SMTP 将 PDF 发送到我的 Kindle 的程序。


当我使用常规客户端(即 Outlook)向 Kindle 发送附件时,即使文件名不是 ASCII,我也会得到正确的文件名。但是,当我使用代码发送它时,Unicode 字符没有正确显示。我尝试将附件发送到我的个人电子邮件中,没有任何问题,只是 Kindle 无法识别这些字符。


这是我的附件标题:



Content-Disposition: attachment; filename="اÙضح٠ÙاÙÙسÙاÙ.pdf"


Content-Transfer-Encoding: base64


Content-Type: application/pdf; name="اÙضح٠ÙاÙÙسÙاÙ.pdf"

这是我的代码:


package main


import (

    "log"


    "gopkg.in/gomail.v2"

)


func main() {

    m := gomail.NewMessage()


    m.SetHeader("To", "MY-KINDLE-EMAIL@kindle.com")

    m.SetHeader("From", "MY-EMAIL@hotmail.com")

    m.SetBody("text/plain", "")


    path := "C:\\Users\\al111\\Downloads\\Telegram Desktop\\كيف تعمل الماركسية.pdf"

    m.Attach(path)

    d := gomail.NewDialer("smtp.live.com", 587, "MY-EMAIL@hotmail.com", "MY-PASSWORD")


    err := d.DialAndSend(m)

    if err != nil {

        log.Fatal(err)

    }

}


慕田峪9158850
浏览 2247回答 1
1回答

蝴蝶刀刀

RFC 2822样式的电子邮件标头不允许未转义的 Unicode 字符。您需要使用与 ASCII 兼容的编码,例如RFC2047 1或RFC 2231,例如:内容处置:附件;  文件名="=?UTF-8?Q?=D9=83=D9=8A=D9=81=20=D8=AA=D8=B9=D9=85=D9=84=20=D8=A7=D9= 84=D9=85=D8=A7=D8=B1=D9=83=D8=B3=D9=8A=D8=A9=2E=70=64=66.pdf?="内容类型:应用程序/pdf;  名称="=?UTF-8?Q?=D9=83=D9=8A=D9=81=20=D8=AA=D8=B9=D9=85=D9=84=20=D8=A7=D9= 84=D9=85=D8=A7=D8=B1=D9=83=D8=B3=D9=8A=D8=A9=2E=70=64=66.pdf?="内容处置:附件;  文件名*=UTF-8''%D8%A%D8%A%D8%B9%D8%A%D8%B9%D8%A%D8%B9%D8%A%D8%A%D8%B9%D8 %A%D8%A%D8%A%DB%D8%A%D8%A%D8%A%D8%''文件名*=UTF-8''%85%D8%A7%D8%B1%D8% D8%B3%D8%D8%A9%2E%70%64%66.pdf内容类型:应用程序/pdf;  D8%D8%A7%D8%B9%D8%A%D8%B9%D8%A%D8%B9%D8%A%D8%B9%D8%A%D8%B9%D8%D8%A7%D8D8D8a% D8%B9%D8%D8%D8%D8%D8%D8%D8%D8A7%女儿,姓名*=UTF-8'' %85%D8%A7%D8%B1%D8%D8%B3%D8%D8 %A9%2E%70%64%66.pdf1:是的,我知道 RFC 2047在技术上不允许encoded-words 在带引号的字符串中,例如用于参数值。但是许多服务器确实允许这样做。看:如何对 MIME 消息中 Content-Disposition 标头的文件名参数值进行编码?附件文件名的混乱当 Outlook 向您的电子邮件发送电子邮件时,它很可能正是这样做的。您可以通过查看它实际发送的电子邮件的原始数据来验证这一点。在 Go 中,该m.Attach()函数有一个可选settings参数,可用于传递附件的附加参数,例如自定义文件名甚至自定义标题,例如:baseName := mime.QEncoding.Encode("utf-8", filepath.Base(path))m.Attach(path, gomail.Rename(baseName))baseName := url.PathEscape(filepath.Base(path))m.Attach(path, gomail.SetHeader(map[string][]string{        "Content-Disposition": {"attachment; filename*=UTF-8''" + baseName},    }))
随时随地看视频慕课网APP

相关分类

Go
我要回答