PHPackages                             kreativsoehne/sulu-email-obfuscator-bundle - 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. [Mail &amp; Notifications](/categories/mail)
4. /
5. kreativsoehne/sulu-email-obfuscator-bundle

ActiveSymfony-bundle[Mail &amp; Notifications](/categories/mail)

kreativsoehne/sulu-email-obfuscator-bundle
==========================================

Delivers e-mail addresses obfuscated on Sulu websites: ROT13 in the source, readable in the browser. Works on everything Sulu renders, without touching a template.

v1.0.0(yesterday)06↑900%MITPHPPHP ^8.2CI passing

Since Aug 16Pushed yesterdayCompare

[ Source](https://github.com/kreativsoehne/sulu-email-obfuscator-bundle)[ Packagist](https://packagist.org/packages/kreativsoehne/sulu-email-obfuscator-bundle)[ RSS](/packages/kreativsoehne-sulu-email-obfuscator-bundle/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (12)Versions (2)Used By (0)

SuluEmailObfuscatorBundle
=========================

[](#suluemailobfuscatorbundle)

Liefert Mailadressen auf Sulu-Seiten verdreht aus: im Quelltext steht ROT13, lesbar wird die Adresse erst im Browser. Läuft mit Sulu 2.6 und Sulu 3, und ohne Sulu als gewöhnliches Symfony-Bundle.

Der Unterschied zu den üblichen Twig-Filtern: **es gibt nichts einzubauen.** Das Bundle schreibt die fertige Seite um, nicht einzelne Vorlagen. Eine Sulu-Seite trägt Adressen an Stellen, die keine Vorlage des Projekts kontrolliert — Fließtext aus dem Editor, Snippets, Artikel, Rechtstexte aus einer Fremd-API. Ein Filter erwischt immer nur die Stellen, an die jemand gedacht hat.

Funktionsweise
--------------

[](#funktionsweise)

- **Umgeschrieben wird die Antwort**, spät im `kernel.response` und vor dem HTTP-Cache. Was im Cache landet, ist bereits verdreht.
- **Nur im Website-Kontext.** Sulu betreibt Backend und Auftritt aus einer Codebasis und unterscheidet sie über `sulu.context`; daran hängt die Registrierung. Das Backend bleibt unangetastet — ein Eingabefeld muss die Adresse zeigen, die die Redaktion getippt hat.
- **Die Vorschau zeigt die echte Adresse.** Sulu rendert sie zwar mit einem Website-Kernel, markiert die Anfrage aber mit dem Attribut `preview`; daran erkennt der Listener sie und lässt sie liegen. Zweimal richtig so: die Redaktion prüft Inhalte, und die Vorschau tauscht beim Tippen Teile des Dokuments aus — darin eingesetzte Skripte laufen nicht, verdrehte Adressen blieben also stehen.
- **Verdrehte Verweise tragen `data-obfuscated-email`.** Daran erkennt das Skript sie im Browser, und daran erkennt der Umschreiber, was er schon bearbeitet hat. Zweimal angewendet ändert also nichts.
- **Beschriftungen bleiben lesbar**, außer sie sind selbst eine Adresse. „Schreib uns" bleibt „Schreib uns"; Browser und Server halten sich an dieselbe Regel.
- **Skripte und Stile bleiben unberührt.** Eine Adresse in einem Attribut wird nie angefasst, sonst zerfiele das Markup.
- **Das Skript geht nur auf Seiten mit, auf denen es etwas zu tun gibt** — knapp ein Kilobyte, inline, kein Build-Schritt, keine zusätzliche Anfrage.

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

[](#installation)

```
composer require kreativsoehne/sulu-email-obfuscator-bundle
```

Bundle registrieren (`config/bundles.php`), falls Flex das nicht übernimmt:

```
KreativSoehne\SuluEmailObfuscatorBundle\SuluEmailObfuscatorBundle::class => ['all' => true],
```

Das war es. Ohne weitere Einstellung gehen ab dem nächsten Aufruf alle Adressen verdreht raus.

Einstellungen
-------------

[](#einstellungen)

Alle Werte sind Vorgaben, die Datei ist nur nötig, wenn davon abgewichen wird:

```
# config/packages/sulu_email_obfuscator.yaml
sulu_email_obfuscator:
    enabled: true                # schaltet das Bundle ganz ab
    automatic: true              # schreibt die fertige Seite um
    link_plain_addresses: true   # eine frei stehende Adresse wird zum Verweis
    script: auto                 # auto | manual | none
    excluded_routes: ['sulu_preview', 'sulu_admin']
```

- `automatic: false` lässt nur die Filter übrig, für Projekte, die jede Stelle selbst bestimmen wollen.
- `link_plain_addresses: false` lässt Adressen im Fließtext stehen, statt sie zu verlinken. Sie bleiben dann lesbar — verdrehen lässt sich nur, was ein Verweis ist.
- `script: manual` heißt: die Vorlage setzt `{{ sulu_email_obfuscator_script() }}` selbst, vor ``. Nötig bei einer strengen Content Security Policy, dann mit Nonce: `{{ sulu_email_obfuscator_script(csp_nonce) }}`.
- `script: none` heißt: das Projekt bringt das Skript selbst mit. Es liegt nach `bin/console assets:install` unter `public/bundles/suluemailobfuscator/email-obfuscator.js` und lässt sich genauso aus `vendor/` in den eigenen Build importieren.

Twig
----

[](#twig)

Gebraucht nur, wo die Vorlage die Sache selbst in der Hand hat:

```
{# eine Adresse aus einem Feld, Verweis in der Vorlage #}

    {{ address|sulu_obfuscate_email }}

{# fertiges HTML, in dem Adressen stecken können #}
{{ content.text|sulu_obfuscate_emails }}
```

Beides ist neben dem automatischen Umschreiben unschädlich: was die Marke trägt, wird kein zweites Mal angefasst.

**`sulu_obfuscate_emails` gibt HTML zurück und wird deshalb nicht mehr maskiert.** Er gehört nur an Werte, die ohnehin als HTML ausgegeben werden — also dorthin, wo vorher `|raw` stand. An einer ungeprüften Eingabe steht er falsch: dann liefe der Text ungefiltert in die Seite. Für eine einzelne Adresse aus einem Textfeld ist `sulu_obfuscate_email` der richtige Filter, der maskiert wie jeder andere Wert.

Was das Bundle nicht kann
-------------------------

[](#was-das-bundle-nicht-kann)

- **Ohne JavaScript bleibt die Adresse unlesbar.** Das ist der Preis des Verfahrens, nicht ein Fehler. Wo das nicht tragbar ist, gehört eine Rufnummer oder ein Kontaktformular daneben.
- **Es ist Abschreckung, kein Schutz.** Wer ROT13 zurückdreht, hat die Adresse. Gemeint sind die Sammler, die Quelltexte nach dem Klammeraffen durchsuchen.
- **Strukturierte Daten bleiben lesbar.** Inhalte in `` werden bewusst nicht angefasst — Suchmaschinen und KI-Systeme sollen sie lesen können, und abweichen darf die Auszeichnung vom Sichtbaren ohnehin nicht. Steht dieselbe Adresse in einer FAQ-Antwort, steht sie damit auch im JSON-LD. Solche Antworten gehören umformuliert, nicht verdreht.
- **Formulare fasst es nicht an.** Ein Kontaktformular ist eine andere Aufgabe, dafür gibt es [SuluRecaptchaBundle](https://github.com/kreativsoehne/sulu-recaptcha-bundle).

Lizenz
------

[](#lizenz)

MIT, siehe [LICENSE](LICENSE).

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance100

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 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

Unknown

Total

1

Last Release

1d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/2213199?v=4)[Kreativ&amp;Söhne](/maintainers/kreativsoehne)[@kreativsoehne](https://github.com/kreativsoehne)

---

Top Contributors

[![kus-alex](https://avatars.githubusercontent.com/u/193919674?v=4)](https://github.com/kus-alex "kus-alex (4 commits)")

---

Tags

symfonyemailspame-mailobfuscationsuluHarvesterrot13

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kreativsoehne-sulu-email-obfuscator-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/kreativsoehne-sulu-email-obfuscator-bundle/health.svg)](https://phpackages.com/packages/kreativsoehne-sulu-email-obfuscator-bundle)
```

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k18.3M430](/packages/easycorp-easyadmin-bundle)

PHPackages © 2026

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