插件开发说明
Jinnrry edited this page Mar 4, 2024
·
9 revisions
插件程序编译后为独立的可执行程序。PMail启动的时候将自动扫描plugins
目录中的全部文件,发现可执行文件后自动启动一个子进程运行插件程序。
(因此,部署时务必注意该文件夹的权限,任何放到该文件夹中的可执行文件,都会被执行。如果该文件夹暴露,将导致服务器安全无保障)
插件和主程序通过HTTP over Unix Domain Socket的方式进行通信。
一、创建一个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()
}
PMail代码仓库后续不再接受新插件代码的PR请求,请单独开仓库维护。如果开发了通用插件,可以提Issuse说明,我在PMail项目Readme文件中添加链接指向你的插件仓库