五分鐘快速搭建Serverless免費郵件服務
阿新 • • 發佈:2020-07-23
![](https://upload-images.jianshu.io/upload_images/2799767-508cd8bd0a9c2fe7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 1. 引言
本文將帶你快速基於 Azure Function 和 SendGrid 構建一個免費的Serverless(無伺服器)的郵件傳送服務,讓你感受下Serverless的強大之處。
該服務可以**每月免費傳送2,5000封**,這是完全白嫖啊,感興趣的,趕緊動起你的小手爪,噼裡啪啦搞起來呀。
# 2. 建立 SendGrid 賬號
*你要有一個Azure賬號,沒有的話,花幾分鐘自行註冊一個就好。(我的賬號註冊在香港區域)*
咱們先來建立一個**SendGrid Accounts**,如下圖所示。點選SendGrid Accounts後,再點選建立SendGrid account。
![SendGrid Accounts](https://upload-images.jianshu.io/upload_images/2799767-48afba14c71a05c2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/2799767-83453108dc39e87f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
填寫完畢後,點選Review+Create,稍等片刻,提示部署成功,那麼恭喜你,可以接著往下玩耍了。如果部署失敗,可能會因為SendGrid遮蔽了某些區域的賬號建立,就只能重新註冊個Azure賬號玩耍了。
緊接著,前往剛剛建立的SendGrid Account,點選Manage會跳轉至SendGrid管理面板。
![SendGrid Account](https://upload-images.jianshu.io/upload_images/2799767-8ff7849d28bd0cee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
開啟後,會要求你進去郵件驗證,自行前往郵箱驗證即可。
![SendGrid Dashboard](https://upload-images.jianshu.io/upload_images/2799767-cd231fc9c9e1a91c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
點選API Keys,然後點選Create API Key,填寫API Key Name,選擇 Full Access,點選Create&View,記下生成的API Key,後面需要用到。
![建立ApiKey](https://upload-images.jianshu.io/upload_images/2799767-19e799cbfe57546a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 3. 建立第一個函式應用
回到Azure控制檯,然後搜尋**函式應用**。
![搜尋函式應用](https://upload-images.jianshu.io/upload_images/2799767-0baff2aa7153f3e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
開啟後點擊新增,按以下圖示進行建立。其中務必選擇以程式碼釋出,承載的作業系統選擇Windows。
![Create Azure Function](https://upload-images.jianshu.io/upload_images/2799767-8ca4cc1a0e8c637f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
建立成功後,轉到資源,如下圖所示:
![Azure Function](https://upload-images.jianshu.io/upload_images/2799767-c725525dd929a9a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
依次點選函式,新增,選擇HTTP trigger模板,填寫函式名稱,然後指定身份驗證級別。
![Create HTTP trigger](https://upload-images.jianshu.io/upload_images/2799767-965ad86a3747bae3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
點選建立,建立成功後,跳轉到函式頁面,點選獲取函式URL,貼上URL到瀏覽器就可以訪問到你建立的第一個函式應用。
![First Httptrigger Function](https://upload-images.jianshu.io/upload_images/2799767-182870212f9d7667.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
點選程式碼+測試,就可以看到模板程式碼,如下圖所示:
![Httptrigger 模板程式碼](https://upload-images.jianshu.io/upload_images/2799767-0207fff5a0b8b049.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
從截圖來看,這個和C#的語法並無太大差別,官方稱為C#指令碼。
緊接著替換`run.csx`為以下程式碼並點選儲存:
```
//run.csx
#r "Newtonsoft.Json"
#r "SendGrid"
using System.Net;
using Microsoft.Azure.WebJobs.Host;
using SendGrid.Helpers.Mail;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
public static SendGridMessage Run(Email req, ILogger log)
{
var reqStr = JsonConvert.SerializeObject(req);
log.LogInformation(reqStr);
var message = new SendGridMessage();
message.AddTo(req.To);
message.AddContent("text/html", req.Body);
message.SetFrom(new EmailAddress(req.From));
message.SetSubject(req.Subject);
return message;
}
public class Email
{
public string To { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
```
然後修改`function.json`中的配置如下,並儲存。
```
{
"bindings": [
{
"authLevel": "function",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"methods": [
"get",
"post"
]
},
{
"type": "sendGrid",
"name": "$return",
"direction": "out",
"apiKey": "SendGridAPIKeyAsAppSetting"
}
]
}
```
注意觀察配置項中需要指定`apiKey`,就是我們上面建立SendGrid Account 中對應的ApiKey。回到上面建立的Azure Function 應用服務,然後按下圖新增上面發郵件函式需要的配置項,如下所示。
![新增配置項](https://upload-images.jianshu.io/upload_images/2799767-2e75613d39c9277e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
新增完畢後,再回到函式中就可以測試運行了,如下圖所示:
![](https://upload-images.jianshu.io/upload_images/2799767-8226414351eae530.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
查收郵件,你將收到來自Azure Function & SendGrid 的免費問候。
![查收郵件](https://upload-images.jianshu.io/upload_images/2799767-cf4dc9e150c3c981.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
當然,也可以通過Postman自行驗證:
![image.png](https://upload-images.jianshu.io/upload_images/2799767-f4f04ec45f023c3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 4.最後
通過以上的連環操作,相信你不僅成功薅了一把微軟的羊毛,而且順帶對**Serverless**也有了一定的認知。
如果對Azure Function感興趣的,不妨參考[官方文件](https://docs.microsoft.com/en-us/azure/azure-functions/)研究一番,相信你會發掘不少玩法,順便再薅它幾把羊毛,哈哈哈!