GO编译成DLL实现的
[Golang] 纯文本查看 复制代码 package main
/*
#include <stdlib.h>
*/
import "C"
import (
"bufio"
"bytes"
"encoding/json"
"mime"
"strconv"
"strings"
"unsafe"
"github.com/emersion/go-imap"
"github.com/emersion/go-message/charset"
)
// ================= 解析核心 =================
func fetchToJSON(raw string) (string, error) {
raw += "\r\n"
r := imap.NewReader(bufio.NewReader(bytes.NewReader([]byte(raw))))
resp, err := imap.ReadResp(r)
if err != nil {
return "", err
}
d := resp.(*imap.DataResp)
seq, _ := strconv.Atoi(d.Fields[0].(string))
items := d.Fields[2].([]interface{})
msg := imap.NewMessage(uint32(seq), nil)
if err := msg.Parse(items); err != nil {
return "", err
}
wd := mime.WordDecoder{CharsetReader: charset.Reader}
decode := func(s string) string {
if v, err := wd.DecodeHeader(s); err == nil {
return v
}
return s
}
msg.Envelope.Subject = decode(msg.Envelope.Subject)
for _, lst := range [][]*imap.Address{
msg.Envelope.From, msg.Envelope.To, msg.Envelope.Cc,
msg.Envelope.Bcc, msg.Envelope.Sender, msg.Envelope.ReplyTo,
} {
for _, a := range lst {
a.PersonalName = decode(a.PersonalName)
}
}
type wrapper struct {
*imap.Message
Body any `json:"Body,omitempty"`
}
b, err := json.Marshal(wrapper{Message: msg, Body: nil})
if err != nil {
return "", err
}
return string(b), nil
}
//================ C 导出接口 ================
//export freePointer
func freePointer(ptr unsafe.Pointer) {
C.free(ptr)
}
//export ParseFetchToJSON
func ParseFetchToJSON(outPtr *unsafe.Pointer, cLine *C.char) *C.char {
line := C.GoString(cLine)
j, err := fetchToJSON(line)
if err != nil {
j = `{"error":"` + strings.ReplaceAll(err.Error(), `"`, `\"`) + `"}` // 简单包错
}
cstr := C.CString(j)
// 把 malloc 得到的地址返给调用者保存,便于后续 freePointer
*outPtr = unsafe.Pointer(cstr)
return cstr
}
func main() {
}
易语言Demo
imapJSON.zip
(1.7 MB, 下载次数: 3, 售价: 5 枚 精币)
|