Golang利用自定義模板發(fā)送郵件的方法詳解
前言
在幾周前,我開始工作于一個(gè)證券投資組合網(wǎng)站。雖然我只能使用 React 完成整個(gè)網(wǎng)站,但我決定使用 Go 來(lái)創(chuàng)建一個(gè)可以處理某些任務(wù)(例如發(fā)送 email)的 API 服務(wù)器,相信這是一個(gè)很好的做法。
我其中的一個(gè)頁(yè)面是一個(gè) contact 頁(yè)面,目前看起來(lái)像這樣:
contact me
我想使用專門為此 contact 表單申請(qǐng)的 Gmail 帳戶發(fā)送一封郵件。除了我以前用過(guò) Javascript 發(fā)送電子郵件的事實(shí),我沒(méi)有特別選擇 Go。但為什么不嘗試 Go 呢?我覺得 Go 很棒。
步驟一:創(chuàng)建必要的文件
你只需要兩個(gè)文件,一個(gè) html 文件和一個(gè) go 文件。它們可以放置在同一目錄中。只需確保您能正確地引用到 html 文件即可。
注意:您甚至不需要 html 文件,但您必須在 go 文件中以字符串形式編寫 html。我假設(shè)你的 Go 環(huán)境已經(jīng)正確設(shè)置。如果沒(méi)有,請(qǐng)參照這里:https://golang.org/doc/code.html
步驟二:創(chuàng)建模板
該模板是一段非常簡(jiǎn)單的 HTML,而然您可以自定義。先忽略 .Name,我們稍后再回來(lái)。
步驟三:GO!
1、添加必要的包
當(dāng)你閱讀時(shí),您應(yīng)該知道為什么我們需要這些。
2、登錄 Gmail
第 14 行至第 16 行: 我從之前設(shè)置的環(huán)境變量中獲取了 Gmail 帳戶的用戶名和密碼。 使用 smtp 包的 PlaneAuth 方法結(jié)合 email 服務(wù)器的用戶名、密碼和主機(jī)名來(lái)登錄。
3、解析模板并設(shè)置 email
第 20 行至第 26 行: 首先通過(guò)解析 html 來(lái)創(chuàng)建一個(gè)模板,然后把它存儲(chǔ)在一個(gè)變量 t 中(稍后再用)。然后聲明一個(gè) bytes.Buffer 用于保存 email 的 主題、header 和正文(自定義 html)。我發(fā)現(xiàn)使用 bytes.Buffer 類型比在其他在線解決方案中使用的其他類型更加靈活。fmt 包中的 Sprintf 是一個(gè)返回格式化字符串的方便方法。您可以使用它來(lái)返回包含 email 主題和 header 的字符串。然后將該字符串轉(zhuǎn)換為字節(jié)數(shù)組,并使用 Write 方法寫入字節(jié)緩沖區(qū)。到目前為止,字節(jié)緩沖區(qū)包含了主題和 header。 接下來(lái)我們?cè)傺a(bǔ)充一下。注意:像 HTTP 一樣,您必須在 header 之后添加兩行新行。
4、填充數(shù)據(jù)模板并發(fā)送 email
第 28 行至第 37 行: 然后我們需要執(zhí)行該模板,第一個(gè)參數(shù)必須實(shí)現(xiàn) io.Writer 接口。由于 bytes.Buffer 類型實(shí)現(xiàn)了 io.Writer 接口,我們可以通過(guò)傳入一個(gè)指向 body 變量的指針來(lái)使用它。為什么我們使用指向 body 而不是該值的指針與 Go 如何實(shí)現(xiàn)接口有關(guān),您可以在文檔中獲取更多信息。第二個(gè)參數(shù)包含我們想要傳入的模板(html)數(shù)據(jù)。還記得 HTML 中的 .Name 么?那就是我們?nèi)绾我脠?zhí)行模板的數(shù)據(jù)。. 是我們的結(jié)構(gòu)體,Name 指的是屬性。不要對(duì) struct 語(yǔ)法感到困惑,我只是在一條語(yǔ)句中聲明了結(jié)構(gòu)體并初始化它。在 HTML 中使用變量只是您在 Go 模板中可以做的事情之一。
最后,使用 SendMail 方法來(lái)帶上主機(jī)與端口、之前創(chuàng)建的 Auth 類型、from 字段字符串和包含要發(fā)送 email 的地址的字符串?dāng)?shù)組。據(jù)我所知,from 字段字符串什么都不做。也許它對(duì)其他 email 服務(wù)器有用?
如果您想了解有關(guān) smtp 包的更多信息,這是指向文檔的鏈接。您還可以在這里閱讀關(guān)于 text/template 包的內(nèi)容。我知道我們使用了 html/template 包,但在 godocs 中,template 的實(shí)現(xiàn)細(xì)節(jié)在 text/template 的文檔中。
譯者注
文末提到的 from 字段指定是 email 中的發(fā)件人。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
go語(yǔ)言執(zhí)行等待直到后臺(tái)goroutine執(zhí)行完成實(shí)例分析
這篇文章主要介紹了go語(yǔ)言執(zhí)行等待直到后臺(tái)goroutine執(zhí)行完成的方法,實(shí)例分析了Go語(yǔ)言中WaitGroup的使用技巧,需要的朋友可以參考下2015-03-03Golang 實(shí)現(xiàn)簡(jiǎn)單隨機(jī)負(fù)載均衡
均衡算法又分為 隨機(jī),輪詢,加權(quán)輪詢,哈希,而隨機(jī)負(fù)載均衡算法就是本文的重點(diǎn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12使用Go語(yǔ)言實(shí)現(xiàn)發(fā)送微信群消息
這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)發(fā)送微信群消息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Go語(yǔ)言實(shí)現(xiàn)逐行讀取和寫入文件詳解
這篇文章主要介紹了如何使用go語(yǔ)言實(shí)現(xiàn)從輸入文件中讀取每行數(shù)據(jù),然后將每行字段組合成SQL插入腳本,然后逐行寫入另外一個(gè)空白文件中,有需要的可以參考下2024-01-01Golang 使用http Client下載文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Golang 使用http Client下載文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07GoLang中panic與recover函數(shù)以及defer語(yǔ)句超詳細(xì)講解
這篇文章主要介紹了GoLang的panic、recover函數(shù),以及defer語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01