dodjango/paperless_attach

Attach documents from a Paperless-ngx instance directly into the Roundcube compose flow (Elastic skin).

Maintainers

Package info

github.com/dodjango/roundcube-paperless-attach

Type:roundcube-plugin

pkg:composer/dodjango/paperless_attach

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 3

Open Issues: 0

v1.2.2 2026-07-21 08:59 UTC

This package is auto-updated.

Last update: 2026-07-21 09:00:03 UTC


README

Release Tests License: GPL v3 Roundcube 1.6.x Paperless-ngx

A Roundcube (Elastic skin) plugin to attach documents from a Paperless-ngx instance straight from the compose window โ€” search, filter, pick, attached. No download/re-upload detour. It works both ways: you can also save an attachment from a received mail straight into Paperless without leaving Roundcube. The per-user API token is stored encrypted and all Paperless traffic stays server-side.

Paperless picker dialog with search, filters and results

End-to-end demo: searching Paperless from compose, picking a document, and attaching it

Features

  • ๐Ÿ” Search + filter your documents โ€” full-text, tags, correspondent, document type, date range โ€” and multi-select across pages.
  • ๐Ÿ–‡๏ธ Attaches the searchable archive PDF, fetched server-side.
  • ๐Ÿ“ฅ Save received attachments to Paperless โ€” a per-attachment button (and one in the attachment preview toolbar after Open) uploads the file server-side; the async import is polled and reported (saved โœ“ / already exists / failed).
  • ๐Ÿ” Token stored encrypted; token + Paperless URL never reach the browser (single server-side proxy).
  • ๐Ÿงฐ Oversize rejected before download, born-digital docs skipped, per-item batch results, no duplicate attaches.
  • ๐Ÿณ Survives :latest (bind-mount + ROUNDCUBEMAIL_PLUGINS, no image build).
Compose button Settings โ€” token + connection test
Compose button Settings section

Document titles, correspondents and the sender address are blurred in the screenshots.

Requirements

Roundcube 1.6.x ยท Elastic skin only ยท PHP 7.4+ ยท a reachable Paperless-ngx instance.

Install

Composer (from your Roundcube root):

composer require dodjango/paperless_attach

Docker bind-mount (recommended for roundcube/roundcubemail:latest โ€” survives image updates):

services:
  roundcubemail:
    volumes:
      - ./plugins/paperless_attach:/var/www/html/plugins/paperless_attach:ro
    environment:
      - ROUNDCUBEMAIL_PLUGINS=archive,zipdownload,...,paperless_attach   # append, keep the rest
      - ROUNDCUBEMAIL_DES_KEY=<EXACTLY 24 characters>                    # encrypts the token

Set PHP upload_max_filesize / post_max_size / memory_limit โ‰ฅ your Roundcube upload limit, otherwise the effective attachment cap drops to the lower value.

โš ๏ธ Never change des_key after tokens are stored โ€” it makes all stored tokens (and sessions) undecryptable; every user would have to re-enter their token. Pin it once.

Configure

  • Token (per user): Settings โ†’ Paperless โ†’ paste your Paperless API token โ†’ Save โ†’ Test connection.
  • Paperless URL (server-side): copy config.inc.php.dist โ†’ config.inc.php and set $config['paperless_url']. It is server-fixed (SSRF guard โ€” no per-user URL field); the default http://paperless-webserver:8000 is an internal Docker hostname, so most installs must change it.
  • Max upload size (optional, server-side): $config['paperless_max_upload_size'] caps a received attachment uploaded to Paperless (default 100M; 0 disables the guard).

Security

Token encrypted via rcube::encrypt() โ€” never stored in DB plaintext, echoed to the field, or placed in rcmail.env/AJAX. All Paperless calls originate from one server-side proxy (lib/PaperlessClient.php) with redirects disabled, enforced timeouts, and integer-validated document ids. Designed for internal-network use.

Status

In daily use on the author's self-hosted stack. Best-effort community plugin (no warranty), so far verified on a single deployment; testing on other Roundcube 1.6.x setups, issues and PRs are very welcome.

Contributing & releases

Conventional Commits + Semantic Versioning, released automatically via release-please. See CONTRIBUTING.md.

Tests: a PHPUnit suite covers the server-side Paperless client (lib/PaperlessClient.php) โ€” run composer install && composer test. CI runs it on PHP 7.4 / 8.0 / 8.1.

Out of scope (v2)

Archive-vs-original choice per document ยท inline PDF preview ยท saved searches ยท skins other than Elastic.

Author & license

Created and maintained by @dodjango. Built with the help of AI tooling (Claude); all code is human-reviewed and live-tested.

Licensed under GPL-3.0-or-later โ€” see LICENSE.