PHP Mailempfaenger dynamisch einsetzen

User007

Admiral
Registriert
Feb. 2008
Beiträge
7.335
Hey Leuts,
könnt mal ein wenig Hilfe bei so 'nem "kleinen" Problem gebrauchen.

Ich möchte ein Kontaktformular ("kontakt.php") so flexibel halten, dass, je nachdem von wo auf das Formular verwiesen wird (und somit evtl. auch Variablen mit der URL übertragen werden) ein entsprechend anderer Mailempfänger eingesetzt wird.
Bsp. für die Struktur:
1. Verweis = ".../kontakt.php" => Mailempfänger 1 (Standard)
2. Verweis = ".../kontakt.php?id=1" => Mailempfänger 2
3. Verweis = ".../kontakt.php?id=3" => Mailempfänger 3

Dazu habe ich folgenden
PHP:
<?php
include("./every/pre_all1.inc.php");
include("./every/pre_all2.inc.php");
// Empfänger/Betreff je nach geklicktem Link dynamisch angepasst...
if($_REQUEST["id"])
{
  $id=$_REQUEST["id"];
  switch($id)
  {
    case 1:$recipient=$mail1;$subject="Kontakt zum Webmaster über Homepage \"...\"";
           $an_text=$zact1;$pre_text="Hallo lieber Webmaster,\n\n";break;
    case 2:$recipient=$mail2;$subject="Kontakt zur Geschäftsleitung über Homepage \"...\"";
           $an_text=$zact2;$pre_text="Geehrte Gesch&auml;ftsleitung,\n\n";break;
    case 3:// Dekodierung u. Zerlegung der Variable "ref"
		   $ref_array=split('[&]',base64_decode($_REQUEST["ref"]));
		   // Zuordnung von Name+Mail-Adresse des verlinkten Gästebucheintrags
		   $gb_user_name=substr($ref_array[0],2);$gb_user_mail=substr($ref_array[1],2);
		   $recipient=$gb_user_mail;$subject="Kontakt via Gästebuch von ...";
		   $an_text=$zact3;$pre_text="Hallo ".$gb_user_name.",\n\n";break;
    case 9:$recipient=$mail9;$subject="Kontakt über Homepage \"...\"";
           $an_text=$zact9;$pre_text="Hallo liebes Design-Team,\n\n";break;
  }
}
// ...sonst Empfänger/Betreff als Standard-Kontakt eingefügt
else
{
  $recipient=$mail4; # Empfänger-Mail-Adresse
  $subject="Kontakt über Homepage \"...\""; # Betreff
}
?>
erstellt und ganz an den Anfang des Doks gesetzt. Die unterschiedlichen Mailadressen sind per Variablen $mail1...9 in der "pre_all2.inc.php" global definiert.
Leider wird immer nur der Standard-Kontakt benutzt. Kann da bitte mal jemand 'nen Blick drauf werfen und hat 'ne Idee dazu?

Ach ja, das Ganze wird bei 1&1 gehostet - die haben aber lt. Auskunft des Supports keinerlei (außergewöhnliche) Einschränkungen was Scriptausführung betrifft.
 
Der Fehler liegt wahrscheinlich an der Zeile
Code:
if($_REQUEST["id"])

Bzw:Prüf doch mal mit "echo" Anweisungen wie der Code verzweigt...
 
Sorry, mein Fehler! Vergessen zu erwähnen, dass ich das schon gemacht hab. Mit
PHP:
{
  $id=$_REQUEST["id"];echo $id;
  switch($id)
  {
gibt er mir jedesmal korrekt den übergebenen Wert der variable $id aus.
Vllt. hilft das ja noch...weiter unten auf der Seite (nach den Form-Elementen) ist der Mailversand folgendermaßen gestaltet.
PHP:
		#echo '<p>$recipienct = '.$recipient.'<br />$subject = '.$subject.'</p>'; # zum Test
		@mail($recipient, $subject, nl2br($mail_body), $header);
Da hab ich mir auch schon mal kurz vor'm Versand per echo alle rel. Daten zur Kontrolle ausgeben lassen. Da steht's dann, wie ich's haben will - machen tut's dann aber was anderes...
 
Und wenn du vor dem mail-Befehl mal die Variablen ausgeben lässt?

Übrigens wäre anstatt "if($_REQUEST["id"])" "if(isset($_REQUEST['id'])" das Mittel der Wahl (wobei das das Problem sicher nicht löst). Du könntest aber mal "$id=intval($_REQUEST['id']);" probieren. Außerdem geht ein default-Case im switch ab. Wenn da jetzt 4 übergeben wird oder was größer 9, dann passiert nix...außerdem überprüfst du in case 3 gar nicht ob ref überhaupt übergeben wurde und deiner erwarteten Form entspricht.

Des Weiteren zeigst du uns nicht, wie du $mail_body zusammensetzt.
 
Zuletzt bearbeitet:
Also,...
1.
BerniG schrieb:
Und wenn du vor dem mail-Befehl mal die Variablen ausgeben lässt?
siehe mein Beitrag Gestern 17:20 - bitte aufmerksamer lesen!
2.
BerniG schrieb:
Übrigens wäre anstatt "if($_REQUEST["id"])" "if(isset($_REQUEST['id'])" das Mittel der Wahl...
Hatte ich vorher auch - hab's mal zum Testen abgeändert, hatte aber (wie du selbst schon angemerkt hast) wohl nix damit zu tun.
3.
BerniG schrieb:
Du könntest aber mal "$id=intval($_REQUEST['id']);" probieren.
Ok, versuch ich mal.
4.
BerniG schrieb:
Außerdem geht ein default-Case im switch ab. Wenn da jetzt 4 übergeben wird oder was größer 9, dann passiert nix...
Ich dachte, das wär nicht notwendig, da ich ja diese Links fest mit den Werten definiert habe und sonst gab's weiter keine. Allerdings könnte ja jemand händisch mit diesem Wert über die URL "spielen". Insofern - danke für den Hinweis.
5.
BerniG schrieb:
...außerdem überprüfst du in case 3 gar nicht ob ref überhaupt übergeben wurde und deiner erwarteten Form entspricht.
$ref wird nur bei id=3 übergeben. Wie evtl. aufgefallen, stammt das aus einem GB-Eintrag. Hier werden zum Schutz vor Spamming Name und E-Mail-Adresse kodiert und in die Variable geschrieben und mit dem Link übergeben. Daher steht fest, dass und in welcher Form er übergeben wird und bedarf keiner Prüfung, wie ich meine!
6.
BerniG schrieb:
Des Weiteren zeigst du uns nicht, wie du $mail_body zusammensetzt.
Stimmt. Da ich mir auch schon gedacht hab, dass eine Fehleranalyse so nicht erfolgversprechend sein kann, gibt's den kompletten Quelltext des Konstrukts hier. Sollte so zusammengesbastelt sein, dass man's jetzt auch austesten kann. Hoffe, die Kommentare helfen einigermaßen die Struktur nachzuvollziehen...
 
Hat denn wirklich keiner 'ne Idee, woran's liegen kann?
Gerne auch Vorschläge, wie man's anders lösen kann!
 
Deine Switch-Case Struktur funktioniert einwandfrei.

PHP:
<?

  //$id=$_REQUEST["id"];
  $id = 3;

  switch($id)
  {
    case 1:
		$recipient=$mail1;
		$subject="Kontakt zum Webmaster über Homepage \"...\"";
        $an_text=$zact1;
		$pre_text="Hallo lieber Webmaster,\n\n";
		echo "DEBUG:case1";
		break;
    case 2:
		$recipient=$mail2;
		$subject="Kontakt zur Geschäftsleitung über Homepage \"...\"";
        $an_text=$zact2;
		$pre_text="Geehrte Gesch&auml;ftsleitung,\n\n";
		echo "DEBUG:case2";
		break;
    case 3:
		// Dekodierung u. Zerlegung der Variable "ref"
        $ref_array=split('[&]',base64_decode($_REQUEST["ref"]));
        // Zuordnung von Name+Mail-Adresse des verlinkten Gästebucheintrags
        $gb_user_name=substr($ref_array[0],2);
		$gb_user_mail=substr($ref_array[1],2);
        $recipient=$gb_user_mail;
		$subject="Kontakt via Gästebuch von ...";
        $an_text=$zact3;$pre_text="Hallo ".
		$gb_user_name.",\n\n";
		echo "DEBUG:case3";
		break;
    case 9:
		$recipient=$mail9;$subject="Kontakt über Homepage \"...\"";
        $an_text=$zact9;$pre_text="Hallo liebes Design-Team,\n\n";
		echo "DEBUG:case9";
		break;
 //default!
  }
?>
Du solltest dir angewöhnen mit POST GET COOKIE zu arbeiten, diese greifen gezielter auf die Variablen zu und es macht die Wartung deutlich einfacher, da die Übergabeform bekannt ist. Desweiteren würde ich empfehlen mit den vorhanden Variablen, in deinem Fall REQUEST[id] zu Arbeiten. Es macht wenig Sinn eine Variable ohne manipulation in eine andere zu schreiben.


Wie bereits gesagt, die Switch Case erüllt seinen zweck. Somit würde ich einfach mal Schlussfolgern, dass der Fehler bei der Übergabe passiert.
Prüfe dein Variableninhalt! -> ()int$id; oder intval($id);


Btw.

User007 schrieb:
Also,...
1. siehe mein Beitrag Gestern 17:20 - bitte aufmerksamer lesen!
Ganz schön pampig für jemaden, der Hilfe bzw Ratschläge sucht.
 
Klar, aber trotzdem danke, dass du dir die Mühe gemacht hast!
$_REQUEST[] benutz ich eigtl. nur in der Entwicklungsphase, weil's eben halt auf alle Übergabevarianten zugreift.
web2 schrieb:
Desweiteren würde ich empfehlen mit den vorhanden Variablen, in deinem Fall REQUEST[id] zu Arbeiten. Es macht wenig Sinn eine Variable ohne manipulation in eine andere zu schreiben.
Erläuter' mir das bitte mal - was genau meinst du?
web2 schrieb:
Prüfe dein Variableninhalt! -> ()int$id; oder intval($id);
intval() steht doch schon im Quelltext!?

Und übrigens...
web2 schrieb:
Seh ich aber gar nicht so, schließlich hab ich höflich bitte geschrieben - kann ja auch nix dafür, wenn's anscheinend nicht richtig verfolgt wird!
 

Ähnliche Themen

M
Antworten
7
Aufrufe
8.873
Mr. Snoot
M
Zurück
Oben