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!")
}

  

 

  

 

posted @   随心朝阳  阅读(1432)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示