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("标题")) + "?="