Chat & Mail
Every organization ends up juggling a chat app, a mail client, and whatever system runs the actual website or shop — three tools, three logins, and constant tab-switching just to get an answer to a colleague or a customer.
The pain it solves: Staff shouldn't have to leave the workspace they manage content, orders, and events in just to ask a coworker a quick question or check the inbox.
How it helps:
- Built-in team chat — one-to-one and group conversations live directly inside Backstage, with unread counts, conversation history, and file attachments, so staff never need a separate chat tool for day-to-day coordination.
- Group conversations with real management — group chats can be renamed, and members can be added, removed, or leave on their own, just like any modern chat app.
- Connect your own mailbox — staff can link their existing email account (via IMAP/SMTP) and read, organize, and reply to email without ever opening a separate mail client.
- Familiar mailbox experience — folders with unread/total counts, message lists, full message bodies, attachments, and the ability to mark messages read/unread or delete them, all inside the same workspace.
- Per-tenant configuration — each organization configures its own mailbox connection, so mail stays scoped to the right tenant and credentials never cross organizational boundaries.
The happy workday: A quick question to a colleague and a reply to a customer email both happen without ever leaving the page you're already working in.
Why This Matters for Your Organization
Reducing the number of tools staff must juggle isn't just convenience — it's fewer logins to manage, fewer places for a message to get lost, and less time spent context-switching. Chat and mail becoming part of the same workspace as content, CRM, and orders means every conversation happens right next to the data it's about.
Technical Details
Chat is implemented by ChatItemService (ExireNexus.Services/Services/ChatService.cs, plus partials ChatService.Groups.cs and ChatService.Messages.cs), backed by the Chat, ChatUser, and MessageItem models (ExireNexus.Shared/Models).
Key implementation points:
GetOrCreateOneToOneChatAsyncandCreateGroupChatAsynchandle chat creation/lookup, whileSendMessageAsync,MarkMessagesAsReadAsync, andGetTotalUnreadCountAsyncdrive the day-to-day messaging experience.- Group management —
RenameChatAsync,AddMemberAsync,RemoveMemberAsync,LeaveChatAsync— is enforced through the requesting user's membership, keeping group changes scoped to actual participants. GetConversationsAsyncandGetChatDetailsAsyncreturn DTOs (ConversationSummaryDto,ChatDetailsDto,MessageDto) tailored to the Backstage UI (ExireNexus.Backstage/Components/VisitorArea/Chat/ConversationList.razor,ConversationView.razor), keeping the service's persistence models separate from what's sent to the client.- Message attachments are handled through the existing
IFileService, reusing the platform's shared file-upload pipeline rather than a chat-specific one. - Real-time updates flow through
IChatEventNotifier, decoupling the service layer from the specific transport (e.g., SignalR) used to push new messages to connected clients.
Mail is implemented by ImapMailService (ExireNexus.Services/Services/ImapMailService.cs), using MailKit/MimeKit for IMAP (reading) and SMTP (sending), with MailConfigProvider (ExireNexus.Services/Services/MailConfigProvider.cs) resolving each tenant's effective mailbox settings.
Key implementation points:
IsConfiguredAsynclets the UI (ExireNexus.Backstage/Components/Editors/Mail/Mail.razor) detect whether a tenant has connected a mailbox before attempting to load folders or messages.GetFoldersAsyncandGetMessagesAsyncreturn lightweight summaries (MailboxFolder,MailMessageSummaryinExireNexus.Shared/Models/Email/MailInboxModels.cs) for fast list rendering, whileGetMessageAsyncloads the full body and attachment metadata only when a message is opened.- Attachments are fetched on demand via
GetAttachmentAsyncrather than downloaded up front, avoiding unnecessary bandwidth for messages with large attachments the user never opens. SendAsyncsends via SMTP and appends a copy to the Sent folder, matching the behavior users expect from a standard mail client.- Every operation opens a short-lived IMAP/SMTP connection using settings from
IMailConfigProvider, so credentials are always resolved per-tenant rather than cached globally — configuration lives inMailSettings.razor(ExireNexus.Backstage/Components/Editors/Settings).