定時發送個性化郵件教程

LeanCloud 史拂塵html

咱們生活中接觸到的不少互聯網服務都有定時發送個性化郵件提醒的功能,好比信用卡公司會在客戶每月的帳單日發出還款提醒,還有項目管理類應用會按期給用戶發送即將到期的待辦事項的彙總。做爲應用開發者,咱們該如何去實現這類功能呢?前端

不少郵件羣發服務商容許你設定時間間隔來自動向用戶發送郵件,不過這類服務的缺點是內容沒法作到高度定製化。一般你能夠在郵件模版中插入可以在用戶列表裏找到的姓名、稱謂等資料,但這些資料都是靜態的。若是咱們但願郵件內容能夠基於用戶的實際使用數據來動態生成(好比在還款提醒裏面插入還款金額),那麼這其中必定須要某種機制從應用的數據庫中拉取與用戶相關的數據(一般還需進行必定的計算),這是基於模版的羣發服務作不到的。另外若是須要在不一樣時間向不一樣用戶發送提醒(好比不一樣的信用卡客戶有不一樣的帳單日,或者應用容許用戶自定義接收提醒的時間和頻率),那麼如何管理髮送時間也成了難題。vue

因此若是想要給用戶個性化的提醒,就須要獨立於郵件羣發服務商以外維護一個定時器,這個定時器應該可以主動訪問應用數據庫並基於獲取到的數據執行特定的代碼;與此同時,選用一個支持經過 API 調用來傳入郵件內容和收件人的郵件服務商,讓前面的定時器在須要發送郵件時將相關數據傳入 API。node

代碼從數據庫獲取數據,而後基於這些數據編寫郵件

代碼從數據庫獲取數據,而後基於這些數據編寫郵件git

咱們製做了一個展現如何實現這些功能的 Demo。這個 Demo 包含了一個最基本的 Todo 應用,用戶能夠建立 Todo 項目併爲每一個項目設置一個截止時間,Todo 會被保存在 LeanCloud 的數據存儲服務中。這個 Demo 還包含一個雲函數(能夠在雲端執行的代碼),用於查詢是否有在接下來必定時間內到期但還沒有完成的項目,若是有的話就會調用 SendGrid 的 API 給一個固定地址發送一封包含這些項目的郵件。這個雲函數會被託管在 LeanCloud 雲引擎上面,每隔一段時間執行一次。github

準備工做

爲了可以順利運行 Demo,請確保你已經分別擁有 LeanCloud 和 SendGrid 的賬戶。若是尚未的話,能夠前往它們各自的官網進行註冊:數據庫

LeanCloud:https://www.leancloud.cn/
SendGrid:https://sendgrid.com/後端

前端部分

先將 Demo 克隆到本地,用編輯器打開 index.html,這裏包含了 Todo 應用的前端部分。它知足瞭如下需求:瀏覽器

  1. 用戶能夠建立 Todo 項目。建立 Todo 時,需提供標題和截止時間。
  2. 應用經過一個列表展現出全部的 Todo,包括它們的標題和截止時間。
  3. 每一個 Todo 帶有一個複選框用於在「未完成」和「已完成」兩種狀態間切換。Todo 在建立後默認爲「未完成」狀態。
  4. 每一個 Todo 帶有一個「刪除」按鈕用於將其從列表中刪除。

代碼是基於 Vue.js 編寫的。如下是對各部分的解釋:服務器

  • < h2 >新建 Todo< /h2 >下方的表單與 data.newTodo 中的數據綁定。
  • add 方法會在「建立」被點擊時觸發,它會從 data.newTodo 中獲取數據,建立一個 Todo 對象(該對象具備一個 title 屬性表示標題,一個 due 屬性表示截止時間,還有一個 completed 屬性表示是否已完成,默認爲 false),並將其保存到 LeanCloud 雲端。
  • fetchTodos 方法會從 LeanCloud 雲端獲取全部 Todo 對象並用它們替換掉 data.todos。data.todos 中的數據會被渲染在 < h2 >Todo 列表< /h2 > 下方。
  • toggleCompleted 方法會在某一個 Todo 項目的複選框被點擊時觸發,它會根據複選框的狀態更新對應的 Todo 對象的 completed 屬性(已勾選爲 true,未勾選爲 false),並將修改後的對象保存到 LeanCloud 雲端。
  • remove 方法會在某一個 Todo 項目的「刪除」按鈕被點擊時觸發,它會從 LeanCloud 雲端刪除對應的 Todo 對象。
  • fetchTodos 會在頁面加載完成後運行一次來將數據庫中已有的 Todo 項目拉取到前端。add、toggleCompleted、remove 在完成各自的操做後也都會觸發一次 fetchTodos 來刷新前端的 Todo 列表。
LeanCloud 數據存儲 SDK 的用法可參考 官方指南

在運行 Demo 以前,讓咱們先去 LeanCloud 建立一個應用用於存儲數據。點擊 LeanCloud 控制檯首頁的「建立應用」,隨便填寫一個應用名,而後點擊「建立」,以後點擊應用的名字進入應用管理界面。點擊左側「設置」裏面的「應用 Keys」找到「AppID」、「AppKey」和「REST API 服務器地址」並將它們分別填入 index.html 中的 appId、appKey 和 serverURLs,而後保存文件。如今你能夠直接在瀏覽器中打開這個文件並嘗試咱們前面提到的那些功能。試着隨便填入一個標題、日期、時間並點擊「建立」,若是「Todo 列表」中出現了你輸入的內容,證實這條 Todo 已經成功保存到 LeanCloud。如今回到 LeanCloud 的控制檯並點擊左側的「存儲」,而後點擊「Todo」這個 Class,你就能看到剛剛建立的全部 Todo:

Todo 表中含有剛剛建立的 Todo 項目

Todo 表中含有剛剛建立的 Todo 項目

雲函數

接下來咱們來準備雲函數。咱們但願每隔 30 秒查詢是否有在接下來一天(24 小時)內到期但未完成的項目,若是有的話則發出郵件,那麼實現思路就是:

  1. 編寫一個查詢,查找 due 位於當前時間一天以內且 completedfalseTodo 對象。
  2. 若是該查詢返回 1 個或多個對象,則調用 SendGrid 的 API 發送郵件,郵件內容基於這些對象包含的數據生成。
  3. 將以上邏輯打包成一個雲函數。
  4. 每隔 30 秒運行一次該雲函數。

上述邏輯的第 1 至 3 條已經在 cloud.js 中名爲 checkTodos 的雲函數中實現好,不過爲了可以正常發送郵件,咱們還須要從 SendGrid 獲取一個 API Key。

讓咱們打開 SendGrid 的控制檯,點擊左側的「Email API」,進入「Integration Guide」,選擇「Web API」,而後選擇「Node.js」:

SendGrid 界面截圖

SendGrid 界面截圖

在接下來的界面中的第二步隨便填入一個名字,而後點擊「Create Key」,你就能獲得一個 API Key:

SendGrid 界面截圖

SendGrid 界面截圖

將其填入 cloud.js 中的 sgMail.setApiKey。另外在後面的 to 中填入你的郵箱地址,這樣咱們稍後測試代碼時,你就能夠收到並查看應用發出的郵件。

至此,咱們這個 Todo 應用的前端和後端的代碼已經就緒。咱們最後要作的,是將其部署到 LeanCloud 雲引擎上,並設置定時任務。

部署並設置定時任務

若是你尚未安裝 LeanCloud 命令行工具,請根據這裏的指引進行安裝。安裝並登陸好 LeanCloud 帳號後,將本地的項目和 LeanCloud 上的應用進行關聯,而後運行 lean deploy 進行部署。

部署完成後,打開 LeanCloud 控制檯,點擊左側的「雲引擎」並進入「定時任務」,而後點擊「建立定時任務」。隨便填寫一個名稱,在「請選擇函數」下拉列表中選擇「checkTodos」,勾選「循環任務間隔時長」並在下方填入「30」,最後點擊「保存」。

大功告成!你如今能夠試着建立幾個在當前時間 24 小時內到期的 Todo 項目,稍等片刻應該就能收到相似這樣的通知郵件了:

列出 Todo 項目的郵件

列出 Todo 項目的郵件

注意:若是不對定時任務進行其餘操做,那麼它將一直運行下去。請確保在每次測試完成後暫停或刪除定時任務。

如今你已經掌握瞭如何定時向用戶發送包含定製化內容的郵件。其實定時任務這個功能還有不少其餘玩法,好比定時清理垃圾數據、按期生成統計報表等等。若是你以爲這是個不錯的功能,不妨本身動手基於 Demo 裏面的代碼進行一些修改,嘗試作一些更有趣、更實用的功能。

相關文章
相關標籤/搜索