web_push.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "net/http"
  6. "os"
  7. "pmail/config"
  8. "pmail/dto/parsemail"
  9. "pmail/hooks/framework"
  10. "pmail/utils/context"
  11. log "github.com/sirupsen/logrus"
  12. )
  13. type WebPushHook struct {
  14. url string
  15. token string
  16. }
  17. // EmailData 用于存储解析后的邮件数据
  18. type EmailData struct {
  19. From string `json:"from"`
  20. To []string `json:"to"`
  21. Subject string `json:"subject"`
  22. Body string `json:"body"`
  23. Token string `json:"token"`
  24. }
  25. func (w *WebPushHook) SendBefore(ctx *context.Context, email *parsemail.Email) {
  26. }
  27. func (w *WebPushHook) SendAfter(ctx *context.Context, email *parsemail.Email, err map[string]error) {
  28. }
  29. func (w *WebPushHook) ReceiveParseBefore(ctx *context.Context, email *[]byte) {
  30. }
  31. func (w *WebPushHook) ReceiveParseAfter(ctx *context.Context, email *parsemail.Email) {
  32. if w.url == "" {
  33. return
  34. }
  35. content := string(email.Text)
  36. if content == "" {
  37. content = email.Subject
  38. }
  39. webhookURL := w.url // 替换为您的 Webhook URL
  40. to := make([]string, len(email.To))
  41. for i, user := range email.To {
  42. to[i] = user.EmailAddress
  43. }
  44. data := EmailData{
  45. From: email.From.EmailAddress,
  46. To: to,
  47. Subject: email.Subject,
  48. Body: content,
  49. Token: w.token,
  50. }
  51. jsonData, err := json.Marshal(data)
  52. if err != nil {
  53. log.WithContext(ctx).Errorf("web push error %+v", err)
  54. }
  55. resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
  56. if err != nil {
  57. log.WithContext(ctx).Errorf("web push error %+v", err)
  58. }
  59. defer resp.Body.Close()
  60. }
  61. type Config struct {
  62. WebPushUrl string `json:"webPushUrl"`
  63. WebPushToken string `json:"webPushToken"`
  64. }
  65. func NewWebPushHook() *WebPushHook {
  66. var cfgData []byte
  67. var err error
  68. cfgData, err = os.ReadFile("../config/config.json")
  69. if err != nil {
  70. panic(err)
  71. }
  72. var mainConfig *config.Config
  73. err = json.Unmarshal(cfgData, &mainConfig)
  74. if err != nil {
  75. panic(err)
  76. }
  77. var pluginConfig *Config
  78. if _, err := os.Stat("./web_push_config.json"); err == nil {
  79. cfgData, err = os.ReadFile("./web_push_config.json")
  80. if err != nil {
  81. panic(err)
  82. }
  83. err = json.Unmarshal(cfgData, &pluginConfig)
  84. if err != nil {
  85. panic(err)
  86. }
  87. }
  88. token := ""
  89. pushURL := ""
  90. if pluginConfig != nil {
  91. pushURL = pluginConfig.WebPushUrl
  92. token = pluginConfig.WebPushToken
  93. } else {
  94. pushURL = mainConfig.WebPushUrl
  95. token = mainConfig.WebPushToken
  96. }
  97. ret := &WebPushHook{
  98. url: pushURL,
  99. token: token,
  100. }
  101. return ret
  102. }
  103. func main() {
  104. framework.CreatePlugin(NewWebPushHook()).Run()
  105. }