PHPackages                             texxarulez/mailman\_integration - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. texxarulez/mailman\_integration

ActiveRoundcube-plugin[Utility &amp; Helpers](/categories/utility)

texxarulez/mailman\_integration
===============================

Roundcube plugin for Mailman 3 list browsing and member actions

1.0.1(1mo ago)15GPL-3.0-or-laterPHPPHP &gt;=7.4

Since Apr 13Pushed 1w agoCompare

[ Source](https://github.com/texxasrulez/mailman_integration)[ Packagist](https://packagist.org/packages/texxarulez/mailman_integration)[ Docs](https://github.com/texxasrulez/mailman_integration)[ RSS](/packages/texxarulez-mailman-integration/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (3)Dependencies (1)Versions (3)Used By (0)

mailman\_integration
====================

[](#mailman_integration)

[![Downloads](https://camo.githubusercontent.com/527ca8f5d8ad2ce75f78863091f9c1fd792430d90a93e8f4930487d3af42d02e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e2f746f74616c3f7374796c653d706c6173746963266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d446f776e6c6f616473266c6162656c436f6c6f723d6171756126636f6c6f723d626c7565)](https://camo.githubusercontent.com/527ca8f5d8ad2ce75f78863091f9c1fd792430d90a93e8f4930487d3af42d02e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e2f746f74616c3f7374796c653d706c6173746963266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d446f776e6c6f616473266c6162656c436f6c6f723d6171756126636f6c6f723d626c7565)[![Packagist Downloads](https://camo.githubusercontent.com/044b45b1ec4aa8ba4b8a13789df2e7b5ab06e9171ab16563e65b47a38c415bcd/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d7061636b6167697374266c6f676f436f6c6f723d7768697465266c6162656c3d446f776e6c6f616473266c6162656c436f6c6f723d626c756526636f6c6f723d676f6c64)](https://packagist.org/packages/texxasrulez/mailman_integration)[![Packagist Version](https://camo.githubusercontent.com/6f76adfaf4a0e86468a156e6879c43607557765e3a9fc436e68aedd212160f43/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d7061636b6167697374266c6f676f436f6c6f723d7768697465266c6162656c3d56657273696f6e266c6162656c436f6c6f723d626c756526636f6c6f723d6c696d65677265656e)](https://packagist.org/packages/texxasrulez/mailman_integration)[![Github License](https://camo.githubusercontent.com/d9bf073aecf5706643b6b7b0cfe0d94399650ea8945a1d13da0084cbb2210d41/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d676974687562266c6162656c3d4c6963656e7365266c6162656c436f6c6f723d626c756526636f6c6f723d636f72616c)](https://github.com/texxasrulez/mailman_integration/LICENSE)[![GitHub Stars](https://camo.githubusercontent.com/d647690100a09c5c90391899c5c611d00716629b7cec4230798c49cd0994a713/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d676974687562266c6162656c3d5374617273266c6162656c436f6c6f723d626c756526636f6c6f723d64656570736b79626c7565)](https://github.com/texxasrulez/mailman_integration/stargazers)[![GitHub Issues](https://camo.githubusercontent.com/383b8c1b8588972505b4f51b16ffd6ec29b96cc59c9a21d6286a6eaaf50ac444/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d676974687562266c6162656c3d497373756573266c6162656c436f6c6f723d626c756526636f6c6f723d61717561)](https://github.com/texxasrulez/mailman_integration/issues)[![GitHub Contributors](https://camo.githubusercontent.com/5150db75d15d24ca9c7ddc0023cbd5ff0fc9b282d9a6866bd646e4e8a4841d7c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d436f6e7472696275746f7273266c6162656c436f6c6f723d626c756526636f6c6f723d6f7263686964)](https://github.com/texxasrulez/mailman_integration/graphs/contributors)[![GitHub Forks](https://camo.githubusercontent.com/8ac4cc0cc2c7cfb257731e8c431233f94d85653db9a9a8b9428d457f22d0d1a2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f74657878617372756c657a2f6d61696c6d616e5f696e746567726174696f6e3f7374796c653d706c6173746963266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d466f726b73266c6162656c436f6c6f723d626c756526636f6c6f723d6461726b6f72616e6765)](https://github.com/texxasrulez/mailman_integration/forks)[![Donate Paypal](https://camo.githubusercontent.com/02124075ee7ea4c192ef867cb30577b0b43ba74ea42b8dbe20b56ef518d94cdb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f50617970616c2d4d6f6e65795f506c65617365212d626c75652e7376673f7374796c653d706c6173746963266c6162656c436f6c6f723d626c756526636f6c6f723d666f72657374677265656e266c6f676f3d70617970616c)](https://www.paypal.me/texxasrulez)

`mailman_integration` is a Roundcube plugin that exposes a small, admin-friendly Mailman 3 feature set inside Roundcube. It focuses on list discovery for the logged-in user, optional directory browsing, safe list metadata, simple member actions, and conservative outbound list headers.

v1 scope
--------

[](#v1-scope)

Included in v1:

- plugin bootstrap, task registration, and native Roundcube rendering
- Mailman 3 REST API access from PHP only
- degraded mode when Mailman is missing, unreachable, or misconfigured
- "My Lists" view based on the active Roundcube identity
- optional browseable directory of lists
- subscribe and unsubscribe actions when enabled by config
- basic list detail view
- compose-time recognition of known list recipients
- outbound `List-*` headers only when the message targets one recognized Mailman list

Intentionally excluded from v1:

- moderation queue handling
- owner or site-admin controls
- full Postorius replacement
- deep member preference management
- bounce and delivery diagnostics
- local database storage

Requirements
------------

[](#requirements)

- Roundcube 1.5 or later
- PHP 7.4 or later
- Mailman 3 with the REST API enabled and reachable from the web server

Installation
------------

[](#installation)

### Via Composer (recommended)

[](#via-composer-recommended)

```
composer require texxasrulez/mailman_integration
```

Then add `mailman_integration` to the `plugins` array in Roundcube's `config/config.inc.php`.

### Manual

[](#manual)

1. Download or clone this repository into Roundcube's `plugins/mailman_integration/` directory.
2. Copy `config.inc.php.dist` to `config.inc.php`:

    ```
    cp plugins/mailman_integration/config.inc.php.dist plugins/mailman_integration/config.inc.php
    ```
3. Edit `config.inc.php` and set at minimum the API URL and credentials (see [Configuration](#configuration)).
4. Add `mailman_integration` to the `plugins` array in Roundcube's `config/config.inc.php`:

    ```
    $config['plugins'] = ['mailman_integration', /* other plugins */];
    ```
5. Clear Roundcube caches if your deployment caches templates or plugin metadata.

Configuration
-------------

[](#configuration)

Copy `config.inc.php.dist` to `config.inc.php` in the plugin directory to get started. All settings have safe defaults except the API connection options, which must be set for the plugin to function.

### API connection

[](#api-connection)

SettingDefaultDescription`mailman_integration_enabled``true`Master on/off switch`mailman_integration_api_url`—Mailman REST base URL, e.g. `https://lists.example.com/3.1``mailman_integration_api_user`—REST API username (set in `mailman.cfg`)`mailman_integration_api_password`—REST API password`mailman_integration_timeout``8`API request timeout in seconds`mailman_integration_tls_verify``true`Verify TLS certificates; disable only for internal deployments`mailman_integration_postorius_url``''`Optional Postorius URL used to link the word `Mailman` in the health status line`mailman_integration_health_path``/system`Path used to probe Mailman health`mailman_integration_health_fallback_path``/lists`Fallback probe path if the primary returns an error### List visibility

[](#list-visibility)

SettingDefaultDescription`mailman_integration_show_directory``false`Show a browseable directory of all advertised lists`mailman_integration_allow_subscribe``false`Enable subscribe actions for users`mailman_integration_allow_unsubscribe``true`Enable unsubscribe actions for users`mailman_integration_show_archives``false`Show archive links when Mailman provides a URL`mailman_integration_show_list_settings``false`Show extra list metadata (volume, member count, etc.)`mailman_integration_show_subscribers_to_admins``false`Show the list subscriber roster to users with existing owner/admin access to that list`mailman_integration_subscribers_page_size``50`Subscribers to load per roster page; clamped internally to 1-200`mailman_integration_allowed_lists``[]`If non-empty, only these list IDs are shown`mailman_integration_blocked_lists``[]`List IDs to always hide`mailman_integration_exposed_domains``[]`If non-empty, only lists hosted on these domains are shown### Compose settings

[](#compose-settings)

SettingDefaultDescription`mailman_integration_compose_detection``true`Detect list recipients while composing`mailman_integration_compose_widget``true`Inject the list info widget into the compose page`mailman_integration_owner_tools``true`Show owner send options when a list address is in recipients`mailman_integration_preflight_require_subject``true`Block sending to a list when the subject line is empty`mailman_integration_preflight_confirm_send``true`Prompt for confirmation before sending to a list`mailman_integration_preflight_append_unsubscribe_footer``false`Append an unsubscribe footer when the owner enables it`mailman_integration_unsubscribe_footer_template`see distFooter template; supports `{list_address}` placeholder`mailman_integration_allow_identity_aliases``false`When `true`, all identity addresses are checked for membership, not just the primary### Outbound headers

[](#outbound-headers)

SettingDefaultDescription`mailman_integration_add_list_headers``true`Inject `List-*` headers when sending to exactly one recognized list`mailman_integration_add_list_unsubscribe``true`Include `List-Unsubscribe` in injected headers### Message templates

[](#message-templates)

Pre-fill subject and body when composing to a list. Defined as an array in `config.inc.php`:

```
$config['mailman_integration_message_templates'] = [
    ['name' => 'Announcement', 'subject' => 'Announcement', 'body' => "Dear subscribers,\n\n"],
    ['name' => 'Newsletter',   'subject' => 'Monthly Newsletter', 'body' => "Hello everyone,\n\n"],
];
```

Leave the array empty (the default) to hide the template picker.

### Diagnostics

[](#diagnostics)

SettingDefaultDescription`mailman_integration_cache_ttl``120`Seconds to cache list and health data`mailman_integration_log_level``warning`Log verbosity: `debug`, `info`, `warning`, `error``mailman_integration_debug``false`Write detailed debug entries to `logs/mailman_integration`Usage
-----

[](#usage)

### Accessing the Mailman task

[](#accessing-the-mailman-task)

After installation the Mailman icon appears in the Roundcube taskbar. Click it to open the **Mailman Lists** page.

### My Lists

[](#my-lists)

The left panel lists every Mailman list the logged-in user is subscribed to (matched against the active Roundcube identity). Selecting a list loads its detail view on the right, showing the list address, description, and available actions.

When `mailman_integration_show_subscribers_to_admins` is `true`, users who already have owner/admin access to a list can also see a **Subscribers** section in that list detail view. The roster is loaded one page at a time from Mailman Core REST regular-member roster data, using `/lists/{list_id}/roster/member` first and falling back to `/members` with `role=member`. Owners, moderators, and nonmembers are not shown. If Mailman cannot load the roster, the UI shows only a generic warning.

### Directory

[](#directory)

When `mailman_integration_show_directory` is `true`, all publicly advertised lists appear in a second panel below **My Lists**. Users can browse and, if subscribe actions are enabled, join lists from this view.

### Subscribe / Unsubscribe

[](#subscribe--unsubscribe)

Subscribe and unsubscribe buttons appear in the list detail view when the corresponding config options are enabled (`mailman_integration_allow_subscribe`, `mailman_integration_allow_unsubscribe`). Actions are confirmed via a page-level flash message.

### Compose integration

[](#compose-integration)

When composing a message, the plugin checks the **To**, **Cc**, and **Bcc** fields against known list addresses. If a match is found:

- A widget appears below the header area showing the matched list name and address.
- If `mailman_integration_owner_tools` is enabled and the user is a list owner, additional send options appear inline:
    - **Require subject** — blocks send if the subject line is empty.
    - **Confirm before send** — shows a confirmation prompt before submitting.
    - **Append unsubscribe footer** — appends the configured footer template to the message body.

Disable the widget entirely with `mailman_integration_compose_widget = false` while keeping outbound header injection active.

### Send to List

[](#send-to-list)

From a list detail page, click **Send to List** to open a compose window pre-addressed to the list. If message templates are configured, a template picker appears next to the send button to pre-fill subject and body.

Skin support
------------

[](#skin-support)

The plugin ships explicit support for:

- `elastic`
- `larry`
- `autumn_larry`
- `black_larry`
- `blue_larry`
- `green_larry`
- `grey_larry`
- `pink_larry`
- `plata_larry`
- `summer_larry`
- `teal_larry`
- `violet_larry`
- `classic`

The Larry color variants are created as real skin directories and mirror the Larry templates, styles, and image assets so Roundcube can resolve them without broken paths.

Mailman failure handling
------------------------

[](#mailman-failure-handling)

If Mailman is absent, unreachable, or misconfigured:

- the plugin stays loaded
- the lists page renders a degraded status message
- write actions are suppressed
- transport details are not leaked into the UI

Outbound header behavior
------------------------

[](#outbound-header-behavior)

The plugin only adds list-style outbound headers when it can match the outgoing recipients to exactly one recognized Mailman list address. It does not add list headers to ordinary mail, and it does not guess when the target is ambiguous.

Headers currently added when configured and available:

- `List-Id`
- `X-BeenThere`
- `List-Unsubscribe`
- `List-Archive`

Roundcube version notes
-----------------------

[](#roundcube-version-notes)

The plugin follows common Roundcube plugin patterns, but hook payload details can differ slightly between Roundcube releases. The message-send hooks and compose-header injection are the most likely places to need small adjustments on older or customized installations.

Compatibility troubleshooting
-----------------------------

[](#compatibility-troubleshooting)

If compose loads with disabled toolbar actions (`Send`, `Save`, `Cancel`) or the browser console shows `$ is not a function`, the issue is almost always a JavaScript conflict from another plugin overriding the global jQuery symbol.

Suggested triage order:

1. Temporarily disable third-party compose-related plugins.
2. Hard-refresh Roundcube and verify core compose works from the native `New message` action.
3. Re-enable plugins one by one until the conflict reappears.
4. If needed, keep Mailman compose recognition active but disable widget injection by setting `mailman_integration_compose_widget` to `false`.

Known real-world conflict observed during testing:

- `markdown_editor` (caused global jQuery collisions and blocked compose initialization)

Smoke test checklist
--------------------

[](#smoke-test-checklist)

Run this quick check after upgrades or plugin changes:

1. Open Mailman task and verify list/taskbar icon visibility for your active skin.
2. Open a list detail page and click `Send to List` (owner role).
3. Confirm compose opens with recipient prefilled and toolbar actions enabled.
4. Send a test message to one list and confirm no send-time server error.
5. Inspect received message headers and verify `List-Id` and `X-BeenThere` are present.
6. If `mailman_integration_show_archives` is enabled, verify `List-Archive` is present.

Translation workflow
--------------------

[](#translation-workflow)

This repository includes `translate_locales.php` to update all locale files in one batch with safer handling for placeholders and markup.

Recommended run with DeepL and Libre fallback:

```
php translate_locales.php \
  --provider=deepl \
  --deepl-key=YOUR_DEEPL_KEY \
  --deepl-plan=free \
  --fallback-provider=libre \
  --lt-url=http://localhost:5000
```

Useful flags:

- `--force=1`: re-translate all keys, not just missing/empty ones
- `--dry-run=1`: simulate translation without writing files
- `--locales=es_ES,fr_FR,de_DE`: process only selected locales
- `--exclude-locales=ja_JP,zh_TW`: skip specific locales
- `--report=localization/mt_report.json`: custom report path

Behavior notes:

- English variants (`en_*`) are copied from source text by design.
- Unsupported locales for the primary provider are captured in the report and can be handled by fallback provider.
- Placeholder tokens and simple markup are masked before translation and restored after translation.

Versioning
----------

[](#versioning)

- `mailman_integration` now keeps its canonical version in `mailman_integration::PLUGIN_VERSION` inside `mailman_integration.php`.
- `mailman_integration::info()` exposes the plugin metadata array used for self-identification.
- Development builds should use a `+dev` suffix such as `1.0.0+dev`.
- Release builds should use a clean tagged version such as `1.0.0`.

For a release bump:

1. Update `mailman_integration::PLUGIN_VERSION` in `mailman_integration.php` or run `sh scripts/bump-version.sh 1.0.0`.
2. Update `CHANGELOG.md`.
3. Create the matching release tag after verification.

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance94

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity35

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Total

2

Last Release

53d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/95c3af6e41a9786e8be2edb48176e43a7d1ddef429793a312168450ff4269deb?d=identicon)[texxasrulez](/maintainers/texxasrulez)

---

Top Contributors

[![texxasrulez](https://avatars.githubusercontent.com/u/10519182?v=4)](https://github.com/texxasrulez "texxasrulez (15 commits)")

### Embed Badge

![Health badge](/badges/texxarulez-mailman-integration/health.svg)

```
[![Health](https://phpackages.com/badges/texxarulez-mailman-integration/health.svg)](https://phpackages.com/packages/texxarulez-mailman-integration)
```

###  Alternatives

[roundcube/roundcubemail

The Roundcube Webmail suite

7.0k1.4k3](/packages/roundcube-roundcubemail)[roundcube/carddav

CardDAV adapter for connecting to CardDAV-enabled addressbooks

27859.0k](/packages/roundcube-carddav)[johndoh/contextmenu

Adds context menus with common tasks to various parts of Roundcube

9778.4k1](/packages/johndoh-contextmenu)[toteph42/identity_switch

This plugin allows users to switch between different identities (and check for new mails) in a single Roundcube session.

221.4k](/packages/toteph42-identity-switch)[kolab/calendar

Calendar plugin

3311.0k](/packages/kolab-calendar)[johndoh/sauserprefs

Control SpamAssassin settings from within Roundcube

563.7k](/packages/johndoh-sauserprefs)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
