refactor(mail): migrate files and conversation pages to layered architecture
- Add GET /mail/files page (FilesController, GetAttachedFilesUseCase, File DTOs); drop legacy includes/files.php and the ?act=files flow
- Add GET /mail/write/{id} conversation view (WriteController::conversation, GetConversationUseCase, message DTOs)
- Fix getConversation query semantics (delete/sys/spam filters, OR grouping) and eager-load recipient; add markAsReadByIds for marking received messages read
- Add MailFileService::formatSize
- Inject Tools/Bbcode via constructor instead of di('tools')/di('bbcode') in conversation use cases (fixes ServiceNotFoundException)
- Point conversation/contact/unblock links to clean URLs (profile, blocklist, legacy blocklist include)
- Add GET /mail/write/{id} conversation view (WriteController::conversation, GetConversationUseCase, message DTOs)
- Fix getConversation query semantics (delete/sys/spam filters, OR grouping) and eager-load recipient; add markAsReadByIds for marking received messages read
- Add MailFileService::formatSize
- Inject Tools/Bbcode via constructor instead of di('tools')/di('bbcode') in conversation use cases (fixes ServiceNotFoundException)
- Point conversation/contact/unblock links to clean URLs (profile, blocklist, legacy blocklist include)