• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem bei der Mail Funktion mit PHP 7

SirROG

Mitglied
Hallo
Mein Provider stellt neu nun auch php7 zur Verfügung.
Ich habe die PHP Version nun in den Einstellungen von 5.3 auf 7.0 gewechselt und nach einigen Anpassungen an meinen alten PHP-Codes klappt nun auch alles bis eben auf den eMail Versand des Kontaktformulares.

Irgend wie klappt die Mail-Funktion nur wenn ich die eMail Adress des Versenders fix in einem String angebe.
Ich möchte aber wie vorhin das diese in einer Variable ist.
Kennt jemand eine Lösung wie ich mit PHP 7 bei der Mail Funktion die Versender eMail Adresse als Variable einfügen kann?

Hier mein alter Code (funktioniert mit php 7 nicht mehr)
PHP:
<?php
$timezone = 'Europe/Berlin';
date_default_timezone_set($timezone);
$hompage = htmlspecialchars($_POST["hompage"]); // spamschutz
$url = htmlspecialchars($_POST["url"]); // spamschutz
$name = htmlspecialchars($_POST["name"]);
$email = htmlspecialchars($_POST["email"]);
$nachricht = htmlspecialchars($_POST["nachricht"]);
$empfaenger = "[email protected]";
$betreff = "Kontakt Anfrage vom ".date("d.m.Y - H:i");
//
mail($empfaenger, $betreff, $nachricht, "From: $name <$email>");
?>


Sobald die eMail Adresse des Versender aber wie hier fix angegeben wird funktioniert es
PHP:
<?php
$timezone = 'Europe/Berlin';
date_default_timezone_set($timezone);
$empfaenger = "[email protected]";
$betreff = "Kontakt Anfrage vom ".date("d.m.Y - H:i");
$name = "Test Person";
$from = "From: $name <[email protected]>";
$text = "Text Nachricht bla bla";
mail($empfaenger, $betreff, $text, $from);
echo "eMail versendet";
?>

Nun möchte ich hier das [email protected] durch eine Variable $email ersetzen nur leider funktioniert es dann nicht mehr.

Würde mich über Hilfe sehr freuen da ich leider über die Google Suche nicht weiterkomme.
 
Werbung:
Richtig debuggen

1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.


Mit der PHP-Funktion mail() kann man E-Mails versenden. Aber damit hat der Entwickler oft viele Sorgen. Für den korrekten E-Mail Versand sind verschiedene Mail-Header notwendig. Ohne die richtigen Header bekommen viele Mail-Clients Probleme bei der Anzeige oder empfangen diese erst gar nicht. Allerdings ist es aufgrund der Komplexität sehr aufwändig, alle sich damit befassenden RFC-Dokumente selbst durchzuarbeiten und anzuwenden. Stattdessen sollte man Mailerklassen verwenden, die diese Header korrekt einbinden.

Mailerklassen:
phpMailer
Swiftmailer
ZendMail
 
Hallo bdt600

Danke für die Antwort.
Zu deinen Anmerkungen, wie schon gesagt ich habe das Problem durch Versuchen und Debugging eingrenzen können und weiss, dass es an der Variable liegt welche ich für die Versand eMail Adresse verwenden möchte. Mit einem fixen String funktioniert es, aber ich habe leider nun wirklich keine Lösung oder Lösungsansätze gefunden und habe mich deshalb mit meiner Frage an dieses Forum gewendet.
Ich denke genau für solche Probleme und Fragen gibt es auch solche Foren und dieses Forum lebt nun mal von Fragen und Antworten.

Mit meinem Mail Client hat die alte einfache Variante bestens geklappt, denke es ist wahrscheinlich nur eine kleine Anpassung an php 7 nötig und sollte deshalb die einfache mail Funktion reichen.

PS:
übrigens deine Antwort hab ich auf Google auch gefunden, nur das kopieren von mYkon's Beitrag bringt mich nun leider auch nicht weiter.
 
Werbung:
PHP:
<?php
$timezone = 'Europe/Berlin';
date_default_timezone_set($timezone);
$empfaenger = "[email protected]";
$betreff = "Kontakt Anfrage vom ".date("d.m.Y - H:i");
$name = "Test Person";
$email = "[email protected]";
$from = "From: $name <$email>";
$text = "Nachrichtentext blabla ";
mail($empfaenger, $betreff, $text, $from);
echo "eMail versendet";
echo $from;
echo $email;
?>

In der $email Variable steht: [email protected]
und in der $from Variable steht leider immer noch nur "Test Person" ohne die $email Variable und auch keine "<" ">" drin. Ich habe es auch schon mit dem Zusammensetzen von den einzelnen String Teilen von $from versucht, leider auch ohne Erfolg.
Werden die "<" ">" entfernt erscheint die eMail Adresse aber leider funktioniert es ohne "<" / ">" nicht ;)

Wie schon gesagt ersetze ich die $email Variable durch eine fixe email Adresse funktioniert das ganze ($from = "From: $name <[email protected]>";)
mit php 5.3 hat dies mit der Variabel $name auch super Funktioniert, nur leider habe ich email Beispiele nur mit älteren php Versionen im Internet gefunden.
 
Werbung:
Das sollte man beim Debuggen in der Quelltext-Ansicht des Browsers erkennen.

Btw. was heißt "es funktioniert dann nicht mehr"? Kommt eine Fehlermeldung, was sagt das error-Log, was ggfs. das mail-log dazu? Selbst bei deinem Versuch per echo anzudeuten, dass die mail-Funktion abgearbeitet wurde, kannst Du dir nicht sicher sein. Du müsstest den Rückgabewert von mail() prüfen um sicherzugehen.
 
Hallo threadi

Also in der Quelltext-Ansicht des Browsers taucht kein <$email> oder ähnliches auf.
Es wird dann keine eMail versendet da keine "<" ">" mehr über die Variable mitgegeben werden und so der Aufbau der Struktur des Absenders fehlerhaft ist. Eine PHP Fehlermeldung kommt leider auch nicht.
Was meinst du mit einem error-Log, soviel ich weiss existiert sowas bei der einfachen mail-Funktion nicht.
Der Rückgabe wert ist FALSE. Bei der mail-Funktion ist die Auswertung leider nicht all zu ausgeprägt gibt nur entweder TRUE oder FALSE zurück.
Ich habe in diveseren Foren schon nach einer Lösung gesucht aber leider sind die meisten Beispiele dort mit einer älteren PHP Version umgesetzt worden.

Hast du evtl. noch einen Lösungsansatz oder Vorschlag?
 
Werbung:
Ich schlage immer noch eine Mailerklasse w.z.B. den phpMailer vor, da man damit u.a. auch bessere Fehlerausgaben bekommt. Aber wer nicht will ...
 
Was meinst du mit einem error-Log, soviel ich weiss existiert sowas bei der einfachen mail-Funktion nicht.

Das error-Log vom Webserverdienst existiert in jedem Fall.

Der Rückgabe wert ist FALSE.

Also gibt es einen Fehler ..

soviel ich weiss existiert sowas bei der einfachen mail-Funktion nicht.

Die PHP-mail-Funktion spricht auch nur den Mailer vom System an. Und der hat i.d.R. ein eigenes Logfile. Wenn das Problem aber bereits innerhalb von mail() liegt, dann wird man dort _vermutlich_ nichts finden.

Abgesehen davon findet man im Bugtracker von PHP genau dein Problem, und es ist in der neuesten 7.0.1 bereits gelöst. Also mach ein Update.
https://bugs.php.net/bug.php?id=70145
 
Danke djheke für den Vorschlag, habe den SwiftMailer hochgeladen, den Code auf den Pfad angepasst und mit der richtigen Ziel eMail Adresse versorgt.
Leider kommt auch hier nur der Text "Mail konnte nicht versandt werden.".

Den phpMailer habe ich heute Nachmittag auch ausprobiert und versucht zum laufen zukriegen.
Leider hat dieser mit dem smtp auf dem Server ein Problem.

@threadi
Ja da gebe ich dir recht, leider komme ich bei meinem Anbieter nicht an dieses Log.

Genau es gibt einen Fehler, nur ist der Fehler nicht wircklich aussagekräftig mit nur einem FALSE xD.

Ich denke das Problem liegt innerhalb der mail Funktion da diese schon die Absender email Adresse nicht richtig interpretiert.

Danke für den Hinweis, aber die PHP Version wurde vom Anbieter schon auf die PHP Version 7.0.1 aktualisiert.


Ich habe aber nach genauem Überlegen und ausprobieren eine ganz andere Vermutung wieso es nicht geht.
Wenn ich nämlich auch bei der fixen email Adresse des Absenders eine willkürliche eMail eintrage dann geht es auch nicht sondern nur wenn ich eine eMail Adresse eintrage welche ich beim Webhoster besitze.
Meine Vermutung liegt darin das aus Schutz vor Böswilligen Absichten und zur Spamverhinderung die Mail Adresse des Absender nur eine eMail Adresse sein darf welche ich auf dem Server besitze da dieser schlussendlich auch die Mail versendet (in meinem Fall nun halt vom Formular von sich selbst an sich selbst)
Könnte ich mit dieser Vermutung richtig liegen?
Denke das evtl. mit der neuen PHP Version diese Sicherheitsstandards bezüglich Spam erhöht wurden und das es deshalb nicht mehr geht einfach eine Mail Adresse von einem Absender vorzutäuschen, damit ich gleich auf diese zur Kontaktaufnahme antworten kann.

Oder kann jemand von euch mit PHP 7.0.1 die Absender eMail Adresse frei auswähle, also vom Kontaktformular (das Feld z.B. eMail) direkt als Absenderadresse versenden?
 
Werbung:
Falls mal noch Jemand beim selben Problem stehen geblieben ist.
Die Absender Adresse kann zwar nicht verändert werden und frei gewählt werden, um bei einer Kontaktanfrage über ein Kontaktformular dem User direkt zu antworten, aber ich habe folgenden Parameter beim Mail Header noch gefunden mit diesem kann frei definiert werden wohin die Antwort auf die eMail versendet werden soll.
Hierfür kann nämlich auch eine Variable verwendet werden ;)

PHP:
$header .= "Reply-To: $antwortan\r\n";

Hier der vollständige HTML-eMail Code
PHP:
<?php
// eMail Parameter Einstellen
$empfaenger = "[email protected]"; //Mailadresse
$absender   = "Mail von meinem Website Server <[email protected]>";
$betreff    = "HTML-eMail";
$antwortan  = "[email protected]";

// Nachricht
$nachricht = '
<html>
<head>
  <title>Titel :)</title>
</head>
<body>
 Hier kann ganz normaler HTML-Code verwendet werden ;)
</body>
</html>
';

// für HTML-E-Mails muss der 'Content-type'-Header gesetzt werden
$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

$header .= "From: $absender\r\n";
$header .= "Reply-To: $antwortan\r\n";
// $header .= "Cc: $cc\r\n";  // falls an CC gesendet werden soll
$header .= "X-Mailer: PHP ". phpversion();
// vesenden der eMail
mail( $empfaenger, $betreff, $nachricht, $header);
echo "Mail wurde gesendet!";
?>

Mit PHP eMails versenden -> Hier geht's zum Tutorial
 
Zurück
Oben