使用gomail發(fā)送郵件之解決附件名亂碼的問題

在使用Go語言開發(fā)時(shí)鹿响,我們會(huì)遇到發(fā)送郵件的需求,在Go語言標(biāo)準(zhǔn)包中傻唾,也提供了郵件發(fā)送客戶端smtp的封裝投慈。不過,該標(biāo)準(zhǔn)包只提供了基礎(chǔ)的郵件發(fā)送過程冠骄,對(duì)于一些復(fù)雜的定義還需要自己去封裝伪煤,封裝過程就需要依據(jù)郵件協(xié)議RFC2822了。還好凛辣,github上有人專門為我們封裝好了這個(gè)包:https://github.com/go-gomail/gomail抱既。這個(gè)包封裝了發(fā)送附件、圖片扁誓、HTML內(nèi)容模板防泵、SSL和TLS等的支持,可以滿足我們的大部分應(yīng)用場景蝗敢。下面捷泞,我就對(duì)gomail實(shí)現(xiàn)發(fā)送郵件做一下簡單介紹。

1. 需要先安裝gomail

$ go get -v gopkg.in/gomail.v2

2. 導(dǎo)入gomail

$ import "gopkg.in/gomail.v2"

3. 需要?jiǎng)?chuàng)建一個(gè)Message實(shí)例寿谴,Message提供了整個(gè)郵件協(xié)議內(nèi)容的構(gòu)建锁右,默認(rèn)實(shí)例采用UTF-8字符集和Quoted-printable編碼。

對(duì)于Quoted-printable編碼的定義,維基百科上是這樣說的:Quoted-printable是使用可打印的ASCII字符(如字母骡湖、數(shù)字與“=”)表示各種編碼格式下的字符贱纠,以便能在7-bit數(shù)據(jù)通路上傳輸8-bit數(shù)據(jù), 或者更一般地說在非8-bit clean媒體上正確處理數(shù)峻厚。

m := gomail.NewMessage()

4. 構(gòu)造郵件內(nèi)容响蕴,包括:發(fā)件人信息、收件人惠桃、主題浦夷、內(nèi)容,更多內(nèi)容設(shè)定可參考協(xié)議:RFC2822

// 發(fā)件人信息
m.SetHeader("From", m.FormatAddress("user@example.com", "張三"))
// 收件人
m.SetHeader("To", "user@qq.com")
// 主題
m.SetHeader("Subject", "郵件標(biāo)題")
// 內(nèi)容
m.SetBody("text/html", "系統(tǒng)郵件請(qǐng)勿回復(fù)")

特殊說明辜王,構(gòu)造From(發(fā)件人信息)時(shí)需要使用m.FormatAddress方法劈狐,因?yàn)榘l(fā)件人指定中文名或特殊字符時(shí),需要進(jìn)行編碼

5. 構(gòu)造附件信息呐馆,同時(shí)對(duì)附件進(jìn)行重命名

比如肥缔,我有一個(gè)臨時(shí)文件:/tmp/foo.txt,我需要將這個(gè)文件以郵件附件的方式進(jìn)行發(fā)送汹来,同時(shí)指定附件名為:附件.txt

name := "附件.txt"
m.Attach("/tmp/foo.txt",
    gomail.Rename(name),
)

6. 創(chuàng)建SMTP客戶端续膳,連接到遠(yuǎn)程的郵件服務(wù)器,需要指定服務(wù)器地址收班、端口號(hào)坟岔、用戶名源梭、密碼来庭,如果端口號(hào)為465的話,自動(dòng)開啟SSL燃箭,這個(gè)時(shí)候需要指定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 {
    // 處理錯(cuò)誤
}

至此邻耕,郵件已經(jīng)發(fā)送成功了鸥咖,整個(gè)郵件的內(nèi)容為(其中,附件內(nèi)容為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?= <user@example.com>
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--

打印郵件內(nèi)容兄世,可以將Message寫入到一個(gè)緩沖區(qū)中啼辣,代碼如下:

buf := new(bytes.Buffer)
m.WriteTo(buf)
fmt.Println(buf.String())

解決gomail v2.0.0版本下中文附件名亂碼的問題

在不同的郵件服務(wù)器中,對(duì)于中文附件名的編碼存在不同的規(guī)范碘饼,我們可以嘗試一下熙兔,將上面的郵件附件發(fā)送到QQ郵箱,附件名顯示正常艾恼,發(fā)送到126的郵箱就是亂碼(這是我測試的結(jié)果)住涉。對(duì)此,我們可以通過給附件名進(jìn)行編碼的方式來解決這個(gè)問題钠绍。

    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)),
            },
        }),
    )
    

將郵件內(nèi)容更改為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編碼后的郵件內(nèi)容為:

Mime-Version: 1.0
Date: Sat, 10 Nov 2018 21:53:22 +0800
From: =?UTF-8?b?5byg5LiJ?= <user@example.com>
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--
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舆声,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媳握,老刑警劉巖碱屁,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛾找,居然都是意外死亡娩脾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門打毛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柿赊,“玉大人,你說我怎么就攤上這事幻枉∨錾” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熬甫,是天一觀的道長胰挑。 經(jīng)常有香客問我,道長椿肩,這世上最難降的妖魔是什么瞻颂? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮覆旱,結(jié)果婚禮上蘸朋,老公的妹妹穿的比我還像新娘。我一直安慰自己扣唱,他們只是感情好藕坯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噪沙,像睡著了一般炼彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上正歼,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天辐马,我揣著相機(jī)與錄音,去河邊找鬼局义。 笑死喜爷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萄唇。 我是一名探鬼主播檩帐,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼另萤!你這毒婦竟也來了湃密?” 一聲冷哼從身側(cè)響起诅挑,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泛源,沒想到半個(gè)月后拔妥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡达箍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年没龙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幻梯。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兜畸,死狀恐怖努释,靈堂內(nèi)的尸體忽然破棺而出碘梢,到底是詐尸還是另有隱情,我是刑警寧澤伐蒂,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布煞躬,位于F島的核電站,受9級(jí)特大地震影響逸邦,放射性物質(zhì)發(fā)生泄漏恩沛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一缕减、第九天 我趴在偏房一處隱蔽的房頂上張望雷客。 院中可真熱鬧,春花似錦桥狡、人聲如沸搅裙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽部逮。三九已至,卻和暖如春嫂易,著一層夾襖步出監(jiān)牢的瞬間兄朋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工怜械, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颅和,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓缕允,卻偏偏與公主長得像峡扩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灼芭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容