幾周前,我開始工作於一個證券投資組合網站。雖然我只能使用 React 完成整個網站,但我決定使用 Go 來創建一個可以處理某些任務(例如發送 email)的 API 伺服器,相信這是一個很好的做法。我其中的一個頁面是一個 contact 頁面,目前看起來像這樣:我想使用專門為此 contact 表單... ...
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 中的發件人。