Fragen und Problem mit Pear Mail

Jan-Frederik Stieler

Monsterator
Moderator
Hallo,
ich habe ein paar Probleme mit einem Kontaktformular. Ich benutze pear mail.

  • Habe ich eine Fehler bei der Angabe der SMTP-infos gemacht?
  • Wenn das Formular abgesendet wird und ein validationfehler auftaucht, wie kann ich umgehen das PEAR::isError($mail) ausgeführt wird. Das sollte nur ausgeführt werden wenn das wirklich rasugeht. Kann ich das überhauüt überprüfen?
    Den das Absenden mit folgendem validate ist ja mit dem abschicken der Mail identisch.
  • Wie kann ich das textarea-Element überprüfen ob etwas drinnensteht?
    Sobald ich
PHP:
<?php echo $description?>
zwischen die beiden Element-teile schreibe wird das als befüllt validiert.


PHP:
<?php
	error_reporting(E_ALL);
	
	require_once 'Mail.php';
										
	//Validating the form									
	if ($_SERVER['REQUEST_METHOD'] == 'POST') {
		if (empty($_POST['name'])) {
			$nameErr = "error";
		}
		else {
			$name = $_POST['name'];
		}
				
		if (empty($_POST['email']))  {
			$emailErr = 'error';
		}
		else {
			$email = $_POST['email'];
		}
										    
						    
		if (empty($_POST['description']))  {
			$txtErr = 'error';
		}
		else {
			$txt = $_POST['description'];
		}
	}
									
	//Prüfen ob Formular abgesendet wird
	if(isset($_POST['javascript'])){								
											
		$name = trim(htmlspecialchars(str_replace(array("\r\n", "\r", "\0"), array("\n", "\n", ''), $_POST['name']), ENT_COMPAT, 'UTF-8'));
		$email = trim(htmlspecialchars(str_replace(array("\r\n", "\r", "\0"), array("\n", "\n", ''), $_POST['email']), ENT_COMPAT, 'UTF-8'));
		$to = 'mail@mailer.de';
		$subject = 'Kontaktformular Webseite';
		$description = $_POST['description'];
		$body = 'Name: '. $name . '\r\n' . 'E-Mail Adresse: '. $email . '\r\n' . 'War javascript eingeschaltet: ' . $_POST['javascript'] . 'Nachricht:' . $description;
											
		$host = "mail.mailer.de";
		$username = "mail@mailer.de";
		$password = "XYZ";
											
		$headers = array (
			'From' => $email,
			'To' => $to,
			'Subject' => $subject
		);
											
		$smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password));

		$mail = $smtp->send($to, $headers, $body);
											
		if (PEAR::isError($mail)) {
			echo('<div class="alert alert-danger">
	  			<button type="button" class="close" data-dismiss="alert">&times;</button>
	  			<strong>Warnung!</strong> Es ist ein Fehler aufgetreten.
				</div>');
		}else {<div class="alert alert-success">
	  			<button type="button" class="close" data-dismiss="alert">&times;</button>
	  			Ihre Nachricht ist erfolgreich verschickt worden.
				</div>
		}
	}
?>
<form method="post" id="contact-form" class="control-group" action="">
    	<div class="controls controls-row">
		<input id="name" name="name" value="<?php echo htmlspecialchars($name);?>" type="text" class=" col-md-6 <?php echo $nameErr;?>" placeholder="Ihr Name" /> 
		<input id="email" name="email" value="<?php echo htmlspecialchars($email);?>" type="email" class=" col-md-5 pull-right <?php echo $emailErr;?>" placeholder="Ihre E-Mail Adresse" />
	</div>
	<div class="controls">
		<textarea id="message" name="description" class="col-xs-12 col-md-12 <?php echo $nameErr;?>" placeholder="Ihre Nachricht" rows="10" style="padding-left: 6px;"><?php echo $description?></textarea>
		<script>
			$(function(){
				$('.jsvalidate').val('Ja');
			});
		</script>
		<input type="hidden" class="jsvalidate" name="javascript" value="Nein" />
	</div>
	<div class="controls">
		<button type="reset" name="reset" class="btn col-md-3 input-medium pull-left" style="margin-top: 11px; margin-left: 0">Zurücksetzen</button>
		<button type="submit" name="submit" class="btn col-md-3 input-medium pull-right" style="margin-top: 11px;">Senden</button>
	</div>
</form>

Viele Grüße
 
Hi,
danke aber ich möchte und kann keine anderen PHP Klassen installieren. Da ich keinen Root- oder VServer etc. habe.
Nur so als kleine Anmerkung, Beiträge wie deiner werden bei uns normalerweise als Werbung gelöscht.
Ich lasse das stehen weil es kein kommerzielles Projekt ist.

Zu meinem Problemen. Nr1 ist erledigt. Die Mails kamen so ca. 7Std. später an.
Keine Ahnung was mein Provider da für ein Problem hat.

Viele Grüße
 
Guten Morgen,

zu 2.: Was wäre für dich eine Validierung? Wenn du damit die Prüfung der einzelnen Formular-Felder meinst, das wäre schon lösbar. Du hast ja schon eine Art Validierung eingebaut: die ganzen if-Statements. Wenn du innerhalb des Fehlerfalls noch eine zusätzliche Variablen auf - sagen wir - false setzt, kannst du eine Prüfung um diese Kondition erweitern:

PHP:
if(isset($_POST['javascript']) && $send == true)

Das heißt, du setzt die $send ganz oben erstmal auf true und im Fehlerfall auf false.

3. Ich sehe nirgends eine Code-Zeile, die $description auf einen Wert setzt. Ist das der komplette Code? Oder wird der hier irgendwo rein inkludiert? Dann könnte es sein, dass $description von einem anderen Script versorgt wird. Ist den in der Text-Area ein Text zu sehen? Wenn nein, dann hat $description evtl. ein Leerzeichen drin. Das könntest du durch die Funktion trim() entfernen:

PHP:
<textarea id="message" name="description" class="col-xs-12 col-md-12 <?php echo $nameErr;?>" placeholder="Ihre Nachricht" rows="10" style="padding-left: 6px;"><?php echo trim($description);?></textarea>

Allerdings kannte ich bis eben das Attribute "placeholder" der Textarea noch nicht. Kann es sein, dass wenn man keinen Text eingibt, der Placeholder-Text als Textarea-Wert übertragen wird? Dann könntest du den ja als if-Kondition nehmen:

PHP:
if( isset($_POST['description']) && $_POST['description'] != 'Ihre Nachricht' ) {
  ... $description ist möglicherweise valide ...
}
 
1.) Das sollte keine Webrung sein, sondern ein ernst gemeinter alternativvorschlag.
2.) Dafür brauch man keinen root-Zugriff, sondern maximal einen FTP Zugang. Und den hat man in 99,9% der Fälle.

Edit:
Hier nochmal die Begründung warum ich die angesprochene PEAR-erweiterung nich benutzen würde:
Ich habe mir den PEAR Mailer mal angeschaut, das letzte Update ist nun knapp 4 Jahre her (1.2.0 (stable) was released on 2010-03-01). Der Threadersteller sollte wissen, dass damit in Zukunft auf jedenfall neue Probleme auftreten könnten (ich glaube nicht, dass das ding noch weiterentwickelt wird) und er sogar Sicherheitslücken in seiner Applikation damit in kauf nimmt.
 
Zuletzt bearbeitet:
Hi,
ich habe dir bzgl. Werbung erklärt wie wir das hier handhaben. Beiträge mit einem Satz werden nunmal gerne von Leuten verwendet die Werbung in die Beiträge einschleusen.
Da ich dich jetzt aus dem Forum her nicht kenne war es mir leider nicht möglich deine Kompetenz zu kennen. Also es war eher als Informelle Mitteilung und weniger als Massregelung gedacht!

So nun wieder zu meinem Problem.
Also es ist das erste mal das ich ein Mailformular so plain in PHP schreibe, deshalb bin ich grundsätzlich für jede Anregung/Information dankbar.
Mir ging es in erster Linie darum eine Mail über das SMTP-Protokol zu versenden. Deshalb habe ich mir PEAR Mail rausgesucht weil es eben auch oft verwendet wird und es ist auf dem Server installiert.

Ich habe bei recherchen wie man ein Mailformular mit PHP erstellt nur zwei Möglichkeiten gefunden. Einmal mit PHP mail und eben Pear Mail.
Pearmail war mir von dem Aufbau her sympatischer :). Aber wenn etwas anderes sicherer ist und sich einfach per FTP hochladen lässt, warum nicht.

Mir geht es darum das ich nicht schon wieder als Spamschleuder herhalten muss.

@Saftmeister: die Var $description habe ich in der Validierung vergessen gehabt zu ersetzen.
Die ganze validierung von $description ist Müll. Ich hab da irgendeinen Mist zusammengeschrieben. War wohl etwas zu spät. Das muss ich mir nochmal anschauen.

Wie sieht es mit dem Header der Mail aus? Sollte ich hier noch irgendwie anders überprüfen ob sich da jemand daran zu schaffen gemacht bzgl. BCC oder CC injection (keine Ahnung ob man das so nennt :)).

Grüße
 
Entschuligung wenn ich kurz zwischen frage.
Mir geht es darum das ich nicht schon wieder als Spamschleuder herhalten muss.
Wie kommt man von den Listen wieder runter?
Ich nutze übrigens auch swiftmailer da es einen den Headeraufbau abnimmt und das einbinden der Klassen in 5-10 Zeilen getan ist. Allerdings bin ich nun auch bei web.de auf der Spamlist gelandet ich nehme an das kommt durch meine Newsmail letztens oder weiß der Geier.

Das HTML Markup der Message selber ist eine Zumutung und Frickelei denn da kocht jeder Provider sein eigenes Süppchen.
Bei Intresse kann ich dieses Markup mit Hintergrundbildern mal zeigen auch wenn da noch einiges dran verbesserbar ist wird es zumindest bei allen Providern dargestellt.
http://www.campaignmonitor.com/css/

freundliche Grüße Joe.
 
Wie sieht es mit dem Header der Mail aus? Sollte ich hier noch irgendwie anders überprüfen ob sich da jemand daran zu schaffen gemacht bzgl. BCC oder CC injection (keine Ahnung ob man das so nennt ).

Pear-Mail ist wie Swiftmailer gegen Header Injection abgesichert. Es wird eine Funktion während des sendens aufgerufen die alles rausfiltert:
PHP:
function _sanitizeHeaders(&$headers)
{
    foreach ($headers as $key => $value) {
        $headers[$key] = preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', null, $value);
    }
}
PEAR Mail’s Mail.php

Du brauchst also nicht extra nach Injections zu suchen siehe auch hier:
http://www.securephpwiki.com/index.php/Email_Injection

Gruß Joe.
 
Zurück