38 lines
794 B
Go
38 lines
794 B
Go
package imapx
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/emersion/go-imap/v2"
|
|
)
|
|
|
|
func MessageKey(env *imap.Envelope, size int64) string {
|
|
if env != nil && env.MessageID != "" {
|
|
return env.MessageID
|
|
}
|
|
var b strings.Builder
|
|
if env != nil {
|
|
b.WriteString(addrList(env.From))
|
|
b.WriteByte('|')
|
|
b.WriteString(addrList(env.To))
|
|
b.WriteByte('|')
|
|
b.WriteString(env.Subject)
|
|
b.WriteByte('|')
|
|
b.WriteString(env.Date.UTC().Format("2006-01-02T15:04:05Z"))
|
|
}
|
|
b.WriteByte('|')
|
|
fmt.Fprintf(&b, "%d", size)
|
|
sum := md5.Sum([]byte(b.String()))
|
|
return fmt.Sprintf("h:%x", sum)
|
|
}
|
|
|
|
func addrList(addrs []imap.Address) string {
|
|
parts := make([]string, 0, len(addrs))
|
|
for _, a := range addrs {
|
|
parts = append(parts, a.Mailbox+"@"+a.Host)
|
|
}
|
|
return strings.Join(parts, ",")
|
|
}
|