精易论坛

标题: IMAP4rev1 FETCH TO JSON [打印本页]

作者: BigBoss007    时间: 前天 20:00
标题: IMAP4rev1 FETCH TO JSON

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 枚 精币)


作者: 艾玛克138    时间: 前天 20:28
谢谢大佬,很好很实用的教程。
作者: bianyuan456    时间: 前天 23:50
已经顶贴,感谢您对论坛的支持!
作者: malin158    时间: 昨天 00:58
感谢您对论坛的支持!
作者: 张升    时间: 昨天 05:39


感谢分享,很给力!~
作者: 一指温柔    时间: 昨天 08:35
感谢分享
作者: pipicool    时间: 昨天 11:47
学习一下
作者: 沐白22    时间: 昨天 14:29
谢谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4