golang net/smtp发送邮件附件中文名字乱码解决_go net/smtp 带 附件-程序员宅基地

技术标签: golang  后端  IMAP服务  email  开发语言  

问题描述:在使用net/smtp包发送邮件的时候,本地先生成文件,然后作为附件传送到客户端,客户端接收到的文件中,中文名字就变成了乱码。
原理:golang附件的中文名不支持utf-8格式,需要将UTF-8转成GBK格式。
直接上代码:

首先定义一个函数,将字符串转变成byte类型

func string2BytesSlicePlus2(str string) []byte {
    
	strSliceHeader := *(*reflect.StringHeader)(unsafe.Pointer(&str))
	byteSlice := *(*[]byte)(unsafe.Pointer(&strSliceHeader))
	return byteSlice
}

然后将byte类型转变成GBK编码的数据类型

func Utf8ToGbk(s []byte)([]byte,error){
    
	reader := transform.NewReader(bytes.NewReader(s),simplifiedchinese.GBK.NewEncoder())
	all,err := ioutil.ReadAll(reader)
	Check(err)
	return all,nil
}

邮件业务代码如下:

func send_file(filename string,rece_list []string) error{
    
	sendTo := rece_list
	mime := bytes.NewBuffer(nil)
	attaFile := fmt.Sprintf("%s",filename)
	attaFileName3 := fmt.Sprintf("%s",filename)
	
	//对文件名称做二次处理
	str2 := string2BytesSlicePlus2(attaFileName3)
	attaFileName2,_ := Utf8ToGbk(str2)
	attaFileName := string(attaFileName2)
	
	
	mime.Write([]byte("Content-Type: application/octet-stream\r\n"))
	mime.Write([]byte("Content-Transfer-Encoding: base64\r\n"))
	mime.Write([]byte("Content-Disposition: attachment; filename=\"" + attaFileName + "\"\r\n\r\n"))
	//读取并编码文件内容
	attaData, err := ioutil.ReadFile(attaFile)
	if err != nil {
    
		return err
	}
	b := make([]byte, base64.StdEncoding.EncodedLen(len(attaData)))
	base64.StdEncoding.Encode(b, attaData)
	mime.Write(b)
	smtpHost, _, err := net.SplitHostPort(emlSMTP)
	if err != nil {
    
		return err
	}
	auth := smtp.PlainAuth("", emlUser, emlPwd, smtpHost)
	fmt.Println("successful.")
	return smtp.SendMail(emlSMTP, auth, emlUser, sendTo, mime.Bytes())
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44784088/article/details/127574319

智能推荐

python数据分析面试题目_一道经典的Python数据分析笔试题-程序员宅基地

文章浏览阅读252次。原标题:一道经典的Python数据分析笔试题最近无意看到一份关于数据分析的Python笔试题,做起来还是很有意思的,特意自己动手做了一下,和大家分享一下,希望大家也可以跟着练习。题目如下: 首先,模拟数据:importpandas aspdimportnumpy asnpdf = pd.DataFrame({ 'order_no':[ 'order_18213', 'order_16061', ..._将年龄列的缺失值用平均值填充,将性别列中的男,女分别替换为0、1

为什么自己新写的代码不能打断点_如何快速恢复被打断的思考-程序员宅基地

文章浏览阅读293次。此篇由下边的对话引出。三疯:最近工作中有什么困扰吗?万人迷:有一件。最近同时进行的工作种类有点多,而且杂。经常在苦思冥想一个开发问题或者热火朝天写代码的时候,突然来了另一件事情,新来的事情还得马上处理。这种被随时打断的感觉挺痛苦的,还不得不在内心抗拒的情况下转而处理插入的紧急事情。三疯:嗯……我有个做法你可以借鉴下。深度思考时被打断确实挺痛苦程序员在思考一个问题的时候,会持续深入的想很多东西。我的..._代码 不能断点

Nacos配置中心,拉取配置报NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848,error超时_[nacos sockettimeoutexception httpget]-程序员宅基地

文章浏览阅读5k次。Nacos配置中心,项目拉取配置报错错误信息:NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848, err : connect timed out原因:bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等;application.yml(application.prop_[nacos sockettimeoutexception httpget]

Ninja简介-Android10.0编译系统(九)_google's ninja build system-程序员宅基地

文章浏览阅读873次。Ninja具体干了什么_google's ninja build system

全屏加载loading显示的解决方法-程序员宅基地

文章浏览阅读1.2k次。step1:可以在网页里加一个div用来现实loading。1 <div id="loading">2 <!--这里放你的loading时显示的动画或者文字-->3 </div>step2: 给这个loading div的样式 1 /*加载时全屏处于不能操作,只能处在loading动画的界面*/ 2 html,body{..._若依全屏等待loading效果怎么弄

受限玻尔兹曼机(RBM)与其在Tensorflow的实现-程序员宅基地

文章浏览阅读306次。Deep Learning with TensorFlow IBM Cognitive Class ML0120EN Module 4 - Restricted Boltzmann Machine简介受限玻尔兹曼机是一种无监督,重构原始数据的一个简单的神经网络。 受限玻尔兹曼机先把输入转为可以表示它们的一系列输出;这些输出可以反..._受限玻尔兹曼机的实现

随便推点

neo4j 数组属性(属性值有多个)_neo4j 数组properties-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏8次。1、多个属性值的设置语句match (m:公司{名称:["test3","test2"]}) return m2、多个属性的查询以及merge的使用OPTIONAL MATCH (n:公司) where "test3" in n.名称 WITH nwhere n is null merge (m:公司{名称:["test3","test2"]})return m(1)判断属性是否存在:直接用 "属性值 in 节点.属性名"的形式(2)merge和where不可以同时使用,._neo4j 数组properties

lxml.etree._ElementUnicodeResult 转为字符-程序员宅基地

文章浏览阅读3.6k次。lxml.etree._ElementUnicodeResult 转为字符在爬虫过程中,使用的是lxml的xpath查找对应的字段。address=each.xpath('.//address/text()')[0].strip()结果用address与一般的字符进行拼接时,总是出现UnicodeDecodeError: 'ascii' codec can't decode by..._lxml.etree._elementunicoderesult

Vue.js新手教学|如何写一个Checklist组件-程序员宅基地

文章浏览阅读985次。建议在电脑上阅读此文,全部源代码在文章最后2017.11.30更新:本案例有了更优雅更简单的实现方案了,可以比较看一下两种实现方式,具体请看文末源码里的checklist2.0.vue文件2017.11.25更新章节:0.3 规划API本文教你如何写一个移动端的 Checklist 组件,使用 vue 单文件形式开发,适合 Vue..._如何写一个checklist

c语言查看ftp目录中文件是否存在,c# – 检查FTP服务器上是否存在目录-程序员宅基地

文章浏览阅读464次。我正在运行检查以查看我的FTP服务器上是否存在一个目录:public bool DirectoryExists(string directory){bool directoryExists;var request = (FtpWebRequest)WebRequest.Create(directory);request.Method = WebRequestMethods.Ftp.ListDire..._ftp 判断目录是否存在 c

深蓝学院 《多传感器融合定位》 第1章作业_深蓝学院 kitti数据-程序员宅基地

文章浏览阅读5.2k次,点赞5次,收藏70次。cat bag_file*>bag.tar.gz_深蓝学院 kitti数据

Python中的二维数组实例(list与numpy.array)_a=array(2,5,8,3)-程序员宅基地

文章浏览阅读1.9k次。Python中的二维数组实例(list与numpy.array)关于python中的二维数组,主要有list和numpy.array两种。好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的。我们主要讨论list和numpy.array的区别:{ a = [ [1, 2, 3], [4, 5, 6] ] } 表示的是一个..._a=array(2,5,8,3)

推荐文章

热门文章

相关标签