From ed50cef3cf806c09762e75cf10fb022ce19d3a1b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 3 Dec 2019 11:36:53 +0100 Subject: Linkify message part tree --- imap.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) (limited to 'imap.go') diff --git a/imap.go b/imap.go index 93eede3..18220b5 100644 --- a/imap.go +++ b/imap.go @@ -137,6 +137,52 @@ func (msg *imapMessage) TextPartName() string { return strings.Join(l, ".") } +type IMAPPartNode struct { + Path []int + MIMEType string + Children []IMAPPartNode +} + +func (node *IMAPPartNode) PathString() string { + l := make([]string, len(node.Path)) + for i, partNum := range node.Path { + l[i] = strconv.Itoa(partNum) + } + + return strings.Join(l, ".") +} + +func imapPartTree(bs *imap.BodyStructure, path []int) *IMAPPartNode { + if !strings.EqualFold(bs.MIMEType, "multipart") && len(path) == 0 { + path = []int{1} + } + + node := &IMAPPartNode{ + Path: path, + MIMEType: strings.ToLower(bs.MIMEType + "/" + bs.MIMESubType), + Children: make([]IMAPPartNode, len(bs.Parts)), + } + + for i, part := range bs.Parts { + num := i + 1 + + partPath := append([]int(nil), path...) + partPath = append(partPath, num) + + node.Children[i] = *imapPartTree(part, partPath) + } + + return node +} + +func (msg *imapMessage) PartTree() *IMAPPartNode { + if msg.BodyStructure == nil { + return nil + } + + return imapPartTree(msg.BodyStructure, nil) +} + func listMessages(conn *imapclient.Client, mboxName string) ([]imapMessage, error) { if err := ensureMailboxSelected(conn, mboxName); err != nil { return nil, err @@ -179,9 +225,7 @@ func listMessages(conn *imapclient.Client, mboxName string) ([]imapMessage, erro return msgs, nil } -var _ = message.Read - -func getMessage(conn *imapclient.Client, mboxName string, uid uint32, partPath []int) (*imap.Message, string, error) { +func getMessage(conn *imapclient.Client, mboxName string, uid uint32, partPath []int) (*imapMessage, string, error) { if err := ensureMailboxSelected(conn, mboxName); err != nil { return nil, "", err } @@ -232,5 +276,5 @@ func getMessage(conn *imapclient.Client, mboxName string, uid uint32, partPath [ return nil, "", err } - return msg, string(b), nil + return &imapMessage{msg}, string(b), nil } -- cgit v1.2.3