Hallo,

Ik heb een contactformulier en merk dat als ik een groot blok Poolse tekst (als 1 alinea) verstuur, deze onjuist in de e-mail naar beheerder komt te staan.

Voorbeeld van hoe de tekst dan weergegeven wordt:

C5=84skich artyku=C5=82=
=C3=B3w na stronie. Bardzo d=C5=82ugo szuka=C5=82em informacji przez Google=
na temat zachowa=C5=84 toksycznych w zwi=C4=85zku i zacz=C4=85=C5=82em szp=
era=C4=87 dopiero po zako=C5=84czeniu toksycznej relacji.


Echter, wanneer ik dezelfde tekst in meerdere alinea's verdeel en verstuur, ziet de e-mail er weer prima uit.

Ik verstuur de mail met de volgende header:

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


Enig idee wat hier aan de hand kan zijn?

Guido
Hoe ziet de rest van je mail script eruit? Gebruik je gewoon de platte mail() functie?
Is dat eerste fragment niet gewoon een quoted-printable Content-Transfer-Encoding?

Maar goed als je character encoderingen niet kloppen maakt dat verder niet zoveel uit :p.

Alles wat er verkeerd ingaat komt er naar alle waarschijnlijkheid ook weer vernaggeld uit.

Mogelijk wordt de quoted-printable tekst gewoon weergegeven als tekst?
Of mogelijk kan de mail client hier niet mee overweg?
Of dus de character encodering gaat ergens mis en dan kan je mail client hier ook geen chocola meer van maken.

En quoted-printable proberen te serveren als 8bit gaat natuurlijk ook niet vliegen :p.
^ dit is em waarschijnlijk, maak van die 8bit eens quoted-printable zou ik zeggen.

Rijst wel de vraag: hoe ontstaat dat fragment precies, waar komt dit vandaan, en waarom behandel je het als 8bit?

Het fragment ziet er wel ok uit, maar er ontbrak waarschijnlijk een (initieel) =-teken. Als je wilt dat we bronmateriaal inspecteren besteed hier dan s.v.p. ook enige zorg aan. Het werkt doorgaans een stuk fijner bij het vormen van een plaatje als je ook echt alle puzzelstukjes hebt...

Het volgende ziet er Pools uit, geen idee wat het betekent:
<?php
ob_start();
?>=C5=84skich artyku=C5=82=
=C3=B3w na stronie. Bardzo d=C5=82ugo szuka=C5=82em informacji przez Google=
na temat zachowa=C5=84 toksycznych w zwi=C4=85zku i zacz=C4=85=C5=82em szp=
era=C4=87 dopiero po zako=C5=84czeniu toksycznej relacji.<?php
$content = ob_get_clean();

header('Content-Type: text/plain; charset=UTF-8');
echo quoted_printable_decode($content);
?>


artikelen op de site. Heel lang was ik op zoek naar informatie over het toxische gedrag van Googlen in een relatie en ik begon pas te zoeken nadat de toxische relatie was geëindigd.

Ehhhh... Ok dan!
Hallo,

Bedankt voor jullie reactie!

Het betreft een WordPress plugin en ik gebruik deze functie om de ingevoerde tekst te sanitizen: https://developer.wordpress.org/reference/functions/sanitize_textarea_field/

In die hoedanigheid verstuur ik het dan ook weer.

Maar nogmaals, als ik een lange Poolse tekst als 1 alinea verstuur gaat het dus mis, maar als ik er enkele alinea's van maak, wordt het wel goed in de e-mail weergegeven.

Ik ben daar zelf niet achter gekomen, maar een gebruiker van het formulier. Zie:
https://wordpress.org/support/topic/mobile-phones-dont-recognize-text-maybe-is-problem-with-polish-language-latin/page/2/#post-11514349

Guido

Uhm.

Je hebt het over sanitize_textarea_field. Maar volgens vscf-options.php is de sanitize_callback voor het Message-veld sanitize_[color=#ff0000]text[/color]_field en niet sanitize_[color=#ff0000]textarea[/color]_field, die overigens nergens voorkomt?

Oftewel, ben je je textarea niet op de verkeerde manier aan het valideren (als een input veld)?

Daarnaast. Deze plugin heb je zelf geschreven?

Ik heb trouwens de ballen verstand van WordPress. Maar wat je zegt komt niet overeen met code als je het mij vraagt.

In het algemeen heeft het geen zin om een situatie te bestuderen waarvan je weet dat deze niet klopt.
Repareer de fout en kijk dan of het probleem nog speelt.
Hi Thomas,

Nee, bestand options is iets anders, daar kun je onder meer de veld labels invoeren. En dat zijn normale text velden.

Maar voor zover ik kan nagaan is er juist geen fout in mijn script, en zoals eerder doorgegeven wordt de tekst prima weergegeven wanneer ik deze in enkele alinea's verdeel.

Maar het zou dus mogelijk (of waarschijnlijk) kunnen liggen aan hoe de sanitize_textarea_field ermee omgaat... maar daarvoor kan ik beter een thread openen op het WP forum.

Had in de tussentijd een simpel standalone-formulier gemaakt en alle Poolse teksten komen gewoon goed binnen. Dat versterkt mijn vermoeden dat het daar aan ligt..

Guido


[size=xsmall]Toevoeging op 10/05/2019 15:03:59:[/size]

Trouwens, WordPress gebruikt PHP mailer voor het versturen van mail:
https://core.trac.wordpress.org/browser/tags/5.1.1/src/wp-includes/pluggable.php#L144

Heb alle validering / sanitizing eruit gesloopt maar nog steeds geen verschil.
Dus mogelijk dat het aan PHP mailer ligt.

Guido

Definieer je daar niet de validatieregels?
register_setting( 'vscf-label-options', 'vscf-setting-9', array('sanitize_callback' => 'sanitize_text_field') );
//                                                                                      ^^^^^^^^^^^^^^^^^^^

EDIT: en als PHPMailer alles (standaard?) quoted-printable encode geef je nog steeds de verkeerde Content-Transfer-Encoding mee in jouw code.

Je stelt de encoding ook compleet buiten PHPMailer in, dus dat maakt het ook lastig voor PHPMailer om dit op te pikken.

De default encoding van PHPMailer is zelf quoted-printable blijkbaar. En deze wordt ook nergens expliciet ingesteld in de WP-code (middels $phpmailer->Encoding = 'xyz' ofzo). Maar jouw mail zegt vrolijk dat het 8bit is. Kan me voorstellen dat programma's die de mail moeten lezen dan in verwarring raken.

Heb je voor de gein al eens de source van zo'n mailtje bekeken? Welke headers zitten daar in?

En de instelling "de fout zit niet in mijn code" is natuurlijk geen fantastisch uitgangspunt. Je zult er echt van voor naar achteren doorheen moeten. De eerste steen die op mijn weg lag is wat mij betreft nog steeds een verkeerde manier van validatie van de textarea.
EDIT: ok labels, dat maakt dan dus geen biet uit.
Hoi Thomas,

Ja, voor het veld-LABEL. Niet voor de input. Alle invoer binnen WordPress behoort op deze manier gevalideerd te worden.

Maare, het blijkt inderdaad te liggen aan de Content-Transfer-Encoding.

Content-Transfer-Encoding: QUOTED-PRINTABLE


Ik wist niet beter dat 8-bit de standaard was?!

Guido
Guido - op 10/05/2019 15:25:40
Ik wist niet beter dat 8-bit de standaard was?!

Assumption is the mother of all f*ckups.
En quoted-printable proberen te serveren als 8bit gaat natuurlijk ook niet vliegen :p.
^ dit is em waarschijnlijk, maak van die 8bit eens quoted-printable zou ik zeggen.

Stond al in de eerste reactie :p.
Ik was even vergeten dat er nog een script was, die z'n ding ook nog deed... PHP-mailer dus.
Ik had alle validatie / sanering uit mijn plugin gesloopt, maar zonder resultaat.
Dus als ik het goed begrijp zit er in dat PHP-mailer script iets wat dit veroorzaakt?
En om dat te "fixen" moest ik die Content-Transfer-Encoding wijzigen?
vscf-submission.php regel 74:
headers .= "Content-Transfer-Encoding: 8bit" . "\r\n";

Zou je kunnen aanpassen, en wellicht helpt weghalen ook. Misschien beter om dat alles of zoveel mogelijk aan het mailprogramma zelf over te laten?

Kijk ook eens hoe de mailtjes er uiteindelijk uitrollen. Welke headers bevatten die allemaal?

Reageren