1.項目中需要把腳本附件發送給同事郵箱,找了好久
1、安裝 gomail 包:
go get -v gopkg.in/gomail.v2
2、完整代碼:
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
整理如下
#打開 Go modules,如果你擔心影響到其他項目可以把這一項值寫為auto go env -w GO111MODULE=on #設置 GOPROXY go env -w GOPROXY=https://goproxy.cn,direct 找到你項目的根目錄執行 go mod init 之后運行你的項目就會將依賴包自動下載下來了,go.mod中會自動生成依賴代碼
4.如果郵件正文需要是整個文件內容,代碼如下
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!")
}
