golang--解决邮件发送标题乱码问题

**一封最简单的邮件格式内容:**

To: 123@qq.com

CS: 1234@qq.com

From: 1234@qq.com

Subject: test

正文

邮件是和http类似的文本协议,由邮件头和邮件内容两部分组成,中间以空行分隔,邮件头每行对应一个字段,和http头类似,比如这里的To,CC,From,Subject,分别代表收件人,抄送人,发件人,标题,如果有多个收件人或抄送人,用逗号分隔,邮件内容才是我们在邮件客户端真正看到的东西

在指定smtp的文档中(https://tools.ietf.org/html/rfc5321)中,定义了smtp客户端和服务器的通讯方式和报文的格式.SMTP协议中标题只支持US-Ascii编码

如果邮件标题直接使用中文字符会导致收到的邮件乱码,为了避免这种情况,应该对中文进行base64编码,而这也是邮件最常用的编码方式,解码成base64,ascii识别无压力后,再按UTF-8进行显示

Golang采用UTF-8和base64编码的格式如下:

//需引入base64库
codeSubject := "=?UTF-8?B?" + base64.StdEncoding.EncodeToString([]byte("中文")) + "?="

 

**邮件内容使用html**

To: xiang@qq.com

CC: xiang@qq.com

From: =?UTF-8?B?5rWL6K+V?=\<fengyun@test.com\>

Subject: =?UTF-8?B?5rWL6K+V?=

Content-type: text/html;charset=utf-8

\<h1\>hello world\</h1\>

如果邮件内容是html代码,则需要在邮件头添加Content-type字段来标记文本类型,同时还需要标记邮件内容的字符编码,以下邮件源码发送的正是html内容

 

其中,“5rWL6K+V”就是中文“测试”进行base编码得到的
在我们的项目中,只要对标题部分进行双重编码,即可解决乱码问题

subject := "=?UTF-8?B?" + base64.StdEncoding.EncodeToString([]byte("标题")) + "?="

 

posted @ 2020-06-06 11:00  黑曼巴后仰  阅读(1347)  评论(0编辑  收藏  举报