dependabot[bot] e9bc7cd0d6 build(deps): Bump the minor-and-patch group across 1 directory with 15 updates
Bumps the minor-and-patch group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [doctrine/doctrine-bundle](https://github.com/doctrine/DoctrineBundle) | `3.3.1` | `3.3.2` |
| [doctrine/doctrine-migrations-bundle](https://github.com/doctrine/DoctrineMigrationsBundle) | `4.0.0` | `4.0.1` |
| [doctrine/orm](https://github.com/doctrine/orm) | `3.6.8` | `3.7.0` |
| [knplabs/knp-paginator-bundle](https://github.com/KnpLabs/KnpPaginatorBundle) | `6.10.0` | `6.11.0` |
| [symfony/form](https://github.com/symfony/form) | `8.1.5` | `8.1.6` |
| [symfony/monolog-bundle](https://github.com/symfony/monolog-bundle) | `4.0.2` | `4.1.0` |
| [symfony/security-bundle](https://github.com/symfony/security-bundle) | `8.1.2` | `8.1.7` |
| [symfony/twig-bundle](https://github.com/symfony/twig-bundle) | `8.1.2` | `8.1.7` |
| [symfony/web-profiler-bundle](https://github.com/symfony/web-profiler-bundle) | `8.1.5` | `8.1.7` |



Updates `doctrine/doctrine-bundle` from 3.3.1 to 3.3.2
- [Release notes](https://github.com/doctrine/DoctrineBundle/releases)
- [Commits](https://github.com/doctrine/DoctrineBundle/compare/3.3.1...3.3.2)

Updates `doctrine/doctrine-migrations-bundle` from 4.0.0 to 4.0.1
- [Release notes](https://github.com/doctrine/DoctrineMigrationsBundle/releases)
- [Commits](https://github.com/doctrine/DoctrineMigrationsBundle/compare/4.0.0...4.0.1)

Updates `doctrine/orm` from 3.6.8 to 3.7.0
- [Release notes](https://github.com/doctrine/orm/releases)
- [Commits](https://github.com/doctrine/orm/compare/3.6.8...3.7.0)

Updates `knplabs/knp-paginator-bundle` from 6.10.0 to 6.11.0
- [Release notes](https://github.com/KnpLabs/KnpPaginatorBundle/releases)
- [Commits](https://github.com/KnpLabs/KnpPaginatorBundle/compare/v6.10.0...v6.11.0)

Updates `symfony/console` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/console/releases)
- [Changelog](https://github.com/symfony/console/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/console/compare/v8.1.5...v8.1.7)

Updates `symfony/form` from 8.1.5 to 8.1.6
- [Release notes](https://github.com/symfony/form/releases)
- [Changelog](https://github.com/symfony/form/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/form/compare/v8.1.5...v8.1.6)

Updates `symfony/framework-bundle` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/framework-bundle/releases)
- [Changelog](https://github.com/symfony/framework-bundle/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/framework-bundle/compare/v8.1.5...v8.1.7)

Updates `symfony/mime` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/mime/releases)
- [Changelog](https://github.com/symfony/mime/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/mime/compare/v8.1.5...v8.1.7)

Updates `symfony/monolog-bundle` from 4.0.2 to 4.1.0
- [Release notes](https://github.com/symfony/monolog-bundle/releases)
- [Changelog](https://github.com/symfony/monolog-bundle/blob/4.x/CHANGELOG.md)
- [Commits](https://github.com/symfony/monolog-bundle/compare/v4.0.2...v4.1.0)

Updates `symfony/process` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/process/releases)
- [Changelog](https://github.com/symfony/process/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/process/compare/v8.1.5...v8.1.7)

Updates `symfony/property-info` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/property-info/releases)
- [Changelog](https://github.com/symfony/property-info/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/property-info/compare/v8.1.5...v8.1.7)

Updates `symfony/security-bundle` from 8.1.2 to 8.1.7
- [Release notes](https://github.com/symfony/security-bundle/releases)
- [Changelog](https://github.com/symfony/security-bundle/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/security-bundle/compare/v8.1.2...v8.1.7)

Updates `symfony/string` from 8.1.2 to 8.1.7
- [Release notes](https://github.com/symfony/string/releases)
- [Changelog](https://github.com/symfony/string/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/string/compare/v8.1.2...v8.1.7)

Updates `symfony/twig-bundle` from 8.1.2 to 8.1.7
- [Release notes](https://github.com/symfony/twig-bundle/releases)
- [Changelog](https://github.com/symfony/twig-bundle/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/twig-bundle/compare/v8.1.2...v8.1.7)

Updates `symfony/web-profiler-bundle` from 8.1.5 to 8.1.7
- [Release notes](https://github.com/symfony/web-profiler-bundle/releases)
- [Changelog](https://github.com/symfony/web-profiler-bundle/blob/8.2/CHANGELOG.md)
- [Commits](https://github.com/symfony/web-profiler-bundle/compare/v8.1.5...v8.1.7)

---
updated-dependencies:
- dependency-name: doctrine/doctrine-bundle
  dependency-version: 3.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: doctrine/doctrine-migrations-bundle
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: doctrine/orm
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: knplabs/knp-paginator-bundle
  dependency-version: 6.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: symfony/console
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/form
  dependency-version: 8.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/framework-bundle
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/mime
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/monolog-bundle
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: symfony/process
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/property-info
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/security-bundle
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/string
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/twig-bundle
  dependency-version: 8.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: symfony/web-profiler-bundle
  dependency-version: 8.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-15 17:37:15 +02:00
2026-07-28 12:33:46 +02:00
…
2026-07-21 16:18:46 +02:00
2026-07-31 15:45:26 +02:00
2026-07-28 12:33:46 +02:00
2026-09-15 15:52:06 +02:00
2026-07-31 12:28:04 +02:00
2026-07-30 16:40:31 +02:00
2026-07-28 15:44:19 +02:00

plMail

Self-hosted mail with a calendar beside it. Connect the mailboxes you already have — IMAP, Gmail, Outlook — and read them side by side in one inbox, on a server you own.

PHP Symfony PostgreSQL License

📖 Read the handbook →

Installing on Docker, Linux, WSL2, macOS or a NAS · every feature in detail · connecting Gmail and Outlook, with the exact permissions to tick · how the internals work. Also on the wiki and in docs/ — all three are built from the same files.


What it is

A mail client you host yourself. It connects to the mailboxes you already have — IMAP, Gmail, Outlook — syncs them into your own PostgreSQL database, and gives them one inbox, one search box and one set of labels in the browser.

It is not a mail server: it doesn't receive mail from the internet or host your domain. Because everything is synced locally, search runs against your database, and your mail stays readable when a provider doesn't.

The plMail inbox

Highlights

  • Every account in one place — IMAP, Gmail and Outlook side by side, sending aliases included. Credentials are encrypted before they touch the database.
  • New mail arrives on its own — IMAP IDLE, Gmail and Outlook push, browser notifications.
  • Search that means it — full text plus from:, subject:, label:, has:, before: and friends, completed as you type.
  • Filters as a tree — any/all/none, nested, restated in plain English and counted against real mail before you save. Apply one to mail that arrived before it existed.
  • Filed where you drop it — drag a conversation onto a folder, a label or one of the inbox tabs, several at once if they are ticked. A folder moves it and a label just adds itself, so dropping on "Receipts" does not take the mail out of your inbox. Only the targets that will accept it light up, and a tab you choose by hand stays chosen when the next message in the thread arrives.
  • A calendar beside the mail — two-way sync with Google, Microsoft and CalDAV, a drag-to-move week grid that pans rather than squeezes on a phone, invitations answered in place, share and booking links.
  • Files where you keep them — attach from and save to Drive, Photos, OneDrive, Dropbox, Nextcloud, Immich and Paperless-ngx.
  • A language model, if you want one — point plMail at an Ollama box on your own network and it can search by meaning, draft replies, summarise a thread and sort mail into tabs. A long thread is summarised from as much of it as fits, and says so; ask for the whole conversation and it runs as a job with a context window to match. What it has been told about how you write is editable in the composer, for one attempt at a time. Off by default, each of the four switched on separately, and nothing ever leaves your network.
  • You decide what sorts your mail — header rules that answer the same way every time, or the model reading each message; and on Gmail, whether either of them is allowed to disagree with Google. Change your mind and the mailbox re-sorts itself in the background. Every message's Details panel shows what all three said and which one won, and a Report button tells your administrator when it got it wrong.
  • It tells you when something breaks — a sign-in that has expired, a calendar that stopped syncing, push that lapsed, work the queue gave up on. Each with what it means for your mail and the smallest thing that fixes it. A Google sign-in dying every week gets named for what it is — Google expires tokens for an app still in Testing — and warned about before the next one.
  • Yours — two-factor auth, per-app JMAP passwords, 41 themes, English, German and Pirate.

A look around

Reading a thread Writing a message
Threads — replies collapse into one conversation. Compose — rich text, autocomplete, undo send.
Dark mode Calendar
Themes — 41 of them, light and dark. Calendar — docked beside the mail, or its own page.
Filters Admin
Filters — counted before you save. Admin — workers, push health, logs, queue.

Screenshots use demo data — none of the accounts, senders or messages shown are real.

Install

Images are published for linux/amd64 and linux/arm64. Nothing to fill in first: the secrets are generated on first start, and the public address is asked for on the setup screen.

Docker

git clone https://github.com/karatektus/pl_mail.git
cd pl_mail
docker compose up -d

Open https://localhost and create your account.

TrueNAS SCALE

  1. Create a dataset for plMail — say yourPool/yourDataSet/plmail.
  2. Open truenas.compose.yaml and change one line to that path:
    path_data: &path_data /mnt/yourPool/yourDataSet/plmail
    
  3. Apps → Discover → ⋮ → Install via YAML, paste the file, install.

Reach it on port 30080 and put a reverse proxy in front of it. Everything else in that file works as it is; each setting explains itself in place.

Then

Add an IMAP mailbox in Settings → Mail accounts and you're done. Gmail and Outlook need OAuth credentials from Google or Microsoft first — the handbook walks through both, including the optional Pub/Sub topic for instant Gmail delivery.

Back up two things, separately: the PostgreSQL data and var/secrets/generated.env. The database holds your mail; the key inside that file unlocks the credentials in it. Keeping them apart is the point — and losing the key means the stored mailbox passwords are gone.

Contributing

Bug reports and pull requests welcome — see CONTRIBUTING.md for the dev setup, the test suites and the console commands.

License

AGPL-3.0.

S
Description
Upstream source mirror for plMail webmail client
Readme AGPL-3.0
48 MiB
0 Stars 1 Watchers 0 Forks
Languages
PHP 69.1%
JavaScript 12.9%
Twig 9.9%
TypeScript 6.7%
CSS 1.2%
Other 0.1%