feat(imapx): message dedup key (Message-ID + header fallback)
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
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, ",")
|
||||
}
|
||||
Reference in New Issue
Block a user