Clone
0
插件开发说明
Jinnrry edited this page 2024-07-27 22:09:58 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

插件架构

运行方式

插件程序编译后为独立的可执行程序。PMail启动的时候将自动扫描plugins目录中的全部文件,发现可执行文件后自动启动一个子进程运行插件程序。

(因此,部署时务必注意该文件夹的权限,任何放到该文件夹中的可执行文件,都会被执行。如果该文件夹暴露,将导致服务器安全无保障)

通信方式

插件和主程序通过HTTP over Unix Domain Socket的方式进行通信。

插件开发

一、创建一个Golang项目使用go mod管理依赖

二、编辑go.mod文件

module spam

go 1.22.0

replace github.com/Jinnrry/pmail latest => github.com/Jinnrry/pmail/server latest

执行

go get github.com/Jinnrry/pmail

三、新建一个结构体,该结构体实现EmailHook接口

四、创建一个主函数,在主函数中注册插件并运行framework.CreatePlugin(NewDemoHook()).Run()

完整Demo

package main

import (
	"encoding/json"
	"github.com/Jinnrry/pmail/dto/parsemail"
	"github.com/Jinnrry/pmail/hooks/framework"
	"github.com/Jinnrry/pmail/models"
	"github.com/Jinnrry/pmail/utils/context"
	"os"
)

type DemoPlugin struct {
	conf *Config
}

// GetName 获取插件名称
func (w *DemoPlugin ) GetName(ctx *context.Context) string {
	return "DemoPlugin"
}

// SettingsHtml 返回插件设置页面的html
func (w *DemoPlugin ) SettingsHtml(ctx *context.Context, url string, requestData string) string {
	return fmt.Sprintf(`
<div>
	 DemoPlugin No Settings Page
</div>
`)
}


// SendBefore 邮件发送前调用
func (w *DemoPlugin) SendBefore(ctx *context.Context, email *parsemail.Email) {

}

// SendAfter 邮件发送后调用
func (w *DemoPlugin) SendAfter(ctx *context.Context, email *parsemail.Email, err map[string]error) {

}

// ReceiveParseBefore 收信解析前调用
func (w *DemoPlugin) ReceiveParseBefore(ctx *context.Context, email *[]byte) {

}

// ReceiveParseAfter 收信解析后调用
func (w *DemoPlugin) ReceiveParseAfter(ctx *context.Context, email *parsemail.Email) {

}

// ReceiveSaveAfter 邮件落库以后执行(收信规则后执行) 异步执行
func (w *DemoPlugin) ReceiveSaveAfter(ctx *context.Context, email *parsemail.Email, ue []*models.UserEmail) {

}

// Config Plugin Config
type Config struct {
}

// NewDemoHook 创建一个插件实例
func NewDemoHook() *DemoPlugin {
	var cfgData []byte
	// 加载配置文件
	var pluginConfig *Config
	if _, err := os.Stat("./plugins/demo_config.json"); err == nil {
		cfgData, err = os.ReadFile("./plugins/demo_config.json")
		if err != nil {
			panic(err)
		}
		err = json.Unmarshal(cfgData, &pluginConfig)
		if err != nil {
			panic(err)
		}

	}

	ret := &DemoPlugin{
		conf: pluginConfig,
	}
	return ret

}

func main() {
	framework.CreatePlugin("DemoPlugin", NewDemoHook()).Run()
}

其他说明

PMail代码仓库后续不再接受新插件代码的PR请求请单独开仓库维护。如果开发了通用插件可以提Issuse说明我在PMail项目Readme文件中添加链接指向你的插件仓库