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, ",") }