Cloudflare Email Workers Auth
绑定Cloudflare Email Worker,当收到新邮件时转发内容至指定的WebHook,进一步处理
实现邮箱验证功能
webhook_endpoint 填你的公网WebHook地址
注意添加Token鉴权
Worker 代码
js
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");
}
}
}示例后端代码
go
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",
})
})
}