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

E-Mail Versand aus Datenbank per PHP

profimong

Neues Mitglied
Guten Abend.

Ich lese aus meiner Datenbank Werte aus und und möchte diese dann per Mail versenden.
Wenn ich mir die Daten anzeigen lasse ist alles korrekt. In der Mail sind diese aber nicht dabei. Woran kann das liegen.

PHP:
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT Datum, News FROM $table WHERE Datum <= CURDATE() +5 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

while($row = mysql_fetch_array($ergebnis))
    {
        echo ("
             ".$row['Datum']." ".$row['News']."<br>
        ");
    }


$empfaenger = '[email protected]';
$betreff = 'Der Betreff';
$nachricht= "Nachricht mit folgendem Inhalt: ".$row['Datum']." ".$row['News']."";
$header = 'From: [email protected].' . "\r\n" .
    'Reply-To: [email protected].' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    
mail($empfaenger, $betreff, $nachricht, $header);

?>
Danke für Eure Hilfe
 
Weil Du die while-Schleife mit dem $row-Array schließt bevor Du den E-Mail-Text zusammensetzt. Beim Setzen von $nachricht steht in $row nichts mehr drinne, weil diese Zeile sich nicht in der while-Schleife befindet.
 
Also so:

PHP:
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT Datum, News FROM $table WHERE Datum <= CURDATE() +5 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

while($row = mysql_fetch_array($ergebnis)) {
  echo $row['Datum']." ".$row['News']."<br>";

$empfaenger = '[email protected]';
$betreff = 'Der Betreff';
$nachricht= "Nachricht mit folgendem Inhalt: ".$row['Datum']." ".$row['News']."";
$header = 'From: [email protected].' . "\r\n" .
    'Reply-To: [email protected].' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    
mail($empfaenger, $betreff, $nachricht, $header);
    }


?>
 
Danke für Eure Hilfe. Ich bekomme jetzt die Mail mit dem gewünschten Inhalt. Problem ist nur, wenn ich mehr als eine Rückgabe der Abfrage habe wird die Mail sooft verschickt wie ich Ergebnisse habe. 5 Zeilen in meiner Datenbank = 5 einzelne Mails. Kann ich die Ergebnisse in einer Tabelle bündeln und dann erst per Mail versenden.

Danke
 
PHP:
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT Datum, News FROM $table WHERE Datum <= CURDATE() +5 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

while($row = mysql_fetch_array($ergebnis)) {
  echo $row['Datum']." ".$row['News']."<br>";

$empfaenger = '[email protected]';
$betreff = 'Der Betreff';
$nachricht= "Nachricht mit folgendem Inhalt: ".$row['Datum']." ".$row['News']."";
$header = 'From: [email protected].' . "\r\n" .
    'Reply-To: [email protected].' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    }
    
mail($empfaenger, $betreff, $nachricht, $header);

Du meinst, dass du 5 Zeilen (== News) in der Datenbank hast und die mail 5 Mal rausgeht?
Also gnau so viele Mails wie Datensätze vorhanden.

Hmm... mach mal mail aus der Schleife.
 
Wenn Du schon eine Komplettlösung lieferst, dann aber richtig:

Code:
$nachricht = "";
while($row = mysql_fetch_array($ergebnis)) {
  $nachricht .= "Nachricht mit folgendem Inhalt: ".$row['Datum']." ".$row['News']."\n";
    }

$empfaenger = '[email protected]';
$betreff = 'Der Betreff';
$header = 'From: [email protected].' . "\r\n" .
    'Reply-To: [email protected].' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    
mail($empfaenger, $betreff, $nachricht, $header);
 
Ich bin nun soweit, dass ich die Mail mit dem nächsten Spiel bekomme.

Datenbankaufbau:

ID - Datum - Anstoss - Begegnung - Ort

ich möchte das ganze dann per Cronjob machen, wie das geht weiß ich.

Nun habe ich aber doch noch eine kleine Fragen.

Hier erst mal mein aktueller Code

PHP:
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT date_format(Datum, '%d.%m.%Y')AS datum2, time_format(Anstoss, '%H:%i Uhr')AS time, Begegnung, Ort FROM $table WHERE Datum <= CURDATE() +5 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

if (mysql_num_rows($ergebnis)>0) { 

while($row = mysql_fetch_array($ergebnis)) {
$date = $row['Datum'];
$time = $row['Anstoss'];
$begegnung = $row['Begegnung'];
$ort = $row['Ort'];
$text .= $row['Datum']." - ".$row['Anstoss']." - ".$row['Begegnung']." - ".$row['Ort']."\n";
}
}
else { 
$text = "Diese Woche findet kein Spiel statt";
}



$mail_empfaenger="[email protected]";
$mail_absender="[email protected]";
$betreff="SPIEL - NEWSLETTER";
mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
ch bekomme jetzt die Mail und es wird mir folgendes angezeigt was mir auch klar ist.

17.08.2010 - 10:00 Uhr - Testspiel - Heimspiel


Wie kann ich die Anzeige umformatieren, das folgendes als E-Mail ankommt

Nächstes Spiel

17.08.2010 - 10:00 Uhr

Testspiel

Heimspiel

Vielen Dank, Johannes
 
Dazu musst Du HTML-Mails erzeugen. Für diese brauchst Du einen text/html-Content-type der URL sowie HTML-Code in dem erzeugten E-Mail-Nachrichtentext. Schau dich mal dazu um, es gibt genügend Anleitungen.
 
Danke für den Tipp.

Habe mich für die Variante mit PHPMailer entschieden es klappt auch wunderbar.

Ich habe mir eine Tabelle in HTML angelegt und übergebe diese dann als Mail-Text. Soweit so gut. Ich wollte in die erste Tabellenzeile ein Bild einfügen was in HTML auch wunderbar geht. Nur leider wird das Bild nicht in der Mail angezeigt. Woran liegt das und weiß einer Rat.

Hier nochmal mein komlpetter Code der alle bis auf das Bild wunderbar macht.

PHP:
<?php
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT date_format(Datum, '%d.%m.%Y') Datum, time_format(Anstoss, '%H:%i Uhr')Anstoss, Begegnung, Ort FROM $table WHERE Datum <= CURDATE() +5 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

if (mysql_num_rows($ergebnis)>0) { 

while($row = mysql_fetch_array($ergebnis)) {
$date = $row['Datum'];
$time = $row['Anstoss'];
$begegnung = $row['Begegnung'];
$ort = $row['Ort'];

$text = '<html>
<head>
</head>
<body>
<table align="center">
  <tr>
    <td align="center" style="background-image:url(./logo.png)">logo</td>
  </tr>
  <tr>
    <td align="center" style="color: #ff0000; font-weight:bold; font-size:35px">nächstes Spiel</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'. $row['Datum'].' - '.$row['Anstoss'].'</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'.$row['Begegnung'].'</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'.$row['Ort'].'</td>
  </tr>
</table>


</body>
</html>';

}

}
else { 
$text = "Diese Woche findet kein Spiel statt";
}


  //Klasse einbinden
  require('class.phpmailer.php');
  
  //Instanz von PHPMailer bilden
  $mail = new PHPMailer();
  $mail->SetLanguage("de");
  $mail->CharSet  =  "utf-8";
  //Absenderadresse der Email setzen
  $mail->From = "[email protected]";
  
  //Name des Abenders setzen
  $mail->FromName = "Test";
  
  //Empfängeradresse setzen
  $mail->AddAddress("[email protected]");
  $mail->AddBCC('[email protected]');

  
  //Betreff der Email setzen
  $mail->Subject = "SPIELERINNERUNG";
 
 //Versand im HTML-Format festlegen
 $mail->IsHTML(true);  
 
 //Body enthält die HTML-Nachricht
  //Zeilenumbrüche werden in <br> umgewandelt
 // $mail->Body    = nl2br($text);
  $mail->Body    = $text;
  
  //Altbody enthält die alternative Textform
  //mit strip_tags() werden die HTML-Tags entfernt 
  $mail->AltBody = strip_tags($text);
  
  //EMail senden und überprüfen ob sie versandt wurde
  if(!$mail->Send())
  {
     //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
     echo "Die Email konnte nicht gesendet werden";
     echo "Fehler: " . $mail->ErrorInfo;
  }
  else
  {
     //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
     echo "Die Email wurde versandt.";
  }
?>
es geht also um diese Zeile

PHP:
<tr>
    <td align="center" style="background-image:url(./logo.png)">logo</td>
  </tr>
Danke
 
Habe es jetzt mit einer funktion von PHPMailer gelöst.

Hier der ganze Code des Reminders. Er liest aus einer Datenbank die Werte aus welche das aktuelle Datum und die 6 weiteren Tage einschließt. Anschließend versendet er die Ausgabe als HTML Mail. Vielleicht kann es ja jemand gebrauchen.

PHP:
<?php
$server    = "localhost";
$user    = "user";
$pass    = "pass";
$database = "db";
$table    = "News";
$verbindung = mysql_connect($server, $user, $pass) or die ("verbindung zu sql geht nicht");

mysql_select_db($database, $verbindung);

$abfrage = "SELECT date_format(Datum, '%d.%m.%Y') Datum, time_format(Anstoss, '%H:%i Uhr')Anstoss, Begegnung, Ort FROM $table WHERE Datum <= CURDATE() +6 AND Datum >= CURDATE() ORDER BY Datum ASC";
// Anfrage ausführen
$ergebnis=mysql_query($abfrage) or die("Fehler im SQL-Kommando $sql");

if (mysql_num_rows($ergebnis)>0) { 

while($row = mysql_fetch_array($ergebnis)) {
$date = $row['Datum'];
$time = $row['Anstoss'];
$begegnung = $row['Begegnung'];
$ort = $row['Ort'];

$text = '<html>
<head>
</head>
<body>
<table align="center">
  <tr>
    <td align="center"><img alt="TEST" src="cid:my-attach"></td>
  </tr>
  <tr>
    <td align="center" style="color: #ff0000; font-weight:bold; font-size:35px">nächstes Spiel</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'. $row['Datum'].' - '.$row['Anstoss'].'</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'.$row['Begegnung'].'</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">-</td>
  </tr>
  <tr>
    <td align="center" style="color: #000000; font-weight:bold; font-size:25px">'.$row['Ort'].'</td>
  </tr>
</table>


</body>
</html>';

}

}
else { 
$text = "Diese Woche findet kein Spiel statt";
}
echo

  //Klasse einbinden
  require('class.phpmailer.php');
  
  //Instanz von PHPMailer bilden
  $mail = new PHPMailer();
  $mail->SetLanguage("de");
  $mail->CharSet  =  "utf-8";
  //Absenderadresse der Email setzen
  $mail->From = "[email protected]";
  
  // BILD EINBINDEN
 $mail->AddEmbeddedImage("logo.jpg", "my-attach", "logo.jpg");
 $mail->Body = 'Embedded Image: <img alt="Bild Text" src="cid:my-attach"> Here is an image!'; 
  
  //Name des Abenders setzen
  $mail->FromName = "[email protected]";
  
  //Empfängeradresse setzen
  $mail->AddAddress("[email protected]");
//BCC Empfänger
  $mail->AddBCC('[email protected]');

  
  //Betreff der Email setzen
  $mail->Subject = "SPIELERINNERUNG";
 
 //Versand im HTML-Format festlegen
 $mail->IsHTML(true);  
 
 //Body enthält die HTML-Nachricht
  $mail->Body    = $text;
  
  //Altbody enthält die alternative Textform
  //mit strip_tags() werden die HTML-Tags entfernt 
  $mail->AltBody = strip_tags($text);
  
  //EMail senden und überprüfen ob sie versandt wurde
  if(!$mail->Send())
  {
     //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
     echo "Die Email konnte nicht gesendet werden";
     echo "Fehler: " . $mail->ErrorInfo;
  }
  else
  {
     //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
     echo "Die Email wurde versandt.";
  }
  

?>
 
Zurück
Oben