-
Notifications
You must be signed in to change notification settings - Fork 229
插件开发说明
Jinnrry edited this page Mar 4, 2024
·
12 revisions
插件程序编译后为独立的可执行程序。PMail启动的时候将自动扫描plugins目录中的全部文件,发现可执行文件后自动启动一个子进程运行插件程序。
插件和主程序通过Unix Domain Socket Over Http的方式进行通信。
一、创建一个Golang项目,使用go mod管理依赖
二、编辑go.mod文件,添加replace pmail lastest => github.com/Jinnrry/pmail/server lastest
三、新建一个结构体,该结构体实现EmailHook接口
四、创建一个主函数,在主函数中注册插件并运行framework.CreatePlugin(NewDemoHook()).Run()
完整Demo
package main
import (
"encoding/json"
"os"
"pmail/dto/parsemail"
"pmail/hooks/framework"
"pmail/utils/context"
)
type DemoPlugin struct {
conf *Config
}
// 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) {
}
// 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()
}