Cloudflare Email Workers Auth

绑定Cloudflare Email Worker,当收到新邮件时转发内容至指定的WebHook,进一步处理
实现邮箱验证功能

webhook_endpoint 填你的公网WebHook地址
注意添加Token鉴权

Worker 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
export default {
  async email(message, env, ctx,Request) {
    let webhook_endpoint = "https://wocao-bing.trycloudflare.com"
    switch (message.to) {
      case "test@r1.pub":
        await fetch("https://webhook.slack/notification", {
          body: `Got a email from ${message.from}, subject: ${message.headers.get('subject')}`,
        });
        await message.forward("inbox@corp");
        break;
  
      default:
        await fetch(webhook_endpoint+"/auth-mail", {
          headers: {
            "Content-Type": "application/json",
            "X-Request-With": "Cloudflare Email Worker"
          },
          method: "POST",
          body: JSON.stringify({
            "from": message.from,
            "to": message.to,
            "subject": "Auth",
          }),
        });
        await message.forward("archive@example.com");
    }
  }
}

示例后端代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
type MailInfo struct {
        MessageFrom string `json:"from"`
        MessageTo   string `json:"to"`
        Subject     string `json:"subject"`
}

var mailMap = make(map[string]MailInfo)

func main() {
        initDB()
        r := gin.Default()
        r.Static("/assets", "./www/assets")
        r.Use(wtfServer)
        r.NoRoute(func(c *gin.Context) {
                c.String(200, "uid=0(root) gid=0(root) groups=0(root)")
        })
        r.POST("/auth-mail", func(c *gin.Context) {
                domain := "@r1.pub"
                log.Println("Processing Mail.")
                log.Println("处理邮件中.")
                var mailInfo MailInfo
                err := c.BindJSON(&mailInfo)
                if err != nil {
                        log.Println(err)
                        c.JSON(http.StatusOK, gin.H{
                                "message": "nope",
                        })
                        return
                }
                log.Println("发件人:", mailInfo.MessageFrom)
                log.Println("收件人:", mailInfo.MessageTo)
                log.Println("邮件主题:", mailInfo.Subject)
                if mail, found := mailMap[mailInfo.MessageTo]; found {
                        if mail.MessageTo == mailInfo.MessageTo {
                                if strings.HasSuffix(mailInfo.MessageFrom, domain) {
                                        log.Println("验证成功:", "EXAMPLE")
                                        stuid := mailInfo.MessageFrom[:8]
                                        log.Println("学号:", stuid)
                                        mailMap[mail.MessageTo] = mailInfo
                                } else {
                                        log.Println("非教育邮箱,跳过.")
                                }
                        }
                } else {
                        log.Println("未查找到该ID,跳过.")
                }
                c.JSON(http.StatusOK, gin.H{
                        "message": "pong",
                })
        })
}
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy