Guide
Everything you need to set up Mails Manager App and get the most out of your mailboxes.
Overview
Mails Manager App is a single-page dashboard for connecting multiple IMAP mailboxes and reading recent mail from one place. It was built as a portfolio project to demonstrate a small but production-shaped Django application — email-verified signup, encrypted credential storage, email-based two-factor authentication, and live IMAP access without caching message bodies on the server.
Current scope: only Mail.ru mailboxes are supported on this hosted instance.
The IMAP layer is provider-agnostic under the hood, but the documented setup and defaults in this guide are written for Mail.ru. Other providers (Gmail, Outlook, Yandex) may work with the right host and port but are not officially supported yet.
This is not a commercial service — it's a personal-use / portfolio project, open source on GitHub. Run your own copy if you want different limits or a different provider.
Getting started
Creating your portal account takes about a minute.
Adding your first Mail.ru account
Mail.ru is what we support today. Before you connect a mailbox, you need to let Mail.ru itself know that IMAP access is allowed for it.
On Mail.ru
In Mails Manager App
- Email address — your Mail.ru address.
- Password — the app password from Mail.ru, or your regular password if Mail.ru-side 2FA is off.
- IMAP host — imap.mail.ru.
- IMAP port — 993 (SSL).
- Group — optional label to organise mailboxes (e.g. work, signups).
Mail.ru aliases trick
One real Mail.ru registration can give you up to ten different addresses. Mail.ru calls these aliases: extra email addresses you create from inside one Mail.ru account, each of which is its own valid IMAP login. That's how you turn a single Mail.ru signup into ten connectable mailboxes in this portal.
Create the aliases on Mail.ru
Connect them here, in bulk
Instead of adding each alias one by one, use Accounts → Bulk add and paste a small CSV. One line per alias, four columns:
alias1@mail.ru,app-password,imap.mail.ru,993
alias2@inbox.ru,app-password,imap.mail.ru,993
alias3@list.ru,app-password,imap.mail.ru,993
Columns are email, password, IMAP host, IMAP port, in that order. Empty lines are ignored. After submitting, the portal shows which lines were added, skipped as duplicates, or blocked by the account cap.
Heads-up: each alias counts as one account against your portal cap.
Bulk add is currently a premium feature. If you're on the default tier you can still add aliases — just one at a time from the Accounts page.
Account limits
Each user on this hosted instance has a cap on how many IMAP accounts they can connect. The cap exists to keep the portfolio instance lightweight; it's not a paywall. Two ways to get a raised cap:
- Ask the admin to raise your cap on this instance.
- Self-host. The project is open source on GitHub — run your own copy with whatever cap you want. See Self-hosting for the setup steps.
Once you're signed in, the Limits page shows your current usage and the exact cap that applies to your account.
Two-factor authentication
Every new portal account has 2FA on by default. After your password, you enter a 6-digit one-time code that we send to your verified email address. Codes expire after a few minutes, and after several wrong attempts the code is invalidated and you'll need to request a new one.
You can toggle 2FA on or off from your Profile page. We strongly recommend keeping it on: this portal stores the IMAP passwords for every mailbox you've connected, so a stolen portal password without 2FA would expose every linked inbox.
Inbox & email actions
The Inbox view talks to your IMAP servers live — nothing is cached on our side. Each load fetches the latest messages straight from Mail.ru.
Filters
- Window — 1 day, 7 days, or 30 days back.
- Folder — Inbox, Sent, Spam, or All.
- Account — narrow to one connected mailbox.
- Group — narrow to mailboxes you've tagged with a group label (the optional field you set when adding an account).
Per-message actions
- Open — read the full body of the message.
- Mark unread — flip a read message back to unread on the server.
- Delete — move the message to Trash on the server. This is real deletion, not a portal-only hide.
Security & privacy
This portal holds the IMAP credentials and live mail of every connected mailbox, so security is treated as a first-class concern, not an afterthought. Here's what's actually in place.
Your credentials
- Portal password is hashed, never stored in plaintext. Django's default password hasher writes a salted PBKDF2-SHA256 digest (hundreds of thousands of iterations per password) to the database. At login we re-hash what you typed and compare against the stored digest; the original password is never written anywhere on the server.
- Password strength is enforced at signup. Django's standard validators reject too-short passwords, all-numeric passwords, passwords too similar to your email or username, and passwords on the well-known common-password list.
-
IMAP passwords are encrypted at rest. Stored as
Fernet ciphertext using
a
FIELD_ENCRYPTION_KEYthat is separate from Django'sSECRET_KEY. Passwords are never written to logs. - Message bodies are never persisted. The Inbox fetches them live from IMAP on every request; the server keeps no cache. Close the tab and the messages stay only on your Mail.ru side.
Hardening on every request
-
HTTPS everywhere in production.
SECURE_SSL_REDIRECTforces HTTPS, and HSTS is preloaded withincludeSubDomainsso browsers refuse to fall back to plain HTTP. - Secure, HttpOnly, SameSite=Lax cookies. Session and CSRF cookies can't be read by JavaScript or sent on cross-site requests in normal flows.
-
No clickjacking.
X-Frame-Options: DENYblocks every attempt to embed the portal in a frame, on every page. -
No MIME sniffing, minimal referrer leakage.
X-Content-Type-Options: nosniffandReferrer-Policy: same-originare set explicitly. - No HTML caching. A custom no-cache middleware tags every HTML response so logged-in pages don't sit in proxy or browser caches after you log out.
- Rate limiting on auth endpoints. Login, signup, OTP entry, OTP resend, and password reset all have per-user / per-IP budgets backed by Django's cache; abusive bursts get blocked.
For more depth, see the dedicated Security page.