gecka / ident-switch
This plugin allows users to switch between different accounts (including remote) in single Roundcube session.
Package info
github.com/Gecka-Apps/roundcube-ident_switch
Type:roundcube-plugin
pkg:composer/gecka/ident-switch
Requires
- php: >=8.2
- ext-ctype: *
- roundcube/plugin-installer: >=0.3.0
Requires (Dev)
Suggests
None
Provides
None
Conflicts
Replaces
None
README
Switch between multiple IMAP accounts within a single Roundcube session.
About
ident_switch is a Roundcube plugin that turns identities into full account shortcuts. Configure each identity with its own IMAP, SMTP and Sieve server, then switch between accounts with a single click from the toolbar dropdown. Aliases, notifications, and domain preconfig are all built in.
Originally created by Boris Gulay. This fork is a major rewrite by Gecka — modernized for PHP 8.2+, restructured codebase, and packed with new features: alias identities, Sieve support, background mail notifications, domain preconfig, connection testing, and per-protocol security.
Features
Multi-Account Switching
- One-click account switching from a toolbar dropdown
- Each identity can be linked to a separate IMAP/SMTP server with its own credentials
- Automatic special folder mapping (Sent, Drafts, Junk, Trash) per account
- Encrypted password storage in database
Alias Identities
- Link identities as aliases of any configured account (not just the primary)
- Aliases share the parent account's IMAP inbox, SMTP and Sieve configuration
- Compose "From" dropdown automatically filtered to show only the active account and its aliases
Sieve (ManageSieve) Support
- Per-account Sieve server configuration with independent host, port and credentials
- Three authentication modes: same as IMAP, none, or custom credentials
- Sieve section only appears when the
managesieveplugin is active
New Mail Notifications
- Background mail checking across all secondary accounts
- Unread count badge in the account switcher dropdown
- Per-account notification settings: favicon, sound, desktop notifications
- Optional round-robin mode to reduce IMAP connections with many accounts
- Integrates with Roundcube's
newmail_notifierplugin
Domain Preconfig
- Pre-fill server settings based on the identity's email domain
- Wildcard domain support (
*) for catch-all defaults - Lock preconfigured fields as read-only to prevent user changes
- Restrict account creation to preconfigured domains only (
preconfig_onlymode)
Security
- Per-protocol security selection: None, STARTTLS, or SSL/TLS (IMAP, SMTP, Sieve independently)
- Connection testing on save (IMAP, SMTP, Sieve) to catch misconfigurations early
- Passwords encrypted using Roundcube's built-in encryption
- Warning displayed when selecting unencrypted connections
Requirements
- PHP 8.2+
- Roundcube 1.6 or 1.7
- MySQL, PostgreSQL, or SQLite
Installation
With Composer (recommended)
Navigate to your Roundcube installation directory and run:
composer require gecka/ident-switch
The roundcube/plugin-installer will automatically place the plugin in the correct plugins/ directory, initialize the database schema, and offer to enable it.
Don't have Composer? See getcomposer.org for installation instructions.
Running as root on a VPS? Roundcube files are typically owned by
www-data. Run Composer as the web server user to avoid permission issues:sudo -u www-data composer require gecka/ident-switch
Manual
-
Place this plugin folder into the plugins directory of Roundcube:
cd /path/to/roundcube/plugins/ git clone https://github.com/Gecka-Apps/roundcube-ident_switch.git ident_switch -
Add
ident_switchto$config['plugins']in your Roundcube config:$config['plugins'] = array('ident_switch', /* other plugins */);
-
Initialize the database schema:
bin/updatedb.sh --package=ident_switch --dir=plugins/ident_switch/SQL
Configuration
Copy the sample configuration file and edit it to match your environment:
cp plugins/ident_switch/config.inc.php.dist plugins/ident_switch/config.inc.php
Domain Preconfig
Pre-fill server settings per email domain so users don't have to enter them manually:
$config['ident_switch.preconfig'] = [ 'domain.tld' => [ 'imap_host' => 'ssl://mail.domain.tld:993', 'smtp_host' => 'tls://mail.domain.tld:587', 'sieve_host' => 'tls://mail.domain.tld:4190', 'user' => 'email', // 'email' = full address, 'mbox' = local part 'readonly' => true, // lock fields in UI ], '*' => [ // wildcard: default for unlisted domains 'imap_host' => 'ssl://mail.example.com:993', 'smtp_host' => 'tls://mail.example.com:587', 'user' => 'email', ], ];
Options
| Setting | Default | Description |
|---|---|---|
ident_switch.check_mail |
true |
Enable background mail checking across secondary accounts |
ident_switch.round_robin |
false |
Check one account per refresh cycle instead of all at once |
ident_switch.hide_notifier_warning |
false |
Hide the warning when newmail_notifier plugin is not active |
ident_switch.preconfig_only |
false |
Restrict account creation to preconfigured domains only |
ident_switch.debug |
false |
Log SMTP/Sieve routing and alias resolution to logs/ident_switch.log |
Usage
- Create a new identity in Settings > Identities
- Choose the account mode:
- Primary account — default identity, no server config needed
- Separate account — configure IMAP, SMTP, and optionally Sieve servers
- Alias of [account] — link to an existing account's servers
- For separate accounts, fill in server details (or let preconfig handle it)
- The account switcher dropdown appears in the toolbar once at least one separate account is configured
Updating
composer update gecka/ident-switch
Database migrations are applied automatically by the Roundcube plugin installer.
Migrating from the Original Plugin
If you are upgrading from boressoft/ident_switch, toteph42/identity_switch, or another fork:
Important: This version (5.x) requires a v4.x database schema as its starting point. If you are running v1.x–v3.x, you must first upgrade to v4.x (
boressoft/ident_switch) before migrating to this fork. This applies to all supported databases (MySQL, PostgreSQL, SQLite).
With Composer
- Replace the old package in
composer.jsonwithgecka/ident-switch - Run
SKIP_DB_INIT=1 composer update. Composer sees the fork as a brand-new package, so without that variable the plugin installer runs the initial schema script instead of the migrations and aborts on the existing v4 table ("table already exists"). - Run the database migration:
bin/updatedb.sh --package=ident_switch --dir=plugins/ident_switch/SQL
Manual
- Replace the plugin files in
plugins/ident_switch/ - Run the database migration:
bin/updatedb.sh --package=ident_switch --dir=plugins/ident_switch/SQL
Repairing a v4 table wrongly marked as migrated
Versions of this fork up to 5.0.x shipped a MySQL initial schema using CREATE TABLE IF NOT EXISTS: on an upgrade from v4 the table creation was silently skipped while the schema version was still recorded as current. updatedb.sh then reports nothing to do, saves fail silently, and the account switcher never shows up. The plugin now detects this and logs Plugin disabled: database schema is missing or outdated to logs/ident_switch; logs/errors.log on affected versions fills with Unknown column 'isw.notify_basic' errors.
To confirm and repair (MySQL shown, adapt the path for PostgreSQL/SQLite):
-- Empty result while system.ident_switch-version says 2026021000 confirms the problem SHOW COLUMNS FROM ident_switch LIKE 'parent_id'; -- The migration adds UNIQUE(iid); remove any duplicate iid rows first SELECT iid, COUNT(*) FROM ident_switch GROUP BY iid HAVING COUNT(*) > 1; -- Apply the migration manually (the recorded version prevents updatedb.sh from doing it) SOURCE plugins/ident_switch/SQL/mysql/2026021000.sql;
Configuration
If you use config.inc.php, update it to the new format — the 'host' key has been replaced by separate 'imap_host' and 'smtp_host' keys (old 'host' key still works as fallback).
Localization
Available in 7 languages: English, French, German, Italian, Dutch, Russian, Slovenian.
Version Compatibility
| Version | Roundcube | PHP |
|---|---|---|
| 5.x | 1.6 - 1.7 | 8.2+ |
| 4.x | 1.3 - 1.5 | 7.x - 8.1 |
| 1.x - 3.x | 1.1 - 1.3 | discontinued |
License
This plugin is released under the GNU Affero General Public License Version 3.
Original code by Boris Gulay licensed under GPL-3.0+. New contributions licensed under AGPL-3.0+.
Authors
- Boris Gulay — Original developer (2016–2022)
- Christian Landvogt — Special folders support
- Gergely Papp — Bug fixes
- Laurent Dinclaux — Current maintainer (Gecka)
Built with 🥥 and ☕ by Gecka — Kanaky-New Caledonia 🇳🇨