linux smtp 发送邮件乱码,使用gomail发送邮件之解决附件名乱码的问题
在使用Go語言開發(fā)時,我們會遇到發(fā)送郵件的需求,在Go語言標準包中,也提供了郵件發(fā)送客戶端smtp的封裝。不過,該標準包只提供了基礎的郵件發(fā)送過程,對于一些復雜的定義還需要自己去封裝,封裝過程就需要依據(jù)郵件協(xié)議RFC2822了。還好,github上有人專門為我們封裝好了這個包:https://github.com/go-gomail/gomail。這個包封裝了發(fā)送附件、圖片、HTML內容模板、SSL和TLS等的支持,可以滿足我們的大部分應用場景。下面,我就對gomail實現(xiàn)發(fā)送郵件做一下簡單介紹。
1. 需要先安裝gomail包
$ go get -v gopkg.in/gomail.v2
2. 導入gomail包
$ import "gopkg.in/gomail.v2"
3. 需要創(chuàng)建一個Message實例,Message提供了整個郵件協(xié)議內容的構建,默認實例采用UTF-8字符集和Quoted-printable編碼。
對于Quoted-printable編碼的定義,維基百科上是這樣說的:Quoted-printable是使用可打印的ASCII字符(如字母、數(shù)字與“=”)表示各種編碼格式下的字符,以便能在7-bit數(shù)據(jù)通路上傳輸8-bit數(shù)據(jù), 或者更一般地說在非8-bit clean媒體上正確處理數(shù)。
m := gomail.NewMessage()
4. 構造郵件內容,包括:發(fā)件人信息、收件人、主題、內容,更多內容設定可參考協(xié)議:RFC2822
// 發(fā)件人信息
m.SetHeader("From", m.FormatAddress("user@example.com", "張三"))
// 收件人
m.SetHeader("To", "user@qq.com")
// 主題
m.SetHeader("Subject", "郵件標題")
// 內容
m.SetBody("text/html", "系統(tǒng)郵件請勿回復")
特殊說明,構造From(發(fā)件人信息)時需要使用m.FormatAddress方法,因為發(fā)件人指定中文名或特殊字符時,需要進行編碼
5. 構造附件信息,同時對附件進行重命名
比如,我有一個臨時文件:/tmp/foo.txt,我需要將這個文件以郵件附件的方式進行發(fā)送,同時指定附件名為:附件.txt
name := "附件.txt"
m.Attach("/tmp/foo.txt",
gomail.Rename(name),
)
6. 創(chuàng)建SMTP客戶端,連接到遠程的郵件服務器,需要指定服務器地址、端口號、用戶名、密碼,如果端口號為465的話,自動開啟SSL,這個時候需要指定TLSConfig
這里的用戶名和密碼指的是能夠登錄該郵箱的郵箱地址和密碼
d := gomail.NewDialer("smtp.example.com", 465, "user@example.com", "password")
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
7. 執(zhí)行郵件發(fā)送
err := d.DialAndSend(m)
if err != nil {
// 處理錯誤
}
至此,郵件已經(jīng)發(fā)送成功了,整個郵件的內容為(其中,附件內容為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寫入到一個緩沖區(qū)中,代碼如下:
buf := new(bytes.Buffer)
m.WriteTo(buf)
fmt.Println(buf.String())
解決gomail v2.0.0版本下中文附件名亂碼的問題
在不同的郵件服務器中,對于中文附件名的編碼存在不同的規(guī)范,我們可以嘗試一下,將上面的郵件附件發(fā)送到QQ郵箱,附件名顯示正常,發(fā)送到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发送邮件之解决附件名乱码的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux普通用户开不了端口,Linux
- 下一篇: linux大硬盘格式化,linux 格式