From 505b3df773600bb3a5952fa5dddbceee40299747 Mon Sep 17 00:00:00 2001 From: jinnrry Date: Thu, 7 Mar 2024 11:25:44 +0800 Subject: [PATCH 1/7] fix --- Dockerfile | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5710946..393426a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,14 +9,13 @@ RUN yarn && yarn build FROM golang:alpine as serverbuild ARG VERSION WORKDIR /work - -COPY --from=febuild /work/dist /work/http_server/dist - +COPY . . +COPY --from=febuild /work/dist /work/server/http_server/dist RUN apk update && apk add git -RUN go build -ldflags "-s -w -X 'main.version=${VERSION}' -X 'main.goVersion=$(go version)' -X 'main.gitHash=$(git show -s --format=%H)' -X 'main.buildTime=$(TZ=UTC-8 date +%Y-%m-%d" "%H:%M:%S)'" -o pmail main.go -RUN cd /work/hooks/telegram_push && go build -ldflags "-s -w" -o output/telegram_push telegram_push.go -RUN cd /work/hooks/web_push && go build -ldflags "-s -w" -o output/web_push web_push.go -RUN cd /work/hooks/wechat_push && go build -ldflags "-s -w" -o output/wechat_push wechat_push.go +RUN cd /work/server && go build -ldflags "-s -w -X 'main.version=${VERSION}' -X 'main.goVersion=$(go version)' -X 'main.gitHash=$(git show -s --format=%H)' -X 'main.buildTime=$(TZ=UTC-8 date +%Y-%m-%d" "%H:%M:%S)'" -o pmail main.go +RUN cd /work/server/hooks/telegram_push && go build -ldflags "-s -w" -o output/telegram_push telegram_push.go +RUN cd /work/server/hooks/web_push && go build -ldflags "-s -w" -o output/web_push web_push.go +RUN cd /work/server/hooks/wechat_push && go build -ldflags "-s -w" -o output/wechat_push wechat_push.go FROM alpine @@ -31,9 +30,9 @@ RUN apk add --no-cache tzdata \ &&rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache -COPY --from=serverbuild /work/pmail . -COPY --from=serverbuild /work/hooks/telegram_push/output/* ./plugins/ -COPY --from=serverbuild /work/hooks/web_push/output/* ./plugins/ -COPY --from=serverbuild /work/hooks/wechat_push/output/* ./plugins/ +COPY --from=serverbuild /work/server/pmail . +COPY --from=serverbuild /work/server/hooks/telegram_push/output/* ./plugins/ +COPY --from=serverbuild /work/server/hooks/web_push/output/* ./plugins/ +COPY --from=serverbuild /work/server/hooks/wechat_push/output/* ./plugins/ CMD /work/pmail From d23e7fc5866a7cbaa58288053761729e781f994e Mon Sep 17 00:00:00 2001 From: Kotsuki Crrashh Date: Tue, 9 Apr 2024 18:45:54 +0800 Subject: [PATCH 2/7] =?UTF-8?q?chore(README):=20=E6=9B=B4=E6=AD=A3README?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E6=8C=87=E5=90=91=20(#99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(README): 更正链接指向 Signed-off-by: crrashh1542 * chore(README): 更正链接指向 Signed-off-by: crrashh1542 --------- Signed-off-by: crrashh1542 --- README.md | 4 ++-- README_CN.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c8d1d97..0e3373c 100644 --- a/README.md +++ b/README.md @@ -103,9 +103,9 @@ SMTP Port: 25/465(SSL) [WeChat Push](server/hooks/wechat_push/README.md) -[Telegram Push](server/hooks/wechat_push/README.md) +[Telegram Push](server/hooks/telegram_push/README.md) -[Web Push](server/hooks/wechat_push/README.md) +[Web Push](server/hooks/web_push/README.md) ## Plugin Install > [!IMPORTANT] diff --git a/README_CN.md b/README_CN.md index 67ede80..30b9544 100644 --- a/README_CN.md +++ b/README_CN.md @@ -106,9 +106,9 @@ SMTP端口: 25/465(SSL) [微信推送](server/hooks/wechat_push/README.md) -[Telegram推送](server/hooks/wechat_push/README.md) +[Telegram推送](server/hooks/telegram_push/README.md) -[WebHook推送](server/hooks/wechat_push/README.md) +[WebHook推送](server/hooks/web_push/README.md) ## 插件安装 > [!IMPORTANT] From 937186437916efcef1f7dc75f253d4cb47fde52e Mon Sep 17 00:00:00 2001 From: Jinnrry Date: Sat, 13 Apr 2024 09:45:32 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=8C=87=E5=AE=9Ago?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 320e6df..928f1cb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v4.1.0 with: + go-version: '1.22' check-latest: true - name: Gen output name run: | @@ -79,4 +80,4 @@ jobs: repo_token: ${{ secrets.GITHUB_TOKEN }} file: server/${{ env.ZIPNAME }}.zip tag: ${{ github.ref }} - file_glob: true \ No newline at end of file + file_glob: true From da919571c6d3828b18b0279be5bef657ad78eb6d Mon Sep 17 00:00:00 2001 From: jinnrry Date: Mon, 15 Apr 2024 10:23:26 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/models/base.go | 26 ++++++++++++++++++++++++++ server/res_init/init.go | 25 +------------------------ server/services/setup/db.go | 1 + 3 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 server/models/base.go diff --git a/server/models/base.go b/server/models/base.go new file mode 100644 index 0000000..99328ed --- /dev/null +++ b/server/models/base.go @@ -0,0 +1,26 @@ +package models + +import "pmail/db" + +func SyncTables() { + err := db.Instance.Sync2(&User{}) + if err != nil { + panic(err) + } + err = db.Instance.Sync2(&Email{}) + if err != nil { + panic(err) + } + err = db.Instance.Sync2(&Group{}) + if err != nil { + panic(err) + } + err = db.Instance.Sync2(&Rule{}) + if err != nil { + panic(err) + } + err = db.Instance.Sync2(&UserAuth{}) + if err != nil { + panic(err) + } +} diff --git a/server/res_init/init.go b/server/res_init/init.go index 0d99b6e..2358b6b 100644 --- a/server/res_init/init.go +++ b/server/res_init/init.go @@ -38,7 +38,7 @@ func Init(serverVersion string) { if err != nil { panic(err) } - syncTables() + models.SyncTables() session.Init() hooks.Init(serverVersion) // smtp server start @@ -86,26 +86,3 @@ func dirInit() { } } } - -func syncTables() { - err := db.Instance.Sync2(&models.User{}) - if err != nil { - panic(err) - } - err = db.Instance.Sync2(&models.Email{}) - if err != nil { - panic(err) - } - err = db.Instance.Sync2(&models.Group{}) - if err != nil { - panic(err) - } - err = db.Instance.Sync2(&models.Rule{}) - if err != nil { - panic(err) - } - err = db.Instance.Sync2(&models.UserAuth{}) - if err != nil { - panic(err) - } -} diff --git a/server/services/setup/db.go b/server/services/setup/db.go index d327bcc..90b6735 100644 --- a/server/services/setup/db.go +++ b/server/services/setup/db.go @@ -85,6 +85,7 @@ func SetDatabaseSettings(ctx *context.Context, dbType, dbDSN string) error { if err != nil { return errors.Wrap(err) } + models.SyncTables() return nil } From ce393211cfef796718235b80ad005e4e89ca11b5 Mon Sep 17 00:00:00 2001 From: jinnrry Date: Mon, 15 Apr 2024 11:48:29 +0800 Subject: [PATCH 5/7] add acme log --- server/controllers/setup.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/controllers/setup.go b/server/controllers/setup.go index 88802a4..c955a0d 100644 --- a/server/controllers/setup.go +++ b/server/controllers/setup.go @@ -21,6 +21,7 @@ func AcmeChallenge(w http.ResponseWriter, r *http.Request) { if exist { w.Write([]byte(auth.KeyAuth)) } else { + log.Errorf("AcmeChallenge Error Token Infos:%+v", instance.AuthInfo) http.NotFound(w, r) } } From 6ecb61ac4528e900b04729688c6aa1f1ceeb9732 Mon Sep 17 00:00:00 2001 From: jinnrry Date: Mon, 15 Apr 2024 15:09:09 +0800 Subject: [PATCH 6/7] bug fix --- server/models/base.go | 4 ++++ server/models/session.go | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 server/models/session.go diff --git a/server/models/base.go b/server/models/base.go index 99328ed..b25e340 100644 --- a/server/models/base.go +++ b/server/models/base.go @@ -23,4 +23,8 @@ func SyncTables() { if err != nil { panic(err) } + err = db.Instance.Sync2(&Sessions{}) + if err != nil { + panic(err) + } } diff --git a/server/models/session.go b/server/models/session.go new file mode 100644 index 0000000..a16b362 --- /dev/null +++ b/server/models/session.go @@ -0,0 +1,11 @@ +package models + +type Sessions struct { + Token string `xorm:"token char(43) not null pk " json:"token"` + Data string `xorm:"data blob" json:"data"` + Expiry int `xorm:"expiry timestamp index" json:"expiry"` +} + +func (p *Sessions) TableName() string { + return "sessions" +} From 6280264435f84df4ea3f00dfc720dc70cbdf5a99 Mon Sep 17 00:00:00 2001 From: Jinnrry Date: Sat, 20 Apr 2024 09:13:53 +0800 Subject: [PATCH 7/7] bug fix (#106) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复并非写map造成的panic Co-authored-by: jinnrry --- server/controllers/email/send.go | 6 +----- server/hooks/base.go | 15 ++------------- server/hooks/framework/framework.go | 10 +++++----- server/models/email.go | 2 +- server/smtp_server/read_content.go | 19 +++---------------- server/utils/send/send.go | 18 +++++++++++------- 6 files changed, 23 insertions(+), 47 deletions(-) diff --git a/server/controllers/email/send.go b/server/controllers/email/send.go index 1e5073b..417e7fa 100644 --- a/server/controllers/email/send.go +++ b/server/controllers/email/send.go @@ -130,16 +130,12 @@ func Send(ctx *context.Context, w http.ResponseWriter, req *http.Request) { } log.WithContext(ctx).Debugf("插件执行--SendBefore") - as := async.New(ctx) for _, hook := range hooks.HookList { if hook == nil { continue } - as.WaitProcess(func(hk any) { - hk.(framework.EmailHook).SendBefore(ctx, e) - }, hook) + hook.SendBefore(ctx, e) } - as.Wait() log.WithContext(ctx).Debugf("插件执行--SendBefore End") // 邮件落库 diff --git a/server/hooks/base.go b/server/hooks/base.go index 89c209f..c52b218 100644 --- a/server/hooks/base.go +++ b/server/hooks/base.go @@ -35,17 +35,12 @@ func (h *HookSender) ReceiveSaveAfter(ctx *context.Context, email *parsemail.Ema } body, _ := json.Marshal(dto) - ret, err := h.httpc.Post("http://plugin/ReceiveSaveAfter", "application/json", strings.NewReader(string(body))) + _, err := h.httpc.Post("http://plugin/ReceiveSaveAfter", "application/json", strings.NewReader(string(body))) if err != nil { log.WithContext(ctx).Errorf("[%s] Error! %v", h.name, err) return } - body, _ = io.ReadAll(ret.Body) - json.Unmarshal(body, &dto) - - ctx = dto.Ctx - email = dto.Email log.WithContext(ctx).Debugf("[%s]Plugin ReceiveSaveAfter End", h.name) } @@ -82,18 +77,12 @@ func (h *HookSender) SendAfter(ctx *context.Context, email *parsemail.Email, err } body, _ := json.Marshal(dto) - ret, errL := h.httpc.Post("http://plugin/SendAfter", "application/json", strings.NewReader(string(body))) + _, errL := h.httpc.Post("http://plugin/SendAfter", "application/json", strings.NewReader(string(body))) if errL != nil { log.WithContext(ctx).Errorf("[%s] Error! %v", h.name, errL) return } - body, _ = io.ReadAll(ret.Body) - json.Unmarshal(body, &dto) - - ctx = dto.Ctx - email = dto.Email - err = dto.ErrMap log.WithContext(ctx).Debugf("[%s]Plugin SendAfter End", h.name) } diff --git a/server/hooks/framework/framework.go b/server/hooks/framework/framework.go index 1f5ab2c..59fde8e 100644 --- a/server/hooks/framework/framework.go +++ b/server/hooks/framework/framework.go @@ -16,15 +16,15 @@ import ( ) type EmailHook interface { - // SendBefore 邮件发送前的数据 + // SendBefore 邮件发送前的数据 同步执行 SendBefore(ctx *context.Context, email *parsemail.Email) - // SendAfter 邮件发送后的数据,err是每个收信服务器的错误信息 + // SendAfter 邮件发送后的数据,err是每个收信服务器的错误信息 异步执行 SendAfter(ctx *context.Context, email *parsemail.Email, err map[string]error) - // ReceiveParseBefore 接收到邮件,解析之前的原始数据 + // ReceiveParseBefore 接收到邮件,解析之前的原始数据 同步执行 ReceiveParseBefore(ctx *context.Context, email *[]byte) - // ReceiveParseAfter 接收到邮件,解析之后的结构化数据 (收信规则前,写数据库前执行) + // ReceiveParseAfter 接收到邮件,解析之后的结构化数据 (收信规则前,写数据库前执行) 同步执行 ReceiveParseAfter(ctx *context.Context, email *parsemail.Email) - // ReceiveSaveAfter 邮件落库以后执行(收信规则后执行) + // ReceiveSaveAfter 邮件落库以后执行(收信规则后执行) 异步执行 ReceiveSaveAfter(ctx *context.Context, email *parsemail.Email) } diff --git a/server/models/email.go b/server/models/email.go index b8ed539..f7ce5c2 100644 --- a/server/models/email.go +++ b/server/models/email.go @@ -8,7 +8,7 @@ import ( ) type Email struct { - Id int `xorm:"id pk unsigned int autoincr notnull" json:"id"` + Id int `xorm:"id pk unsigned int autoincr notnull default(0)" json:"id"` Type int8 `xorm:"type tinyint(4) notnull default(0) comment('邮件类型,0:收到的邮件,1:发送的邮件')" json:"type"` GroupId int `xorm:"group_id int notnull default(0) comment('分组id')'" json:"group_id"` Subject string `xorm:"subject varchar(1000) notnull default('') comment('邮件标题')" json:"subject"` diff --git a/server/smtp_server/read_content.go b/server/smtp_server/read_content.go index cfb3589..bafcdcb 100644 --- a/server/smtp_server/read_content.go +++ b/server/smtp_server/read_content.go @@ -36,16 +36,12 @@ func (s *Session) Data(r io.Reader) error { return err } log.WithContext(ctx).Debugf("开始执行插件ReceiveParseBefore!") - as1 := async.New(ctx) for _, hook := range hooks.HookList { if hook == nil { continue } - as1.WaitProcess(func(hk any) { - hk.(framework.EmailHook).ReceiveParseBefore(ctx, &emailData) - }, hook) + hook.ReceiveParseBefore(ctx, &emailData) } - as1.Wait() log.WithContext(ctx).Debugf("开始执行插件ReceiveParseBefore End!") log.WithContext(ctx).Infof("邮件原始内容: %s", emailData) @@ -67,18 +63,13 @@ func (s *Session) Data(r io.Reader) error { // 判断是收信还是转发,只要是登陆了,都当成转发处理 //account, domain := email.From.GetDomainAccount() if s.Ctx.UserID > 0 { - log.WithContext(ctx).Debugf("开始执行插件SendBefore!") - as2 := async.New(ctx) for _, hook := range hooks.HookList { if hook == nil { continue } - as2.WaitProcess(func(hk any) { - hk.(framework.EmailHook).SendBefore(ctx, email) - }, hook) + hook.SendBefore(ctx, email) } - as2.Wait() log.WithContext(ctx).Debugf("开始执行插件SendBefore!End") if email == nil { @@ -136,16 +127,12 @@ func (s *Session) Data(r io.Reader) error { SPFStatus = spfCheck(s.RemoteAddress.String(), email.Sender, email.Sender.EmailAddress) log.WithContext(ctx).Debugf("开始执行插件ReceiveParseAfter!") - as2 := async.New(ctx) for _, hook := range hooks.HookList { if hook == nil { continue } - as2.WaitProcess(func(hk any) { - hk.(framework.EmailHook).ReceiveParseAfter(ctx, email) - }, hook) + hook.ReceiveParseAfter(ctx, email) } - as2.Wait() log.WithContext(ctx).Debugf("开始执行插件ReceiveParseAfter!End") if email == nil { diff --git a/server/utils/send/send.go b/server/utils/send/send.go index 14e1d7b..31c543c 100644 --- a/server/utils/send/send.go +++ b/server/utils/send/send.go @@ -12,6 +12,7 @@ import ( "pmail/utils/context" "pmail/utils/smtp" "strings" + "sync" ) type mxDomain struct { @@ -59,8 +60,6 @@ func Forward(ctx *context.Context, e *parsemail.Email, forwardAddress string) er var errEmailAddress []string - errMap := map[string]error{} - as := async.New(ctx) for domain, tos := range toByDomain { domain := domain @@ -96,7 +95,6 @@ func Forward(ctx *context.Context, e *parsemail.Email, forwardAddress string) er errEmailAddress = append(errEmailAddress, user.EmailAddress) } } - errMap[domain.domain] = err }, nil) } as.Wait() @@ -145,7 +143,7 @@ func Send(ctx *context.Context, e *parsemail.Email) (error, map[string]error) { var errEmailAddress []string - errMap := map[string]error{} + errMap := sync.Map{} as := async.New(ctx) for domain, tos := range toByDomain { @@ -183,15 +181,21 @@ func Send(ctx *context.Context, e *parsemail.Email) (error, map[string]error) { errEmailAddress = append(errEmailAddress, user.EmailAddress) } } - errMap[domain.domain] = err + errMap.Store(domain.domain, err) }, nil) } as.Wait() + orgMap := map[string]error{} + errMap.Range(func(key, value any) bool { + orgMap[key.(string)] = value.(error) + return true + }) + if len(errEmailAddress) > 0 { - return errors.New("以下收件人投递失败:" + array.Join(errEmailAddress, ",")), errMap + return errors.New("以下收件人投递失败:" + array.Join(errEmailAddress, ",")), orgMap } - return nil, errMap + return nil, orgMap }