-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
155 lines (138 loc) · 4.06 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package main
//插件模板
import (
"encoding/json"
"io"
"os"
"path"
"github.com/yaoapp/kun/grpc"
)
// 定义插件类型,包含grpc.Plugin
type EmailPlugin struct{ grpc.Plugin }
// 设置插件日志到单独的文件
func (plugin *EmailPlugin) setLogFile() {
var output io.Writer = os.Stdout
//开启日志
logroot := os.Getenv("GOU_TEST_PLG_LOG")
if logroot == "" {
logroot = "./logs"
}
if logroot != "" {
logfile, err := os.OpenFile(path.Join(logroot, "email.log"), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err == nil {
output = logfile
}
}
plugin.Plugin.SetLogger(output, grpc.Trace)
}
// 插件执行需要实现的方法
// 参数name是在调用插件时的方法名,比如调用插件demo的Hello方法是的规则是plugins.demo.Hello时。
//
// 注意:name会自动的变成小写
//
// args参数是一个数组,需要在插件中自行解析。判断它的长度与类型,再转入具体的go类型。
//
// Exec 插件入口函数
func (plugin *EmailPlugin) Exec(name string, args ...interface{}) (*grpc.Response, error) {
// plugin.Logger.Log(hclog.Trace, "plugin method called", name)
// plugin.Logger.Log(hclog.Trace, "args", args)
isOk := true
var v = map[string]interface{}{"code": 200, "message": "发送成功"}
var email Email
switch name {
case "send":
if len(args) < 1 {
v = map[string]interface{}{"code": 400, "message": "参数不足,需要一个参数"}
isOk = false
}
if isOk {
switch data := args[0].(type) {
case string:
err := json.Unmarshal([]byte(data), &email)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
case map[string]interface{}:
jsonData, err := json.Marshal(data)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
err = json.Unmarshal(jsonData, &email)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
default:
isOk = false
v = map[string]interface{}{"code": 400, "message": "传入参数类型错误,请传入json数据"}
}
if isOk {
// if email.Account.Type != "imap" {
errs := sendStmpEmails(email)
if len(errs) > 0 {
isOk = false
message := ""
for _, e := range errs {
message += e.Error() + "\n"
}
v = map[string]interface{}{"code": 400, "message": message}
}
}
}
case "receive":
if len(args) < 1 {
v = map[string]interface{}{"code": 400, "message": "参数不足,需要一个参数"}
isOk = false
}
if isOk {
// var account Account
switch data := args[0].(type) {
case string:
err := json.Unmarshal([]byte(data), &email)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
case map[string]interface{}:
jsonData, err := json.Marshal(data)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
err = json.Unmarshal(jsonData, &email)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
}
default:
isOk = false
v = map[string]interface{}{"code": 400, "message": "传入参数类型错误,请传入json数据"}
}
if isOk {
messages, err := receiveImapEmails(email)
if err != nil {
isOk = false
v = map[string]interface{}{"code": 400, "message": err.Error()}
} else {
v = map[string]interface{}{"code": 200, "emails": messages}
}
}
}
}
//输出前需要转换成字节
bytes, err := json.Marshal(v)
if err != nil {
return nil, err
}
//设置输出数据的类型
//支持的类型:map/interface/string/integer,int/float,double/array,slice
return &grpc.Response{Bytes: bytes, Type: "map"}, nil
}
// 生成插件时函数名修改成main
func main() {
plugin := &EmailPlugin{}
plugin.setLogFile()
grpc.Serve(plugin)
}