技术标签: 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())
}
文章浏览阅读252次。原标题:一道经典的Python数据分析笔试题最近无意看到一份关于数据分析的Python笔试题,做起来还是很有意思的,特意自己动手做了一下,和大家分享一下,希望大家也可以跟着练习。题目如下: 首先,模拟数据:importpandas aspdimportnumpy asnpdf = pd.DataFrame({ 'order_no':[ 'order_18213', 'order_16061', ..._将年龄列的缺失值用平均值填充,将性别列中的男,女分别替换为0、1
文章浏览阅读293次。此篇由下边的对话引出。三疯:最近工作中有什么困扰吗?万人迷:有一件。最近同时进行的工作种类有点多,而且杂。经常在苦思冥想一个开发问题或者热火朝天写代码的时候,突然来了另一件事情,新来的事情还得马上处理。这种被随时打断的感觉挺痛苦的,还不得不在内心抗拒的情况下转而处理插入的紧急事情。三疯:嗯……我有个做法你可以借鉴下。深度思考时被打断确实挺痛苦程序员在思考一个问题的时候,会持续深入的想很多东西。我的..._代码 不能断点
文章浏览阅读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]
文章浏览阅读873次。Ninja具体干了什么_google's ninja build system
文章浏览阅读1.2k次。step1:可以在网页里加一个div用来现实loading。1 <div id="loading">2 <!--这里放你的loading时显示的动画或者文字-->3 </div>step2: 给这个loading div的样式 1 /*加载时全屏处于不能操作,只能处在loading动画的界面*/ 2 html,body{..._若依全屏等待loading效果怎么弄
文章浏览阅读306次。Deep Learning with TensorFlow IBM Cognitive Class ML0120EN Module 4 - Restricted Boltzmann Machine简介受限玻尔兹曼机是一种无监督,重构原始数据的一个简单的神经网络。 受限玻尔兹曼机先把输入转为可以表示它们的一系列输出;这些输出可以反..._受限玻尔兹曼机的实现
文章浏览阅读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
文章浏览阅读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
文章浏览阅读985次。建议在电脑上阅读此文,全部源代码在文章最后2017.11.30更新:本案例有了更优雅更简单的实现方案了,可以比较看一下两种实现方式,具体请看文末源码里的checklist2.0.vue文件2017.11.25更新章节:0.3 规划API本文教你如何写一个移动端的 Checklist 组件,使用 vue 单文件形式开发,适合 Vue..._如何写一个checklist
文章浏览阅读464次。我正在运行检查以查看我的FTP服务器上是否存在一个目录:public bool DirectoryExists(string directory){bool directoryExists;var request = (FtpWebRequest)WebRequest.Create(directory);request.Method = WebRequestMethods.Ftp.ListDire..._ftp 判断目录是否存在 c
文章浏览阅读5.2k次,点赞5次,收藏70次。cat bag_file*>bag.tar.gz_深蓝学院 kitti数据
文章浏览阅读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)