Umlaute im Kontaktformular #122

Closed
opened 2022-08-20 17:12:23 +02:00 by muli · 3 comments
Owner

Im Otobo sind die Umlaute von Nachrichten, die über das Kontaktformular geschickt werden kaputt. Das äußert sich in Mail z.B. wie folgt:

Södela, die Umlaute sind wohl immer noch kaputt, dafür dürfte
jetzt der Betreff korrekt rüber kommen. We'll see.

Es kommen Umlaute also als HTML-Entities an, also ü für ü, aber das & wird an dieser Stelle ebenso durch & ersetzt, wodurch ü dann im Mailtext landet.

Beteiligte sind an dieser Stelle, der Browser, der den Text via JS und JSON an PHP übergibt, PHP und seine mail-Funktion, der Mailserver und schließlich Otobo. An welcher Stelle in der Kette man sinnvoll eingreifen sollten erschließt sich mir aktuell noch nicht.

Im Otobo sind die Umlaute von Nachrichten, die über das Kontaktformular geschickt werden kaputt. Das äußert sich in Mail z.B. wie folgt: Södela, die Umlaute sind wohl immer noch kaputt, dafür dürfte jetzt der Betreff korrekt rüber kommen. We'll see. Es kommen Umlaute also als HTML-Entities an, also `ü` für ü, aber das & wird an dieser Stelle ebenso durch `&` ersetzt, wodurch `ü` dann im Mailtext landet. Beteiligte sind an dieser Stelle, der Browser, der den Text via JS und JSON an PHP übergibt, PHP und seine mail-Funktion, der Mailserver und schließlich Otobo. An welcher Stelle in der Kette man sinnvoll eingreifen sollten erschließt sich mir aktuell noch nicht.
Author
Owner

Ich bin aktuell schon ein bisschen weiter:

  1. Hilfe gibt es. z.B. in diesem Artikel
  2. Ich habe das Meiste davon und noch ein bissschen mehr provisorisch auf der Spielwiese eingebaut.
    <?php
    ini_set('default_charset', 'UTF-8');
    header('Content-Type: text/html; charset=utf-8');
    session_start();

    function send_message_to_office($subject, $message, $name, $email) {
        return mail(
            getenv('WTF_CONTACT_TO'),
            "=?UTF-8?B?".base64_encode($subject)."?=",
            base64_encode(str_replace("\n", "\r\n", $name . "\n" . $message . " ä")),                                                                            
            $additional_headers = array(
                "From" => getenv('WTF_CONTACT_FROM'),
                "Reply-To" => $email,
                "Return-Path" => getenv('WTF_RETURN_PATH'),
                "Content-Type" => "text/plain; charset=utf-8",
                "Content-Transfer-Encoding" => "base64",
            ),
        );
    }

Das hat auf den resten Blick nichts gebracht, aber in der letzten Testmail wird das angehängte 'ä' korrekt dargestellt.

Somit sollte sich im nächsten Schritte drauf konzentriert werden, was in den Variablen $subject und $message in welchem Encoding ankommt und ob man entweder in JS, oder in PHP den Inhalt nochmal umrödeln muss.

Umlaute, meine Fresse … 2022 … es bleibt schwierig. Schade.

Ich bin aktuell schon ein bisschen weiter: 1. Hilfe gibt es. z.B. in diesem [Artikel](https://dev.to/lutvit/how-to-make-the-php-mail-function-awesome-3cii) 2. Ich habe das Meiste davon und noch ein bissschen mehr provisorisch auf der Spielwiese eingebaut. ``` <?php ini_set('default_charset', 'UTF-8'); header('Content-Type: text/html; charset=utf-8'); session_start(); function send_message_to_office($subject, $message, $name, $email) { return mail( getenv('WTF_CONTACT_TO'), "=?UTF-8?B?".base64_encode($subject)."?=", base64_encode(str_replace("\n", "\r\n", $name . "\n" . $message . " ä")), $additional_headers = array( "From" => getenv('WTF_CONTACT_FROM'), "Reply-To" => $email, "Return-Path" => getenv('WTF_RETURN_PATH'), "Content-Type" => "text/plain; charset=utf-8", "Content-Transfer-Encoding" => "base64", ), ); } ``` Das hat auf den resten Blick nichts gebracht, aber in der letzten Testmail wird das angehängte 'ä' korrekt dargestellt. Somit sollte sich im nächsten Schritte drauf konzentriert werden, was in den Variablen $subject und $message in welchem Encoding ankommt und ob man entweder in JS, oder in PHP den Inhalt nochmal umrödeln muss. Umlaute, meine Fresse … 2022 … es bleibt schwierig. Schade.
Member

Die HTML-Entities entstehen in der Funktion sanitize_text() im PHP.

filter_var() mit FILTER_SANITIZE_FULL_SPECIAL_CHARS wandelt auch die Umlaute um, nicht nur <, > usw. (In der Doku steht das nicht so explizit drin, aber mit php -a kann man das schnell testen.) Das nachgelagerte htmlspecialchars() macht aus den Ampersands dann noch &amp;s.

FILTER_SANITIZE_SPECIAL_CHARS (ohne FULL) müsste als Filter ausreichen, und htmlspecialchars() kann weggelassen werden, da das schon im Filter drin ist.

Die HTML-Entities entstehen in der Funktion `sanitize_text()` im PHP. `filter_var()` mit `FILTER_SANITIZE_FULL_SPECIAL_CHARS` wandelt auch die Umlaute um, nicht nur `<`, `>` usw. (In der Doku steht das nicht so explizit drin, aber mit `php -a` kann man das schnell testen.) Das nachgelagerte `htmlspecialchars()` macht aus den Ampersands dann noch `&amp;`s. `FILTER_SANITIZE_SPECIAL_CHARS` (ohne `FULL`) müsste als Filter ausreichen, und `htmlspecialchars()` kann weggelassen werden, da das schon im Filter drin ist.
muli self-assigned this 2022-08-21 14:21:24 +02:00
Author
Owner

Danke für den Hinweis. Habe ich jetzt gefixt. Den (aus meiner Sicht) sinnvollen Teil aus meinen ersten Ansätzen habe ich zusätzlich übernommen.

Außerdem bin ich über den Filter für E-Mailadressen FILTER_SANITZIE_EMAIL gestolpert und hab ich noch eingebaut und ich sorge jetzt dafür, dass wirklich nur \r\n als Zeilenumbruch in der Mail landet.

Das sah beim Test jetzt soweit gut aus.

Werde den Branch zu diesem Ticket dann in den fürs Kontaktformular mergen, dann sollte dort der PR aktualisiert werden.

Danke für den Hinweis. Habe ich jetzt gefixt. Den (aus meiner Sicht) sinnvollen Teil aus meinen ersten Ansätzen habe ich zusätzlich übernommen. Außerdem bin ich über den Filter für E-Mailadressen `FILTER_SANITZIE_EMAIL` gestolpert und hab ich noch eingebaut und ich sorge jetzt dafür, dass wirklich nur `\r\n` als Zeilenumbruch in der Mail landet. Das sah beim Test jetzt soweit gut aus. Werde den Branch zu diesem Ticket dann in den fürs Kontaktformular mergen, dann sollte dort der PR aktualisiert werden.
muli closed this issue 2022-08-23 22:04:31 +02:00
muli added the
bug
label 2022-09-03 17:31:33 +02:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ag_kommunikation/webseite#122
No description provided.