日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2025/3/20 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux smtp 发送邮件乱码,使用gomail发送邮件之解决附件名乱码的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在使用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发送邮件之解决附件名乱码的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。