附件名称中的Unicode字符

阿里·阿尔哈吉(Ali Alhajji):

我正在尝试编写一个使用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", "[email protected]")
    m.SetHeader("From", "[email protected]")
    m.SetBody("text/plain", "")

    path := "C:\\Users\\al111\\Downloads\\Telegram Desktop\\كيف تعمل الماركسية.pdf"
    m.Attach(path)
    d := gomail.NewDialer("smtp.live.com", 587, "[email protected]", "MY-PASSWORD")

    err := d.DialAndSend(m)
    if err != nil {
        log.Fatal(err)
    }
}
雷米·勒博(Remy Lebeau):

RFC 2822样式的电子邮件标头不允许使用非转义的 Unicode字符。您需要使用ASCII兼容的编码,例如RFC2047 1RFC 2231,例如:

内容处置:附件;
  filename =“ =?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?=“ 

Content-Type:application / 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''%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''%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

1:是的,我知道RFC 2047在技术上不允许encoded-word在带引号的字符串中使用s,例如用于参数值。但是许多服务器确实允许这样做。

看到:

如何在MIME消息中编码Content-Disposition标头的文件名参数值?

混乱是附件文件名

当Outlook向您发送电子邮件时,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},
    }))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章