這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
https://medium.com/@itsHabib/sending-emails-with-go-using-a-custom-template-ae863b65a859
作者:Michael Habib
譯者:http://oopsguy.com
幾周前,我開始工作於一個證券投資組合網站。雖然我只能使用 React 完成整個網站,但我決定使用 Go 來建立一個可以處理某些任務(例如發送 email)的 API 伺服器,相信這是一個很好的做法。我其中的一個頁面是一個 contact 頁面,目前看起來像這樣:
我想使用專門為此 contact 表單申請的 Gmail 帳戶發送一封郵件。除了我以前用過 Javascript 寄送電子郵件的事實,我沒有特別選擇 Go。但為什麼不嘗試 Go 呢?我覺得 Go 很棒。
步驟一:建立必要的檔案
你只需要兩個檔案,一個 html 檔案和一個 go 檔案。它們可以放置在同一目錄中。只需確保您能正確地引用到 html 檔案即可。
注意:您甚至不需要 html 檔案,但您必須在 go 檔案中以字串形式編寫 html。我假設你的 Go 環境已經正確設定。如果沒有,請參照這裡:https://golang.org/doc/code.html
步驟二:建立模板
該模板是一段非常簡單的 HTML,而然您可以自訂。先忽略 .Name,我們稍後再回來。
步驟三:GO!
1、添加必要的包
當你閱讀時,您應該知道為什麼我們需要這些。
2、登入 Gmail
第 14 行至第 16 行: 我從之前設定的環境變數中擷取了 Gmail 帳戶的使用者名稱和密碼。 使用 smtp
包的 PlaneAuth
方法結合 email 伺服器的使用者名稱、密碼和主機名稱來登入。
3、解析模板並設定 email
第 20 行至第 26 行: 首先通過解析 html 來建立一個模板,然後把它儲存在一個變數 t
中(稍後再用)。然後聲明一個 bytes.Buffer
用於儲存 email 的 主題、header 和本文(自訂 html)。我發現使用 bytes.Buffer
類型比在其他線上解決方案中使用的其他類型更加靈活。fmt
包中的 Sprintf
是一個返回格式化字串的方便方法。您可以使用它來返回包含 email 主題和 header 的字串。然後將該字串轉換為位元組數組,並使用 Write
方法寫入位元組緩衝區。到目前為止,位元組緩衝區包含了主題和 header。 接下來我們再補充一下。注意:像 HTTP 一樣,您必須在 header 之後添加兩行新行。
4、填充資料範本並發送 email
第 28 行至第 37 行: 然後我們需要執行該模板,第一個參數必須實現 io.Writer
介面。由於 bytes.Buffer
類型實現了 io.Writer
介面,我們可以通過傳入一個指向 body
變數的指標來使用它。為什麼我們使用指向 body
而不是該值的指標與 Go 如何?介面有關,您可以在文檔中擷取更多資訊。第二個參數包含我們想要傳入的模板(html)資料。還記得 HTML 中的 .Name 嗎?那就是我們如何引用執行模板的資料。.
是我們的結構體,Name
指的是屬性。不要對 struct 文法感到困惑,我只是在一條語句中聲明了結構體並初始化它。在 HTML 中使用變數只是您在 Go 模板中可以做的事情之一。
最後,使用 SendMail
方法來帶上主機與連接埠、之前建立的 Auth
類型、from
欄位字串和包含要發送 email 的地址的字串數組。據我所知,from
欄位字串什麼都不做。也許它對其他 email 伺服器有用?
如果您想瞭解有關 smtp
包的更多資訊,這是指向文檔的連結。您還可以在這裡閱讀關於 text/template
包的內容。我知道我們使用了 html/template
包,但在 godocs 中,template 的實現細節在 text/template
的文檔中。
譯者注
文末提到的 from
欄位指定是 email 中的寄件者。