前言
在幾周前,我開始工作于一個證券投資組合網(wǎng)站。雖然我只能使用 React 完成整個網(wǎng)站,但我決定使用 Go 來創(chuàng)建一個可以處理某些任務(例如發(fā)送 email)的 API 服務器,相信這是一個很好的做法。
我其中的一個頁面是一個 contact 頁面,目前看起來像這樣:
contact me
我想使用專門為此 contact 表單申請的 Gmail 帳戶發(fā)送一封郵件。除了我以前用過 Javascript 發(fā)送電子郵件的事實,我沒有特別選擇 Go。但為什么不嘗試 Go 呢?我覺得 Go 很棒。
步驟一:創(chuàng)建必要的文件
你只需要兩個文件,一個 html 文件和一個 go 文件。它們可以放置在同一目錄中。只需確保您能正確地引用到 html 文件即可。
![](http://img.jbzj.com/file_images/article/201710/20171012100711247.png?201791210719)
注意:您甚至不需要 html 文件,但您必須在 go 文件中以字符串形式編寫 html。我假設你的 Go 環(huán)境已經(jīng)正確設置。如果沒有,請參照這里:https://golang.org/doc/code.html
步驟二:創(chuàng)建模板
![](http://img.jbzj.com/file_images/article/201710/20171012100748934.png?201791210756)
該模板是一段非常簡單的 HTML,而然您可以自定義。先忽略 .Name,我們稍后再回來。
步驟三:GO!
1、添加必要的包
![](http://img.jbzj.com/file_images/article/201710/20171012100816300.png?201791210823)
當你閱讀時,您應該知道為什么我們需要這些。
2、登錄 Gmail
![](http://img.jbzj.com/file_images/article/201710/20171012100833876.png?201791210840)
第 14 行至第 16 行: 我從之前設置的環(huán)境變量中獲取了 Gmail 帳戶的用戶名和密碼。 使用 smtp 包的 PlaneAuth 方法結(jié)合 email 服務器的用戶名、密碼和主機名來登錄。
3、解析模板并設置 email
![](http://img.jbzj.com/file_images/article/201710/20171012100914711.png?201791210922)
第 20 行至第 26 行: 首先通過解析 html 來創(chuàng)建一個模板,然后把它存儲在一個變量 t 中(稍后再用)。然后聲明一個 bytes.Buffer 用于保存 email 的 主題、header 和正文(自定義 html)。我發(fā)現(xiàn)使用 bytes.Buffer 類型比在其他在線解決方案中使用的其他類型更加靈活。fmt 包中的 Sprintf 是一個返回格式化字符串的方便方法。您可以使用它來返回包含 email 主題和 header 的字符串。然后將該字符串轉(zhuǎn)換為字節(jié)數(shù)組,并使用 Write 方法寫入字節(jié)緩沖區(qū)。到目前為止,字節(jié)緩沖區(qū)包含了主題和 header。 接下來我們再補充一下。注意:像 HTTP 一樣,您必須在 header 之后添加兩行新行。
4、填充數(shù)據(jù)模板并發(fā)送 email
![](http://img.jbzj.com/file_images/article/201710/20171012100933146.png?201791210942)
第 28 行至第 37 行: 然后我們需要執(zhí)行該模板,第一個參數(shù)必須實現(xiàn) io.Writer 接口。由于 bytes.Buffer 類型實現(xiàn)了 io.Writer 接口,我們可以通過傳入一個指向 body 變量的指針來使用它。為什么我們使用指向 body 而不是該值的指針與 Go 如何實現(xiàn)接口有關,您可以在文檔中獲取更多信息。第二個參數(shù)包含我們想要傳入的模板(html)數(shù)據(jù)。還記得 HTML 中的 .Name 么?那就是我們?nèi)绾我脠?zhí)行模板的數(shù)據(jù)。. 是我們的結(jié)構體,Name 指的是屬性。不要對 struct 語法感到困惑,我只是在一條語句中聲明了結(jié)構體并初始化它。在 HTML 中使用變量只是您在 Go 模板中可以做的事情之一。
最后,使用 SendMail 方法來帶上主機與端口、之前創(chuàng)建的 Auth 類型、from 字段字符串和包含要發(fā)送 email 的地址的字符串數(shù)組。據(jù)我所知,from 字段字符串什么都不做。也許它對其他 email 服務器有用?
如果您想了解有關 smtp 包的更多信息,這是指向文檔的鏈接。您還可以在這里閱讀關于 text/template 包的內(nèi)容。我知道我們使用了 html/template 包,但在 godocs 中,template 的實現(xiàn)細節(jié)在 text/template 的文檔中。
譯者注
文末提到的 from 字段指定是 email 中的發(fā)件人。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- Go語言通過smtp發(fā)送郵件的方法
- golang實現(xiàn)通過smtp發(fā)送電子郵件的方法