HTML Mail versendet "Subject" nicht

ExEdekaWorker

Newbie
Registriert
Jan. 2020
Beiträge
3
Hallo zusammen, ich bin neu hier und meine Programmierkenntnisse halten sich leider echt in Grenzen. Ich bin dabei, ein HTML Email Formular aufzusetzen. Dort kommt allerdings dann immer "Subject is required". Dennoch wird die Email versendet, was man aber auf der Website selbst nicht erkennt. Dennoch fehlt dann immer das "Subject". Wenn man nun den Eintrag

// MSG SUBJECT
if (empty($_POST["msg_subject"])) {
$errorMSG .= "Subject is required ";
} else {
$msg_subject = $_POST["msg_subject"];
}

aus der PHP DAtei herauslöscht, sieht zwar der User, dass die Email versendet wurde, allerdings kommt natürlich weiterhin der Betreff nicht mit.
Hier einmal der Code (Hoffe, es ist ok wenn ich den direkt reinkopiere, oder hätte ich besser die Dateien hochladen sollen?):

HTML:

<div class="col-lg-5 col-md-8">
<div class="form">
<div id="sendmessage">Your message has been sent. Thank you!</div>
<div id="errormessage"></div>
<form action="" method="post" role="form" class="contactForm">
<div class="form-group">
<input type="text" name="name" class="form-control" id="name" placeholder="Your Name" data-rule="minlen:4" data-msg="Please enter at least 4 chars" />
<div class="validation"></div>
</div>
<div class="form-group">
<input type="email" class="form-control" name="email" id="email" placeholder="Your Email" data-rule="email" data-msg="Please enter a valid email" />
<div class="validation"></div>
</div>
<div class="form-group">
<input type="text" class="form-control" name="subject" id="subject" placeholder="Subject" data-rule="minlen:4" data-msg="Please enter at least 4 chars of subject" />
<div class="validation"></div>
</div>
<div class="form-group">
<textarea class="form-control" name="message" rows="7" data-rule="required" data-msg="Please write something for us" placeholder="Message"></textarea>
<div class="validation"></div>
</div>
<div class="text-center"><button type="submit">Send Message</button></div>
</form>
</div>
</div>


JS:

jQuery(document).ready(function($) {
"use strict";

//Contact
$('form.contactForm').submit(function() {
var f = $(this).find('.form-group'),
ferror = false,
emailExp = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i;

f.children('input').each(function() { // run all inputs

var i = $(this); // current input
var rule = i.attr('data-rule');

if (rule !== undefined) {
var ierror = false; // error flag for current input
var pos = rule.indexOf(':', 0);
if (pos >= 0) {
var exp = rule.substr(pos + 1, rule.length);
rule = rule.substr(0, pos);
} else {
rule = rule.substr(pos + 1, rule.length);
}

switch (rule) {
case 'required':
if (i.val() === '') {
ferror = ierror = true;
}
break;

case 'minlen':
if (i.val().length < parseInt(exp)) {
ferror = ierror = true;
}
break;

case 'email':
if (!emailExp.test(i.val())) {
ferror = ierror = true;
}
break;

case 'checked':
if (! i.is(':checked')) {
ferror = ierror = true;
}
break;

case 'regexp':
exp = new RegExp(exp);
if (!exp.test(i.val())) {
ferror = ierror = true;
}
break;
}
i.next('.validation').html((ierror ? (i.attr('data-msg') !== undefined ? i.attr('data-msg') : 'wrong Input') : '')).show('blind');
}
});
f.children('textarea').each(function() { // run all inputs

var i = $(this); // current input
var rule = i.attr('data-rule');

if (rule !== undefined) {
var ierror = false; // error flag for current input
var pos = rule.indexOf(':', 0);
if (pos >= 0) {
var exp = rule.substr(pos + 1, rule.length);
rule = rule.substr(0, pos);
} else {
rule = rule.substr(pos + 1, rule.length);
}

switch (rule) {
case 'required':
if (i.val() === '') {
ferror = ierror = true;
}
break;

case 'minlen':
if (i.val().length < parseInt(exp)) {
ferror = ierror = true;
}
break;
}
i.next('.validation').html((ierror ? (i.attr('data-msg') != undefined ? i.attr('data-msg') : 'wrong Input') : '')).show('blind');
}
});
if (ferror) return false;
else var str = $(this).serialize();
var action = $(this).attr('action');
if( ! action ) {
action = 'contactform/contactform.php';
}
$.ajax({
type: "POST",
url: action,
data: str,
success: function(msg) {
// alert(msg);
if (msg == 'OK') {
$("#sendmessage").addClass("show");
$("#errormessage").removeClass("show");
$('.contactForm').find("input, textarea").val("");
} else {
$("#sendmessage").removeClass("show");
$("#errormessage").addClass("show");
$('#errormessage').html(msg);
}

}
});
return false;
});

});


PHP:

<?php

$errorMSG = "";

// NAME
if (empty($_POST["name"])) {
$errorMSG = "Name is required ";
} else {
$name = $_POST["name"];
}

// EMAIL
if (empty($_POST["email"])) {
$errorMSG .= "Email is required ";
} else {
$email = $_POST["email"];
}

// MSG SUBJECT
if (empty($_POST["msg_subject"])) {
$errorMSG .= "Subject is required ";
} else {
$msg_subject = $_POST["msg_subject"];
}


// MESSAGE
if (empty($_POST["message"])) {
$errorMSG .= "Message is required ";
} else {
$message = $_POST["message"];
}

//Add your email here
$EmailTo = "kontakt@xxx.de";
$Subject = "New Message Received";

// prepare email body text
$Body = "";
$Body .= "Name: ";
$Body .= $name;
$Body .= "\n";
$Body .= "Email: ";
$Body .= $email;
$Body .= "\n";
$Body .= "Subject: ";
$Body .= $msg_subject;
$Body .= "\n";
$Body .= "Message: ";
$Body .= $message;
$Body .= "\n";

// send email
$success = mail($EmailTo, $Subject, $Body, "From:".$email);

// redirect to success page
if ($success && $errorMSG == ""){
echo "success";
}else{
if($errorMSG == ""){
echo "Something went wrong :(";
} else {
echo $errorMSG;
}
}

?>



Ich danke euch schonmal für eure Hilfe!! MfG Leo
 
Im HTML Code heisst das Feld "subject", im PHP wird "msg_subject" abgefragt.
 
  • Gefällt mir
Reaktionen: GTrash81, RalphS und Mihawk90
PHP:
// MSG SUBJECT
if (empty($_POST["msg_subject"])) {
$errorMSG .= "Subject is required ";
} else {
$msg_subject = $_POST["msg_subject"];
}

[...]

$Body .= $msg_subject;

Du checkst ja nur, ob es im POST gesetzt ist und überträgst in eine Variable, die du später verwendest.

Wenn es aber nicht vorhanden ist dann setzt du nur eine Fehlermeldung und verwendest die (dann leere) Variable trotzdem.

Du musst dann schon irgendwo auch abbrechen wenn was fehlt ;)

Das was @Lawnmower sagt noch zusätzlich.

PS: Arbeite mit [code] Tags im Forum, dann wird es lesbarer...
Ergänzung ()

Mir fällt aber gerade mal auf...
Meinst du das Subject was später im Mail Client auch ankommen soll? Oder das was der Kunde im Formular einträgt?

Denn:
PHP:
$Subject = "New Message Received";

[...]

$success = mail($EmailTo, $Subject, $Body, "From:".$email);

Sollte auf jeden Fall gehen.
Ergänzung ()

Achja und noch eine Sache...

Ist ja schön, dass du deine ganze Validierung in JavaScript gebaut hast.
Was machst du wenn dein Kunde kein JavaScript hat? :)

Die regEx zur E-Mail Validierung sollte übrigens noch ein klein wenig länger sein ;) :
https://emailregex.com/
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hayda Ministral, GTrash81 und Lawnmower
Super danke euch!
Lawnmower schrieb:
Im HTML Code heisst das Feld "subject", im PHP wird "msg_subject" abgefragt.
Das wars :) Wenn man zu blind ist für die einfachsten Dinge...
Und ja, ich meinte das Subject, welches der Kunde einträgt. Das im Mail Client kann ich ja im PHP direkt eiintragen. Und es kam auch schon immer eine Fehlermeldung, wenn etwas nicht ausgefüllt war, nur eben bisher auch beim Subject, obwohl es ausgefüllt war.

Mihawk90 schrieb:
Ist ja schön, dass du deine ganze Validierung in JavaScript gebaut hast.
Was machst du wenn dein Kunde kein JavaScript hat? :)

Die regEx zur E-Mail Validierung sollte übrigens noch ein klein wenig länger sein ;) :
https://emailregex.com/

Das ist eine gute Frage haha was würdet ihr denn empfehlen wie ich das anders lösen kann? Und bitte schon mit Vorlagen wenns geht denn so begabt bin ich im programmieren (noch) nicht. Und das mit regEX hab ich auch noch nicht durchblickt, sry:/. Mfg
 
Das mit der RegEx war auch nicht ganz ernst gemeint, siehe hier:
https://stackoverflow.com/a/20773069

Die Validierung macht man eigentlich immer server-seitig. Alles das was du in JavaScript hast hätte auch genauso in PHP umgesetzt werden können (und sollte es).
Client-seitige Validierung ist schön für denjenigen, der das Formular ausfüllt, weil man dann nicht erst absenden muss um festzustellen dass was fehlt. Spätestens wenn die Spambots dich mit cURL Anfragen bombardieren wirst du aber merken, dass das keine gute Idee war. Eine POST Anfrage muss ja nicht zwingend von einem Webbrowser aus kommen.

Mittlerweile hat aber auch HTML5 selbst sowas, das brauchst du also gar nicht mal implementieren per JavaScript.

Lies dir mal die Seite mit Beispielen durch:
https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation
 
  • Gefällt mir
Reaktionen: pcBauer und Lawnmower
Super ich danke dir ich schaue mir das bei Gelegenheit mal genauer an und versuche mein Glück :)
 
  • Gefällt mir
Reaktionen: Mihawk90
Zurück
Oben