在使用Go语言开发时,我们会遇到发送邮件的需求,在Go语言标准包中,也提供了邮件发送客户端smtp的封装。不过,该标准包只提供了基础的邮件发送过程,对于一些复杂的定义还需要自己去封装,封装过程就需要依据邮件协议RFC2822了。还好,github上有人专门为我们封装好了这个包:https://github.com/go-gomail/gomail。这个包封装了发送附件、图片、HTML内容模板、SSL和TLS等的支持,可以满足我们的大部分应用场景。下面,我就对gomail实现发送邮件做一下简单介绍。

1. 需要先安装gomail包

$ go get -v gopkg.in/gomail.v2

2. 导入gomail包

$ import "gopkg.in/gomail.v2"

3. 需要创建一个Message实例,Message提供了整个邮件协议内容的构建,默认实例采用UTF-8字符集和Quoted-printable编码。

对于Quoted-printable编码的定义,维基百科上是这样说的:Quoted-printable是使用可打印的ASCII字符(如字母、数字与“=”)表示各种编码格式下的字符,以便能在7-bit数据通路上传输8-bit数据, 或者更一般地说在非8-bit clean媒体上正确处理数。

m := gomail.NewMessage()

4. 构造邮件内容,包括:发件人信息、收件人、主题、内容,更多内容设定可参考协议:RFC2822

// 发件人信息

m.SetHeader("From", m.FormatAddress("user@example.com", "张三"))

// 收件人

m.SetHeader("To", "user@qq.com")

// 主题

m.SetHeader("Subject", "邮件标题")

// 内容

m.SetBody("text/html", "系统邮件请勿回复")

特殊说明,构造From(发件人信息)时需要使用m.FormatAddress方法,因为发件人指定中文名或特殊字符时,需要进行编码

5. 构造附件信息,同时对附件进行重命名

比如,我有一个临时文件:/tmp/foo.txt,我需要将这个文件以邮件附件的方式进行发送,同时指定附件名为:附件.txt

name := "附件.txt"

m.Attach("/tmp/foo.txt",

gomail.Rename(name),

)

6. 创建SMTP客户端,连接到远程的邮件服务器,需要指定服务器地址、端口号、用户名、密码,如果端口号为465的话,自动开启SSL,这个时候需要指定TLSConfig

这里的用户名和密码指的是能够登录该邮箱的邮箱地址和密码

d := gomail.NewDialer("smtp.example.com", 465, "user@example.com", "password")

d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

7. 执行邮件发送

err := d.DialAndSend(m)

if err != nil {

// 处理错误

}

至此,邮件已经发送成功了,整个邮件的内容为(其中,附件内容为foo.bar):

Mime-Version: 1.0

Date: Sat, 10 Nov 2018 21:40:13 +0800

From: =?UTF-8?q?=E5=BC=A0=E4=B8=89?=

To: user@qq.com

Subject: =?UTF-8?q?=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98?=

Content-Type: multipart/mixed;

boundary=92142f9522a20d2f4feffce957bf68b46ad1a620e68fbecbf35669266e9a

--92142f9522a20d2f4feffce957bf68b46ad1a620e68fbecbf35669266e9a

Content-Transfer-Encoding: quoted-printable

Content-Type: text/html; charset=UTF-8

=E7=B3=BB=E7=BB=9F=E9=82=AE=E4=BB=B6=E8=AF=B7=E5=8B=BF=E5=9B=9E=E5=A4=8D

--92142f9522a20d2f4feffce957bf68b46ad1a620e68fbecbf35669266e9a

Content-Disposition: attachment; filename="附件.txt"

Content-Transfer-Encoding: base64

Content-Type: text/plain; charset=utf-8; name="附件.txt"

Zm9vLmJhcgo=

--92142f9522a20d2f4feffce957bf68b46ad1a620e68fbecbf35669266e9a--

打印邮件内容,可以将Message写入到一个缓冲区中,代码如下:

buf := new(bytes.Buffer)

m.WriteTo(buf)

fmt.Println(buf.String())

解决gomail v2.0.0版本下中文附件名乱码的问题

在不同的邮件服务器中,对于中文附件名的编码存在不同的规范,我们可以尝试一下,将上面的邮件附件发送到QQ邮箱,附件名显示正常,发送到126的邮箱就是乱码(这是我测试的结果)。对此,我们可以通过给附件名进行编码的方式来解决这个问题。

name := "附件.txt"

m.Attach("/tmp/foo.txt",

gomail.Rename(name),

gomail.SetHeader(map[string][]string{

"Content-Disposition": []string{

fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", name)),

},

}),

)

将邮件内容更改为Base64编码

m := gomail.NewMessage(

gomail.SetEncoding(gomail.Base64),

)

// ...

name := "附件.txt"

m.Attach("/tmp/foo.txt",

gomail.Rename(name),

gomail.SetHeader(map[string][]string{

"Content-Disposition": []string{

fmt.Sprintf(`attachment; filename="%s"`, mime.BEncoding.Encode("UTF-8", name)),

},

}),

)

使用Base64编码后的邮件内容为:

Mime-Version: 1.0

Date: Sat, 10 Nov 2018 21:53:22 +0800

From: =?UTF-8?b?5byg5LiJ?=

To: user@qq.com

Subject: =?UTF-8?b?6YKu5Lu25qCH6aKY?=

Content-Type: multipart/mixed;

boundary=42839966777f27ebe3861a73eabbf615036ea57b3222968e21519c64cdd5

--42839966777f27ebe3861a73eabbf615036ea57b3222968e21519c64cdd5

Content-Transfer-Encoding: base64

Content-Type: text/html; charset=UTF-8

57O757uf6YKu5Lu26K+35Yu/5Zue5aSN

--42839966777f27ebe3861a73eabbf615036ea57b3222968e21519c64cdd5

Content-Disposition: attachment; filename="=?UTF-8?b?6ZmE5Lu2LnR4dA==?="

Content-Transfer-Encoding: base64

Content-Type: text/plain; charset=utf-8; name="附件.txt"

Zm9vLmJhcgo=

--42839966777f27ebe3861a73eabbf615036ea57b3222968e21519c64cdd5--

linux smtp 发送邮件乱码,使用gomail发送邮件之解决附件名乱码的问题相关推荐

  1. java邮件附件名称乱码_Java邮件开发(三):解决附件名为乱码及显示友好名称

    遗留的问题有以下两个: 1.附件的名称只能为英文,中文乱码 2.友好名称的显示. 我们使用163等邮箱发送邮件时,我们经常可以看到收件人一栏中会是:张益达 这种方式.在上一版本的代码中并没有使用这样的 ...

  2. blob字段乱码怎么处理_下载的附件名总乱码?你该去读一下 RFC 文档了!

    纸上得来终觉浅,绝知此事要躬行 Web 开发过程中,相信大家都遇到过附件下载的场景,其中,各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已. 网上搜索一下,大部分都是通过Request Head ...

  3. QQ邮箱炸啦,我的附件名怎么乱码?解决javaMail发送QQ邮件,附件名乱码的问题

    解决javaMail发送QQ邮件,附件名乱码的问题 问题背景 具体问题 解决思路 源码Debug 解决方式 问题背景 项目里面使用javaMail发QQ邮件,日志显示我们这边传过去的附件名是正常的,个 ...

  4. 关于php使用sendmail发送邮件时中文附件名乱码问题解决方法

    问题描述:在php使用sendmail发送邮件时中文附件名出现乱码,如图: 原因分析:这是由于编码引起的错误. 解决办法:首先强制进行编码换: substr($file_name,strrpos($f ...

  5. JavaMail 邮件附件名乱码问题

    问题: 用JavaMail 发邮件,带上附件,附件名有时乱码,有时非乱码.查看Java端代码: 最终生成的邮件附件名称为: =UTF-8Q=E6=97=A0=E5=BF=A7Hour=E6=8A=A5 ...

  6. idean中jsp页面乱码_全网最全解决这idea乱码问题

    全网最全解决这idea乱码问题 解决方法: 1.打开tomcat配置页面,Edit Configurations>画圈的修改成-Dfile.encoding=UTF-8. 2.尝试重启tomca ...

  7. linux中mysql不显示中文_linux中解决mysql中文乱码方法

    改默认编码: /etc/init.d/mysql start (stop) 为启动和停止服务器 /etc/mysql/ 主要配置文件所在位置 my.cnf /var/lib/mysql/ 放置的是数据 ...

  8. JavaMail中解决中文附件名乱码的问题

    网上有很多类似的解决方案,很多是使用 if ((fileName != null) && (fileName.toLowerCase().indexOf("gb2312&qu ...

  9. java pdf中文乱码_java生成pdf以及解决中文中文乱码问题

    itext版本:5.4.0 其中extrajars中有支持中文的itext-asian.jar. 像工程中导入itextpdf-5.4.0以及itext-asian.jar即可支持中文. 示例代码如下 ...

最新文章

  1. 游戏+云服务器+自动驾驶样样全,看NVIDIA为中国市场带来了哪些好东西 | GTC China 2018...
  2. windows dlib 安装测试
  3. 幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名
  4. requests模块相关用法
  5. python 有什么一般人不知道的缺点_关于python,你知道它的优缺点吗?
  6. 【Python3之内置函数】
  7. quartz集群报错but has failed to stop it. This is very likely to create a memory leak.
  8. [Android]EditText属性详解
  9. android反编译工具手机,安卓apk反编译工具包
  10. abaqus实例手册_《ABAQUS 6.14超级学习手册》——1.5 ABAQUS帮助文档
  11. hprose php,hprose和swoole区别
  12. 软考高级系统架构设计师系列论文二十四:论信息系统的安全风险
  13. Docker容器中添加字体
  14. 计算机系统的组成中的软件部分
  15. 2、基因树 与物种树的关系及建树
  16. 光猫里显示的设备类型为什么是MSFT 5.0
  17. zblog host php,zblog获取当前页面的URL信息
  18. 俯仰角与横滚角的介绍
  19. ZStack——存储模型:主存储和备份存储
  20. UGUI中随意调整Text中的字体间距

热门文章

  1. Windows 8 Hello World
  2. iphone-common-codes-ccteam源代码 CCUIKit.m
  3. Apache+php+tomcat+mysqlon linxu
  4. exchange客户端不能正常登陆
  5. asp.net 2.0 技巧2
  6. 中兴 20 5g音频测试软件,中兴手机5G测试视频:速率接近2Gbps!
  7. 【学习笔记】17、函数(Function)的定义和调用
  8. 【PM模块】预防性维护(下)
  9. java.lang.NumberFormatException 错误及解决办法
  10. SAP 物料分类账常用表