go发送邮件
1.项目中需要把脚本附件发送给同事邮箱,找了好久
1、安装 gomail 包:
1 | go get -v gopkg.in/gomail.v2 |
2、完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | package main import ( "fmt" "gopkg.in/gomail.v2" "mime" ) /* go邮件发送 */ func SendMail(mailTo []string, subject string, body string) error { // 设置邮箱主体 mailConn := map [string]string{ "user" : "xxx@qq.com" , //发送人邮箱(邮箱以自己的为准) "pass" : "xxx" , //发送人邮箱的密码,现在可能会需要邮箱 开启授权密码后在pass填写授权码 "host" : "smtp.qq.com" , //邮箱服务器(此时用的是qq邮箱) } m := gomail.NewMessage( //发送文本时设置编码,防止乱码。 如果txt文本设置了之后还是乱码,那可以将原txt文本在保存时 //就选择utf-8格式保存 gomail.SetEncoding(gomail.Base64), ) m.SetHeader( "From" , m.FormatAddress(mailConn[ "user" ], "LLL" )) // 添加别名 m.SetHeader( "To" , mailTo...) // 发送给用户(可以多个) m.SetHeader( "Subject" , subject) // 设置邮件主题 m.SetBody( "text/html" , body) // 设置邮件正文 //一个文件(加入发送一个 txt 文件):/tmp/foo.txt,我需要将这个文件以邮件附件的方式进行发送,同时指定附件名为:附件.txt //同时解决了文件名乱码问题 name := "附件.txt" m.Attach( "E:/GoCode/src/goMail/gomail.txt" , gomail.Rename(name), //重命名 gomail.SetHeader( map [string][]string{ "Content-Disposition" : []string{ fmt.Sprintf(`attachment; filename= "%s" `, mime.QEncoding.Encode( "UTF-8" , name)), }, }), ) /* 创建SMTP客户端,连接到远程的邮件服务器,需要指定服务器地址、端口号、用户名、密码,如果端口号为465的话, 自动开启SSL,这个时候需要指定TLSConfig */ d := gomail.NewDialer(mailConn[ "host" ], 465, mailConn[ "user" ], mailConn[ "pass" ]) // 设置邮件正文 //d.TLSConfig = &tls.Config{InsecureSkipVerify: true} err := d.DialAndSend(m) return err } func main() { // 邮件接收方 mailTo := []string{ //可以是多个接收人 "xxx@163.com" , "xxx@qq.com" , } subject := "Hello World!" // 邮件主题 body := "测试发送邮件" // 邮件正文 err := SendMail(mailTo, subject, body) if err != nil { fmt.Println( "Send fail! - " , err) return } fmt.Println( "Send successfully!" ) } |
3.遇到的问题go get 下载的包不能用
https://www.jb51.net/article/208264.htm
整理如下
1 2 3 4 5 6 7 | #打开 Go modules,如果你担心影响到其他项目可以把这一项值写为auto go env -w GO111MODULE=on #设置 GOPROXY go env -w GOPROXY=https: //goproxy.cn,direct 找到你项目的根目录执行 go mod init 之后运行你的项目就会将依赖包自动下载下来了, go .mod中会自动生成依赖代码 |
4.如果邮件正文需要是整个文件内容,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | package main import ( "bufio" "crypto/tls" "fmt" "gopkg.in/gomail.v2" "io" "mime" "os" ) /* go邮件发送*/ func SendMail(mailTo []string, subject string, body string) error { // 设置邮箱主体 mailConn := map [string]string{ "user" : "xxxxi@163.com" , //发送人邮箱(邮箱以自己的为准) "pass" : "xxxxx" , //发送人邮箱的密码,现在可能会需要邮箱 开启授权密码后在pass填写授权码 "host" : "smtp.163.com" , //邮箱服务器(此时用的是qq邮箱) } m := gomail.NewMessage( //发送文本时设置编码,防止乱码。 如果txt文本设置了之后还是乱码,那可以将原txt文本在保存时 //就选择utf-8格式保存 gomail.SetEncoding(gomail.Base64), ) m.SetHeader( "From" , m.FormatAddress(mailConn[ "user" ], "ks~123" )) // 添加别名 m.SetHeader( "To" , mailTo...) // 发送给用户(可以多个) m.SetHeader( "Subject" , subject) // 设置邮件主题 //m.SetBody("text/html", body) // 设置邮件正文 m.SetBody( "text/plain" , body) // 设置邮件正文 //一个文件(加入发送一个 txt 文件):/tmp/foo.txt,我需要将这个文件以邮件附件的方式进行发送,同时指定附件名为:附件.txt //同时解决了文件名乱码问题 name := "附件.txt" m.Attach( "/home/scribe/test" , gomail.Rename(name), //重命名 gomail.SetHeader( map [string][]string{ "Content-Disposition" : []string{ fmt.Sprintf(`attachment; filename= "%s" `, mime.QEncoding.Encode( "UTF-8" , name)), }, }), ) /* 创建SMTP客户端,连接到远程的邮件服务器,需要指定服务器地址、端口号、用户名、密码,如果端口号为465的话, 自动开启SSL,这个时候需要指定TLSConfig */ d := gomail.NewDialer(mailConn[ "host" ], 25, mailConn[ "user" ], mailConn[ "pass" ]) // 设置邮件正文 d.TLSConfig = &tls.Config{InsecureSkipVerify: true} err := d.DialAndSend(m) return err } //go去读文件内容 func ReadAll(filePth string) string{ file, err := os.Open(filePth) defer file.Close() var a string if nil == err { buff := bufio.NewReader(file) for { line, err := buff.ReadString( '\n' ) if err == io.EOF { break } //a = a + line + "\n" a = a + line } } return a } func main() { // 邮件接收方 mailTo := []string{ //可以是多个接收人 "xxxx@qq.com" , "xxxx@qq.com" , } subject := "testtest" // 邮件主题 //body := "testtest" // 邮件正文 body := ReadAll( "/home/scribe/test" ) err := SendMail(mailTo, subject, body) if err != nil { fmt.Println( "Send fail! - " , err) return } fmt.Println( "Send successfully!" ) } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)