plugins/base: use BodyStructure.Walk instead of custom logic
This commit is contained in:
parent
b325933a8b
commit
50046b62ac
1 changed files with 24 additions and 50 deletions
|
@ -107,66 +107,40 @@ type IMAPMessage struct {
|
||||||
*imap.Message
|
*imap.Message
|
||||||
}
|
}
|
||||||
|
|
||||||
func textPartPath(bs *imap.BodyStructure) ([]int, bool) {
|
|
||||||
if bs.Disposition != "" && !strings.EqualFold(bs.Disposition, "inline") {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.EqualFold(bs.MIMEType, "text") {
|
|
||||||
return []int{1}, true
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.EqualFold(bs.MIMEType, "multipart") {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
textPartNum := -1
|
|
||||||
for i, part := range bs.Parts {
|
|
||||||
num := i + 1
|
|
||||||
|
|
||||||
if strings.EqualFold(part.MIMEType, "multipart") {
|
|
||||||
if subpath, ok := textPartPath(part); ok {
|
|
||||||
return append([]int{num}, subpath...), true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !strings.EqualFold(part.MIMEType, "text") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var pick bool
|
|
||||||
switch strings.ToLower(part.MIMESubType) {
|
|
||||||
case "plain":
|
|
||||||
pick = true
|
|
||||||
case "html":
|
|
||||||
pick = textPartNum < 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if pick {
|
|
||||||
textPartNum = num
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if textPartNum > 0 {
|
|
||||||
return []int{textPartNum}, true
|
|
||||||
}
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msg *IMAPMessage) TextPartName() string {
|
func (msg *IMAPMessage) TextPartName() string {
|
||||||
if msg.BodyStructure == nil {
|
if msg.BodyStructure == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
path, ok := textPartPath(msg.BodyStructure)
|
var best []int
|
||||||
if !ok {
|
isTextPlain := false
|
||||||
|
msg.BodyStructure.Walk(func(path []int, part *imap.BodyStructure) bool {
|
||||||
|
if !strings.EqualFold(part.MIMEType, "text") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if part.Disposition != "" && !strings.EqualFold(part.Disposition, "inline") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
switch strings.ToLower(part.MIMESubType) {
|
||||||
|
case "plain":
|
||||||
|
isTextPlain = true
|
||||||
|
best = path
|
||||||
|
case "html":
|
||||||
|
if !isTextPlain {
|
||||||
|
best = path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
if best == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
l := make([]string, len(path))
|
l := make([]string, len(best))
|
||||||
for i, partNum := range path {
|
for i, partNum := range best {
|
||||||
l[i] = strconv.Itoa(partNum)
|
l[i] = strconv.Itoa(partNum)
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(l, ".")
|
return strings.Join(l, ".")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue