go發送郵件


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

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM