【Go Web 開發】發送郵件
在接下來的幾篇文章中,我們將在 API 中注入一些交互,並調整用戶註冊 API 處理函數 registerUserHandler,以便在用戶成功註冊後向其發送歡迎電子郵件。
在這個過程中,我們將討論一些有趣的話題。你將學習:
-
如何在開發中使用 Mailtrap SMTP 服務來發送和監控測試郵件。
-
如何使用 html/template 包和 Go 1.16 的嵌入文件功能來創建動態易管理的郵件內容模版。
-
如何爲應用創建可複用的 internal/mailer 包來發送郵件。
-
如何實現後臺協程發送郵件模式,以及優雅關閉時候,如何等待這些操作完成。
配置 SMTP 服務器
爲了開發郵件發送功能,需要訪問 SMTP(簡單郵件傳輸協議) 服務器來進行測試。
現在有很多 STMP 服務提供商 (例如 Postmark,Sendgrid 或 Amazon SES) 可以用來發送郵件,你甚至可以自己安裝搭建 SMTP 服務器。但在本書中我們將使用 Mailtrap[https://mailtrap.io/]。
使用 Mailtrap 的原因是因爲它是在開發和測試期間發送電子郵件的專業服務。從本質上講,它將所有電子郵件發送到一個你可以訪問的收件箱,而不是發送給真正的收件人。
作者和這家公司沒有任何聯繫,只是覺得這家公司的服務很好,使用起來也很簡單。他們還提供了一個 “永久免費” 的計劃,這對任何編寫代碼的人來說都應該足夠了。
注意:如果你已經有自己的 STMP 服務器,或想選擇別的服務提供商也是可以的。請直接略過。
配置 Mailtrap
要設置一個 Mailtrap 帳戶,請前往註冊 [https://mailtrap.io/register/signup] 頁面,在那裏可以使用您的電子郵件地址、谷歌或 GitHub 帳戶註冊。註冊並登錄後,應該會看到一個列出可用收件箱的頁面,類似於下面的截圖。
每個 Mailtrap 帳戶都有一個免費的收件箱,默認情況下被稱爲演示收件箱。如果您願意,可以通過單擊 Actions 下面的鉛筆圖標來更改名稱。繼續點擊收件箱,將看到當前是空的沒有任何郵件,如下所示:
每個收件箱都有自己的 SMTP 認證信息,您可以通過單擊 Show credentials 鏈接 (在上面的屏幕截圖中由紅色框突出顯示) 來顯示這些認證信息。類似於下面的截圖。
您使用這些 SMTP 認證信息發送的任何郵件最終都會進入這個收件箱,而不是發送到實際的收件人。如果你跟隨本文操作,請記住自己屏幕顯示的認證信息,後面將會使用到。
上面顯示的認證信息已經重置過了不在生效,請不要使用。
創建郵件模版
首先,我們將歡迎電子郵件的內容設置的非常簡單,僅包括一條短消息,讓用戶知道他們的註冊已成功,並確認了他們的 ID 號。類似於:
Hi,
Thanks for signing up for a Greenlight account. We're excited to have you on board!
For future reference, your user ID number is 123.
Thanks,
The Greenlight Team
注意: 在歡迎郵件中包含用戶 ID 可能不是你想做的事情,但這是我們演示如何在郵件中包含動態數據的簡單方法——不僅僅是靜態內容。
我們可以採用幾種不同的方法來定義和管理這封電子郵件的內容,但一個方便靈活的方法是使用 html/template 包中的模版功能。
如果你跟隨本系列文章操作,請在項目根目錄中創建 internal/mailer/template 文件夾,然後添加 user_welcome.tmpl 文件,如下所示:
$ mkdir -p internal/mailer/templates
$ touch internal/mailer/templates/user_welcome.tmpl
在這個文件中,我們將定義三個命名模版來作爲我們歡迎郵件的一部分:
-
"subject" 模版包含郵件的主題行
-
"plainBody" 模版包含郵件郵件消息體的文本變量
-
"htmlBody" 模版包含郵件消息體的 HTML 變量
更新 internal/mailer/tmeplates/user_welcome.tmpl 文件包含以下模版內容:
{{define "subject"}} Welcome to Greenlight!{{end}}
{{define "plainBody"}}
Hi,
Thanks for singing up for a Greenlight account. We're excited to have you on board!
for future reference, your use ID number is {{.ID}}.
Thanks,
The Greenlight Team
{{end}}
{{define "htmlBody"}}
<!doctype html>
<html>
<head>
<meta />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Hi,</p>
<p>Thanks for signing up for a Greenlight account. We're excited to have you on board!</p> <p>For future reference, your user ID number is {{.ID}}.</p>
<p>Thanks,</p>
<p>The Greenlight Team</p>
</body>
</html>
{{end}}
模版內容包含:
-
使用 {{define "..."}}...{{end}} 標籤定義了三個命名模版。
-
可以使用動態數據來渲染模版。下一節我們將傳入用戶結構體作爲模版動態數據,將用戶 ID 填入模版的 {{.ID}} 位置。
注意:如果你經常修改郵件文本或要求用戶可編輯,可能需要將模版作爲字符串存儲在數據庫中。但我發現,將它們存儲在一個文件中,就像上面操作的,是一種不那麼複雜的方法,也是大多數項目使用的方式。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/JBdrlExFEhFfN9HI81kO9Q