VN Mailer
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
OK - danke erst einmal - das hCaptcha in ein anderes Formular einzubauen ist aber gar nicht einfach. Noch funzt es nicht - bin aber dran.
Dann gucke ich mal in die app.js auch rein, ansonsten importiere ich jetzt auch nochmals diese Anwendung ganz neu.
Dann gucke ich mal in die app.js auch rein, ansonsten importiere ich jetzt auch nochmals diese Anwendung ganz neu.
Re: VN Mailer
Das wird nicht nutzen Tommy, alles base64 codiert 
Nicht weil ich was verschleiern will, sondern ganz einfach das Mobirise die PHP Scripte nicht einfach raus filtern kann
Nicht weil ich was verschleiern will, sondern ganz einfach das Mobirise die PHP Scripte nicht einfach raus filtern kann
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
ah - wollte gerade schreiben: in der app.js finde ich nix von dem "subject" - ich will ja auch noch den Header bei der Mail-Kopie ändern ...
Das ist aber eigentlich nicht dort verschlüsselt worden sondern nur so etwas wie SMTP oder Captcha.
Wieso "filtert" Mobirise PHP-Skripte
Das ist aber eigentlich nicht dort verschlüsselt worden sondern nur so etwas wie SMTP oder Captcha.
Wieso "filtert" Mobirise PHP-Skripte
Re: VN Mailer
Ich hab hier 2 Formulare mit dem hCaptcha, was soll da nicht gehen ?
https://www.niederastroth.de/vntabs/
Alle meine Anwendungen legen die PHP Scripte mit der Base64 Codierung an, weil Mobirise manchmal PHP einfach raus haut Tommy. Warum kann ich Dir nicht sagen.
Was willst Du ändern ? Den Text "Hier eine Kopie Deiner Nachricht" oder "Deine Nachricht (Kopie)"
Das müsste ich auch dann alles ins zahnrad legen
Die PHP Scripte soll eigentlich auch keiner ändern
Das ist auch so gewollt von mir 
https://www.niederastroth.de/vntabs/
Alle meine Anwendungen legen die PHP Scripte mit der Base64 Codierung an, weil Mobirise manchmal PHP einfach raus haut Tommy. Warum kann ich Dir nicht sagen.
Was willst Du ändern ? Den Text "Hier eine Kopie Deiner Nachricht" oder "Deine Nachricht (Kopie)"
Das müsste ich auch dann alles ins zahnrad legen
Code: Alles auswählen
$copyMail->isHTML(false);
$copyMail->Subject = 'Deine Nachricht (Kopie)';
$copyMail->Body = "Hier eine Kopie deiner gesendeten Nachricht:\n\n" . implode("\n", $bodyLines);Re: VN Mailer
Alle PHP Scripte TommyTommy Herrmann hat geschrieben: So 26. Jul 2026, 11:16 ah - wollte gerade schreiben: in der app.js finde ich nix von dem "subject" - ich will ja auch noch den Header bei der Mail-Kopie ändern ...
Das ist aber eigentlich nicht dort verschlüsselt worden sondern nur so etwas wie SMTP oder Captcha.
Wieso "filtert" Mobirise PHP-Skripte![]()
var B64_NATIVEFORM =base64 (das ist der handler und da stehen die Texte ja auch drin)
var B64_PHPMAILER =base64
var B64_SMTP =base64
usw.
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
Das ist sehr ungewohnt, dass man PHP-Skripte nicht anpassen kann 
Wenn Du das noch machen würdest, fände ich es gut. Es müssen eigentlich nur die beiden Betreff änderbar sein, also auch wenn eine Kopie gesendet wird:
"Deine Nachricht (Kopie)"
Da steht dann bei mir zum Beispiel personalisiert
"Deine Nachricht an Tommy (Kopie)"
Machst Du das noch? Dann warte ich noch mit dem Download. Das muss aber nun nicht sein, wäre aber sinnvoll (auch für andere), denn der Betreff muss schon mal angepasst werden.
Wenn Du das noch machen würdest, fände ich es gut. Es müssen eigentlich nur die beiden Betreff änderbar sein, also auch wenn eine Kopie gesendet wird:
"Deine Nachricht (Kopie)"
Da steht dann bei mir zum Beispiel personalisiert
"Deine Nachricht an Tommy (Kopie)"
Machst Du das noch? Dann warte ich noch mit dem Download. Das muss aber nun nicht sein, wäre aber sinnvoll (auch für andere), denn der Betreff muss schon mal angepasst werden.
Re: VN Mailer
Ja weil du es bist Tommy,
also noch 2 Felder ins Zahnrad: Deine Nachricht (Kopie)
und Hier eine Kopie deiner gesendeten Nachricht
Fange ich jetzt an, aber Mittagessen kommt noch dazwischen
Sonst alles soweit aber jetzt OK !! ODER ?????
also noch 2 Felder ins Zahnrad: Deine Nachricht (Kopie)
und Hier eine Kopie deiner gesendeten Nachricht
Fange ich jetzt an, aber Mittagessen kommt noch dazwischen
Sonst alles soweit aber jetzt OK !! ODER ?????
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
alles OK - weil ich nach nix mehr suchen werde 
Re: VN Mailer
Melde mich gleich wenn die FINALE VERSION dann online ist
Mit allen Schnick Schnack
Mit allen Schnick Schnack
Re: VN Mailer
Du kannst die ja anpassen, nur werden die halt durch die app.js nach neuer Veröffentlichung wieder überschrieben.Tommy Herrmann hat geschrieben: So 26. Jul 2026, 11:35 Das ist sehr ungewohnt, dass man PHP-Skripte nicht anpassen kann![]()
DAs könnte man ja leicht mit einer Kopie in einem Ordner auf dem Server umgehen. Dann immer wieder die Kopie rein hauen. Ist zwar etwas umständlich, würde aber gehen ;-)
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
Na so habe ich es ja bisher gemacht, nur ist das ja kein optimaler Zustand 
Re: VN Mailer
Ich bin doch schon dran ....Tommy Herrmann hat geschrieben: So 26. Jul 2026, 11:44 Na so habe ich es ja bisher gemacht, nur ist das ja kein optimaler Zustand![]()
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
… und ja - daran denkt man dann auch, solange man vielleicht nur was am Formular ändert, nur hat mein Projekt ja noch 50 andere Anwendungen an n den gearbeitet wird. Dann publiziert man in 3 Monaten etwas wegen der Tabelle und dann wird wieder das Formular zerhackt
Denkt doch dann kein Mensch mehr an so etwas ...
… und wie geht das dann denn mit Deinem neuen Formular-Generator weiter. Weiß doch keine Sau, wie der dann mit dem "VN Mailer" zusammen verwendet wird.
Ich meine die direkte Verwendung vom Mobirise-Formular Builder war ja nur so zum "warmlaufen" gedacht
Da fangen wir aber dann besser einen neuen Thread für an.
… und wie geht das dann denn mit Deinem neuen Formular-Generator weiter. Weiß doch keine Sau, wie der dann mit dem "VN Mailer" zusammen verwendet wird.
Ich meine die direkte Verwendung vom Mobirise-Formular Builder war ja nur so zum "warmlaufen" gedacht
Da fangen wir aber dann besser einen neuen Thread für an.
Re: VN Mailer
So,
noch vorm Mittag schnell erledigt
Kann alles im Zahnrad eingestellt werden
Ist jetzt im Download!
noch vorm Mittag schnell erledigt
Kann alles im Zahnrad eingestellt werden
Ist jetzt im Download!
Re: VN Mailer
Da reden wir in dem Thread drüber Tommy : viewtopic.php?f=42&t=2180Tommy Herrmann hat geschrieben: So 26. Jul 2026, 11:48 … und wie geht das dann denn mit Deinem neuen Formular-Generator weiter. Weiß doch keine Sau, wie der dann mit dem "VN Mailer" zusammen verwendet wird.
Ich meine die direkte Verwendung vom Mobirise-Formular Builder war ja nur so zum "warmlaufen" gedacht
Da fangen wir aber dann besser einen neuen Thread für an.
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
OK - dann baue ich das Teil mal neu ein.
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
Jo - nu ist es das "ziemlich beste Formular" weit und breit 
https://www.mobirise-tutorials.com/VN-B ... tml#Mailer

Re: VN Mailer
So, nun auch die englische Version mit allen Optionen ausgestattet
Da bin ich mal gespannt ... bis jetzt hält sich die Nachfrage ( auch hier ) ja in Grenzen
Ich glaube Tommy, wir sind die einzigen die die Genialität dieses Blocks zu erkennen vermögen
Da bin ich mal gespannt ... bis jetzt hält sich die Nachfrage ( auch hier ) ja in Grenzen
Ich glaube Tommy, wir sind die einzigen die die Genialität dieses Blocks zu erkennen vermögen
- Tommy Herrmann
- Site Admin

- Beiträge: 9256
- Registriert: So 6. Dez 2020, 07:37
- Wohnort: Berlin
- Kontaktdaten:
Re: VN Mailer
Moin,
habe immer noch was zu verbessern
Mir gefiel es nicht wie die Mail ankam. So ist schöner:
> Feldbezeichnungen stehen links.
> Feldinhalte beginnen mit einem gleichmäßigen Abstand.
> Alle Feldinhalte stehen linksbündig exakt untereinander.
> Längere oder mehrzeilige Texte werden korrekt umgebrochen.
> Die Kopie an den Absender erhält dieselbe Gestaltung.
> Zusätzlich bleibt eine reine Textversion als Alternative für Mailprogramme erhalten, die kein HTML anzeigen.
https://www.mobirise-tutorials.com/VN-B ... ailer.html
Hier die gesamte neu PHP Datei: "native-form-handler.php" - falls Du das noch neu in Deine .mbrext Erweiterung packen wolltest.
Ach Mist, die Datei wird ja dann (natürlich) auch wieder beim Publizieren überschrieben. Kannst Du das eventuell noch einfach ändern, sonst muss ich halt dran denken. Wäre natürlich für andere User auch schöner als diese einfache Text-Mail.
Solche Dateien solltest Du möglichst in Zukunft vermeiden, denn natürlich will und oft muss man auch mal was an Deinen Scripts ändern (schon weil auch öfter mal krasse Fehler dabei sind). Das ist ja kein Zustand, wenn nur Du das machen kannst. Verstehe auch ehrlich gesagt den Sinn dabei nicht
habe immer noch was zu verbessern
Mir gefiel es nicht wie die Mail ankam. So ist schöner:
> Feldbezeichnungen stehen links.
> Feldinhalte beginnen mit einem gleichmäßigen Abstand.
> Alle Feldinhalte stehen linksbündig exakt untereinander.
> Längere oder mehrzeilige Texte werden korrekt umgebrochen.
> Die Kopie an den Absender erhält dieselbe Gestaltung.
> Zusätzlich bleibt eine reine Textversion als Alternative für Mailprogramme erhalten, die kein HTML anzeigen.
Hier die gesamte neu PHP Datei: "native-form-handler.php" - falls Du das noch neu in Deine .mbrext Erweiterung packen wolltest.
Code: Alles auswählen
<?php
declare(strict_types=1);
date_default_timezone_set('Europe/Berlin');
// Erkennt, ob's ein "unsichtbarer" AJAX-Request ist (fetch/XHR) oder eine
// ECHTE Formular-Navigation (Browser lädt die Antwort als neue Seite).
// Mobirise's natives Formular macht offenbar eine echte Navigation - dann
// muss per Redirect zurück zur Seite geleitet werden, statt rohes JSON zu
// zeigen. AJAX-Aufrufe (unsere eigenen Blöcke) bekommen weiterhin JSON.
$vnmIsAjax = (
!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'
) || (
!empty($_SERVER['HTTP_ACCEPT'])
&& strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false
);
/*
=========================================================
ANTWORT AN DAS FORMULAR ZURÜCKGEBEN
=========================================================
*/
function respond(bool $ok, string $message = ''): void
{
global $vnmIsAjax;
if ($vnmIsAjax) {
header('Content-Type: application/json; charset=utf-8');
http_response_code($ok ? 200 : 400);
echo json_encode(
[
'success' => $ok,
'message' => $message,
],
JSON_UNESCAPED_UNICODE
);
exit;
}
// Echte Formular-Navigation: zurück zur Seite leiten (Referer), Status
// per URL-Parameter mitgeben - vn-mailer liest das beim Laden aus.
// vnmailer_id sorgt dafür, dass bei mehreren vn-mailer-Blöcken auf
// einer Seite nur die tatsächlich betroffene Instanz reagiert.
$referer = $_SERVER['HTTP_REFERER'] ?? '/';
// Alte VN-Mailer-Parameter entfernen.
$referer = preg_replace(
'/[?&]vnmailer(_msg|_id)?=[^&]*/',
'',
$referer
);
$sep = strpos($referer, '?') !== false ? '&' : '?';
$instanceId = preg_replace(
'/[^a-zA-Z0-9_\-]/',
'',
(string) ($_POST['vnmailer_id'] ?? '')
);
$redirectUrl = $referer
. $sep
. 'vnmailer=' . ($ok ? 'success' : 'error')
. '&vnmailer_msg=' . rawurlencode($message)
. '&vnmailer_id=' . rawurlencode($instanceId);
header('Location: ' . $redirectUrl);
exit;
}
/*
=========================================================
HTML-MAIL AUS DEN FORMULARFELDERN ERSTELLEN
=========================================================
Die Formularfelder werden als zweispaltige Tabelle dargestellt:
Feldname Feldinhalt
Feldname Feldinhalt
Dadurch beginnen alle Feldinhalte mit demselben Abstand
und stehen linksbündig exakt untereinander.
*/
function buildHtmlBody(array $bodyRows, string $intro = ''): string
{
$html = '<!DOCTYPE html>';
$html .= '<html lang="de">';
$html .= '<head>';
$html .= '<meta charset="UTF-8">';
$html .= '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
$html .= '<title>Formularnachricht</title>';
$html .= '</head>';
$html .= '<body style="margin:0; padding:0; background-color:#ffffff;">';
$html .= '<div style="'
. 'font-family:Arial, Helvetica, sans-serif;'
. 'font-size:16px;'
. 'line-height:1.5;'
. 'color:#222222;'
. 'padding:20px;'
. '">';
if ($intro !== '') {
$html .= '<div style="margin:0 0 22px 0;">'
. nl2br(
htmlspecialchars(
$intro,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
)
)
. '</div>';
}
$html .= '<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="'
. 'border-collapse:collapse;'
. 'width:100%;'
. 'max-width:800px;'
. 'font-family:Arial, Helvetica, sans-serif;'
. 'font-size:16px;'
. 'line-height:1.5;'
. 'color:#222222;'
. '">';
foreach ($bodyRows as $row) {
$fieldName = htmlspecialchars(
(string) $row['label'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
);
$fieldValue = nl2br(
htmlspecialchars(
(string) $row['value'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
)
);
$html .= '<tr>';
$html .= '<td valign="top" style="'
. 'padding:7px 25px 7px 0;'
. 'font-weight:bold;'
. 'white-space:nowrap;'
. 'vertical-align:top;'
. 'text-align:left;'
. '">'
. $fieldName
. ':'
. '</td>';
$html .= '<td valign="top" style="'
. 'padding:7px 0;'
. 'vertical-align:top;'
. 'text-align:left;'
. 'word-break:break-word;'
. 'overflow-wrap:anywhere;'
. '">'
. $fieldValue
. '</td>';
$html .= '</tr>';
}
$html .= '</table>';
$html .= '</div>';
$html .= '</body>';
$html .= '</html>';
return $html;
}
/*
=========================================================
REINE TEXTVERSION DER MAIL ERSTELLEN
=========================================================
Diese Version wird als Alternative mitgesendet, falls ein
Mailprogramm keine HTML-Mails anzeigen kann oder möchte.
*/
function buildPlainBody(array $bodyRows, string $intro = ''): string
{
$lines = [];
if ($intro !== '') {
$lines[] = $intro;
$lines[] = '';
}
$maxLabelLength = 0;
foreach ($bodyRows as $row) {
$labelLength = mb_strlen((string) $row['label']);
if ($labelLength > $maxLabelLength) {
$maxLabelLength = $labelLength;
}
}
foreach ($bodyRows as $row) {
$label = (string) $row['label'];
$value = (string) $row['value'];
// Feldbezeichnungen auffüllen, damit die Inhalte in der
// Textversion möglichst bündig untereinander beginnen.
$paddingLength = $maxLabelLength - mb_strlen($label) + 4;
$padding = str_repeat(' ', max(1, $paddingLength));
// Mehrzeilige Werte in der Textversion ebenfalls einrücken.
$valueLines = preg_split('/\R/u', $value) ?: [''];
$firstValueLine = array_shift($valueLines);
$lines[] = $label . ':' . $padding . $firstValueLine;
foreach ($valueLines as $valueLine) {
$lines[] = str_repeat(
' ',
$maxLabelLength + 5
) . $valueLine;
}
}
return implode("\n", $lines);
}
/*
=========================================================
REQUEST-METHODE PRÜFEN
=========================================================
*/
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
respond(false, 'Nur POST erlaubt.');
}
/*
=========================================================
HONEYPOT
=========================================================
Optional: funktioniert nur, wenn im Mobirise-Formular
manuell ein verstecktes Textfeld mit name="website"
hinzugefügt wurde.
*/
if (!empty($_POST['website'])) {
// Stiller Erfolg wird vorgetäuscht.
respond(true, 'Danke!');
}
/*
=========================================================
EINFACHES IP-RATE-LIMITING
=========================================================
*/
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$rateLimitFile = sys_get_temp_dir()
. '/vnnative_rl_'
. md5($ip)
. '.json';
$rateLimitWindow = 600;
$rateLimitMax = 15;
$rateData = [
'count' => 0,
'windowStart' => time(),
];
if (is_readable($rateLimitFile)) {
$existing = json_decode(
(string) file_get_contents($rateLimitFile),
true
);
if (
is_array($existing)
&& isset($existing['count'], $existing['windowStart'])
) {
$rateData = $existing;
}
}
if (time() - (int) $rateData['windowStart'] > $rateLimitWindow) {
$rateData = [
'count' => 0,
'windowStart' => time(),
];
}
if ((int) $rateData['count'] >= $rateLimitMax) {
respond(
false,
'Zu viele Anfragen, bitte später erneut versuchen.'
);
}
$rateData['count'] = (int) $rateData['count'] + 1;
file_put_contents(
$rateLimitFile,
json_encode($rateData)
);
/*
=========================================================
GETEILTE SMTP-KONFIGURATION LADEN
=========================================================
*/
$configPath = __DIR__ . '/../vn-shared/config.php';
if (!file_exists($configPath)) {
respond(
false,
'SMTP noch nicht konfiguriert - erst irgendeinen VN-Block auf dieser Seite einmal publishen.'
);
}
require $configPath;
// Stellt bereit:
//
// $smtp_host
// $smtp_port
// $smtp_encryption
// $smtp_username
// $smtp_password
// $smtp_from_email
// $smtp_from_name
// $hmac_secret
if (
empty($smtp_host)
|| empty($smtp_username)
|| empty($smtp_password)
) {
respond(
false,
'SMTP noch nicht vollständig konfiguriert.'
);
}
/*
=========================================================
CAPTCHA-PRÜFUNG
=========================================================
Entweder:
1. Eigenes Mathematik-Captcha
- captcha_answer
- captcha_token
oder:
2. hCaptcha
- h-captcha-response
- vnmailer_hcaptcha_sitekey
*/
$hcaptchaSiteKeySubmitted = trim(
(string) ($_POST['vnmailer_hcaptcha_sitekey'] ?? '')
);
if ($hcaptchaSiteKeySubmitted !== '') {
// hCaptcha-Modus war aktiv.
// Eine Antwort ist daher Pflicht.
if (empty($_POST['h-captcha-response'])) {
respond(
false,
'Bitte bestätige, dass du kein Bot bist.'
);
}
$hcaptchaConfigPath = __DIR__ . '/config.php';
if (!file_exists($hcaptchaConfigPath)) {
respond(
false,
'hCaptcha ist nicht konfiguriert (Secret-Key fehlt in den VN-Blöcke Projekteinstellungen).'
);
}
require $hcaptchaConfigPath;
// Stellt bereit:
//
// $hcaptcha_secret
if (empty($hcaptcha_secret)) {
respond(
false,
'hCaptcha ist nicht konfiguriert (Secret-Key fehlt in den VN-Blöcke Projekteinstellungen).'
);
}
$hcaptchaResponse = (string) $_POST['h-captcha-response'];
$verifyParams = [
'secret' => $hcaptcha_secret,
'response' => $hcaptchaResponse,
'remoteip' => $_SERVER['REMOTE_ADDR'] ?? '',
'sitekey' => $hcaptchaSiteKeySubmitted,
];
$verifyData = http_build_query($verifyParams);
$ctx = stream_context_create([
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $verifyData,
'timeout' => 10,
],
]);
$verifyResult = @file_get_contents(
'https://api.hcaptcha.com/siteverify',
false,
$ctx
);
$verifyJson = $verifyResult
? json_decode($verifyResult, true)
: null;
if (
!is_array($verifyJson)
|| empty($verifyJson['success'])
) {
respond(
false,
'hCaptcha-Prüfung fehlgeschlagen. Bitte erneut versuchen.'
);
}
} elseif (!empty($_POST['captcha_token'])) {
$token = (string) $_POST['captcha_token'];
$answer = trim(
(string) ($_POST['captcha_answer'] ?? '')
);
$parts = explode('.', $token, 2);
if (count($parts) !== 2) {
respond(false, 'Captcha ungültig.');
}
[$encodedPayload, $sig] = $parts;
$expectedSig = hash_hmac(
'sha256',
$encodedPayload,
$hmac_secret
);
if (!hash_equals($expectedSig, $sig)) {
respond(false, 'Captcha ungültig.');
}
$decoded = json_decode(
(string) base64_decode($encodedPayload),
true
);
if (
!is_array($decoded)
|| !isset(
$decoded['a'],
$decoded['b'],
$decoded['exp']
)
) {
respond(false, 'Captcha ungültig.');
}
if (time() > (int) $decoded['exp']) {
respond(
false,
'Captcha abgelaufen, bitte Seite neu laden.'
);
}
if (
(int) $decoded['a'] + (int) $decoded['b']
!== (int) $answer
) {
respond(
false,
'Rechenaufgabe falsch gelöst.'
);
}
}
/*
=========================================================
EMPFÄNGER BESTIMMEN
=========================================================
Der Empfänger kann mit ?to=... an die Formular-Action
angehängt werden.
Beispiel:
native-form-handler.php?to=name@example.com
Ist kein gültiger Empfänger angegeben, wird die
Absenderadresse aus der SMTP-Konfiguration verwendet.
*/
$to = trim(
(string) ($_GET['to'] ?? '')
);
if (
$to === ''
|| !filter_var($to, FILTER_VALIDATE_EMAIL)
) {
$to = $smtp_from_email;
}
if (empty($to)) {
respond(
false,
'Kein Empfänger konfiguriert (an die Formular-Action ?to=deine@email.de anhängen).'
);
}
/*
=========================================================
FORMULARFELDER EINSAMMELN
=========================================================
*/
$skipFields = [
'website',
'captcha_answer',
'captcha_token',
'copy_to_sender',
'vnmailer_id',
'h-captcha-response',
'vnmailer_hcaptcha_sitekey',
'vnmailer_subject',
'vnmailer_copy_subject',
'vnmailer_copy_intro',
];
$bodyRows = [];
$replyTo = null;
$copyToSenderRequested = !empty(
$_POST['copy_to_sender']
);
foreach ($_POST as $key => $val) {
if (in_array($key, $skipFields, true)) {
continue;
}
// Zusätzlich alles herausfiltern, das nach einem
// Captcha-Token aussieht.
//
// Beispiel:
// g-recaptcha-response
//
// Solche langen Tokens gehören nicht in die Mail.
if (preg_match('/captcha/i', (string) $key)) {
continue;
}
if (is_array($val)) {
$val = implode(', ', $val);
}
$val = is_string($val)
? mb_substr(
trim(strip_tags($val)),
0,
2000
)
: (string) $val;
$bodyRows[] = [
'label' => (string) $key,
'value' => $val,
];
// Plausibles E-Mail-Feld als Reply-To-Adresse und
// gegebenenfalls als Ziel der Absenderkopie verwenden.
//
// Durch die Prüfung werden auch Feldnamen wie
// email1, email2, e-mail1 usw. erkannt.
if (
$replyTo === null
&& preg_match('/^e-?mail\d*$/i', (string) $key)
&& filter_var($val, FILTER_VALIDATE_EMAIL)
) {
$replyTo = $val;
}
}
if (empty($bodyRows)) {
respond(
false,
'Formular war leer.'
);
}
/*
=========================================================
MAILINHALTE VORBEREITEN
=========================================================
*/
$htmlBody = buildHtmlBody($bodyRows);
$plainBody = buildPlainBody($bodyRows);
/*
=========================================================
PHPMAILER LADEN
=========================================================
*/
require __DIR__ . '/Exception.php';
require __DIR__ . '/PHPMailer.php';
require __DIR__ . '/SMTP.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;
/*
=========================================================
E-MAIL VERSENDEN
=========================================================
*/
try {
$mail = new PHPMailer(true);
// SMTP Einstellungen
$mail->isSMTP();
$mail->Host = $smtp_host;
$mail->SMTPAuth = true;
$mail->Username = $smtp_username;
$mail->Password = $smtp_password;
$mail->Port = (int) $smtp_port;
if ($smtp_encryption === 'ssl') {
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
} elseif ($smtp_encryption === 'tls') {
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
} else {
$mail->SMTPSecure = '';
$mail->SMTPAutoTLS = false;
}
// Zeichensatz
$mail->CharSet = 'UTF-8';
// Absender
$mail->setFrom(
$smtp_from_email,
$smtp_from_name
);
// Empfänger
$mail->addAddress($to);
// Antworten werden direkt an die im Formular
// eingegebene E-Mail-Adresse gesendet.
if ($replyTo) {
$mail->addReplyTo($replyTo);
}
// HTML-Mail aktivieren.
$mail->isHTML(true);
// Betreff aus dem Formular übernehmen.
$subjectFromForm = trim(
(string) ($_POST['vnmailer_subject'] ?? '')
);
// Zeilenumbrüche entfernen, um eine Header-Injection
// über das Betreff-Feld zu verhindern.
$subjectFromForm = str_replace(
["\r", "\n"],
'',
$subjectFromForm
);
$mail->Subject = $subjectFromForm !== ''
? $subjectFromForm
: 'Neue Nachricht über das Kontaktformular';
// HTML-Version der Nachricht.
$mail->Body = $htmlBody;
// Alternative reine Textversion.
$mail->AltBody = $plainBody;
$mail->send();
/*
=====================================================
KOPIE AN DEN ABSENDER
=====================================================
*/
$copyError = null;
if (
$copyToSenderRequested
&& $replyTo
) {
try {
$copyMail = new PHPMailer(true);
// SMTP Einstellungen
$copyMail->isSMTP();
$copyMail->Host = $smtp_host;
$copyMail->SMTPAuth = true;
$copyMail->Username = $smtp_username;
$copyMail->Password = $smtp_password;
$copyMail->Port = (int) $smtp_port;
$copyMail->SMTPSecure = $mail->SMTPSecure;
$copyMail->SMTPAutoTLS = $mail->SMTPAutoTLS;
// Zeichensatz
$copyMail->CharSet = 'UTF-8';
// Absender
$copyMail->setFrom(
$smtp_from_email,
$smtp_from_name
);
// Empfänger der Kopie
$copyMail->addAddress($replyTo);
// HTML-Mail aktivieren.
$copyMail->isHTML(true);
// Betreff der Absenderkopie.
$copySubjectFromForm = trim(
(string) ($_POST['vnmailer_copy_subject'] ?? '')
);
$copySubjectFromForm = str_replace(
["\r", "\n"],
'',
$copySubjectFromForm
);
$copyMail->Subject = $copySubjectFromForm !== ''
? $copySubjectFromForm
: 'Deine Nachricht (Kopie)';
// Einleitung der Absenderkopie.
$copyIntroFromForm = trim(
(string) ($_POST['vnmailer_copy_intro'] ?? '')
);
$copyIntro = $copyIntroFromForm !== ''
? $copyIntroFromForm
: 'Hier eine Kopie deiner gesendeten Nachricht:';
// HTML-Version der Absenderkopie.
$copyMail->Body = buildHtmlBody(
$bodyRows,
$copyIntro
);
// Alternative reine Textversion.
$copyMail->AltBody = buildPlainBody(
$bodyRows,
$copyIntro
);
$copyMail->send();
} catch (PHPMailerException $e) {
$copyError = $e->getMessage();
}
} elseif (
$copyToSenderRequested
&& !$replyTo
) {
$copyError = 'Keine gültige E-Mail-Adresse im Formular erkannt '
. '(Feldname muss mit "email" oder "e-mail" beginnen, '
. 'z.B. "email" oder "email1").';
}
} catch (PHPMailerException $e) {
respond(
false,
'Mailversand fehlgeschlagen.'
);
}
/*
=========================================================
ERFOLGSMELDUNG
=========================================================
*/
respond(
true,
'Danke für deine Nachricht!'
);Ach Mist, die Datei wird ja dann (natürlich) auch wieder beim Publizieren überschrieben. Kannst Du das eventuell noch einfach ändern, sonst muss ich halt dran denken. Wäre natürlich für andere User auch schöner als diese einfache Text-Mail.
Solche Dateien solltest Du möglichst in Zukunft vermeiden, denn natürlich will und oft muss man auch mal was an Deinen Scripts ändern (schon weil auch öfter mal krasse Fehler dabei sind). Das ist ja kein Zustand, wenn nur Du das machen kannst. Verstehe auch ehrlich gesagt den Sinn dabei nicht
Wer ist online?
Mitglieder in diesem Forum: Volker und 2 Gäste
