Skip to content

插件开发说明

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文件中添加链接指向你的插件仓库