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 語法感到困惑,我只是在一條語句中聲明了結構體並初始化它。
最后,使用 SendMail
方法,傳入主機地址、端口、之前創建的 Auth
類型、from
字段字符串和包含要發送 email 的地址的字符串數組。據我所知,from
字段字符串什么都不做。也許它對其他 email 服務器有用?
如果你想了解有關 smtp
包的更多信息,這是文檔的鏈接。你還可以在這里閱讀關於 text/template
包的介紹。我知道我們使用了 html/template
包,但在 godocs 中,template 的實現細節在 text/template
的文檔中。
譯者注
文末提到的 from
字段指定是 email 中的發件人。