Previously, a random suffix was generated every time BuildBytes or
ForwardBuildBytes was called, causing IMAP/POP3 clients to treat the
same message as a new message on every sync and breaking conversation
threading.
Changes:
- Add msg_id column to the email table (synced automatically via Sync2)
- Generate a crypto/rand-based RFC-compliant Message-ID once at email
creation time (send.go for outgoing, read_content.go for incoming)
- Preserve the original Message-ID from externally received emails
- Load the persisted MsgID when rebuilding Email from DB records
- Use the stored MsgID in BuildBytes, ForwardBuildBytes and the IMAP
ENVELOPE response; fall back to the old numeric format for legacy rows
Fixes the MSGID_SHORT SpamAssassin penalty and Gmail rejection while
keeping Message-IDs stable across syncs.
Co-authored-by: root <root@Claw-ai.tail1478c.ts.net>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>