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

摘要:
=内容类型:text/html;Charset=utf-8helloworld如果消息内容是html代码,则需要在消息头中添加content类型字段来标记文本类型,还需要标记消息内容的字符代码。以下消息源代码发送html内容,其中“5rWL6K+V”是中文“测试”的基本代码。在我们的项目中,我们只需要对标题部分进行双重编码,您可以解决乱码问题主题:=“=?

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

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

免责声明:文章转载自《golang--解决邮件发送标题乱码问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇classListdva-loading下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用golang开发mqtt服务压力测试工具 清明

package main import ( "flag" "fmt" "sync" "time" //导入mqtt包 MQTT "github.com/eclipse/paho.mqtt.golang" ) var f MQTT.MessageHandler = func(client MQTT.Clie...

golang中使用Redis

一.golang中安装Redis github地址:https://github.com/garyburd/redigo 文档地址:http://godoc.org/github.com/garyburd/redigo/redis 安装: go get github.com/garyburd/redigo/redis 二.简单连接Redis conn pa...

dovecot--查询未读邮件个数

最近负责的邮箱系统项目中有一个这样的需求:提供一个接口给业务层,可以通过邮箱查询到该用户的未读邮件个数。 之前的方案是通过查看用户目录下.INBOX/new目录中的文件个数,但是这个方法不准确,当有用户连接到邮箱服务器时,服务器会将新邮件推送给客户端,并将该邮件从new目录copy到cur目录下。 但是此时用户尚未读取邮件,因此该邮件仍然属于未读邮件。 邮...

Golang 里的 AES、DES、3DES 加解密,支持 ECB、CBC 等多种模式组合

Openssl encryption:OpenSSL库的功能包装,用于对称和非对称加密和解密。 AES-ECB AES-CBC DES-ECB DES-CBC 3DES-ECB 3DES-CBC 安装 go get -u github.com/thinkoner/openssl 用法 AES 密钥的长度可以是16/24/32个字符(128/192/2...

使用golang理解mysql的两阶段提交

使用golang理解mysql的两阶段提交 文章源于一个问题:如果我们现在有两个mysql实例,在我们要尽量简单地完成分布式事务,怎么处理? 场景重现 比如我们现在有两个数据库,mysql3306和mysql3307。这里我们使用docker来创建这两个实例: # mysql3306创建命令 docker run -d -p 3306:3306 -v /U...

Golang的排序和查找

Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程。排序的分类如下 1>.内部排序 指将需要处理的所有数据都家在到内存存储器中进行排序,其中包括交换式排序法,选择式排序法和插入式排序法。 2>.外部排序法 数据量过大,无法全部加载到内存中,...