[PHP mit SQL] Emailversand mit fortlaufendem BCC

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php-mit-sql-emailversand-mit-fortlaufendem-bcc_229198/page_1 - zur Vollversion wechseln!


bambooS schrieb am 13.03.2012 um 10:37

Hi,

ich versuche mich gerade im optimieren des Emailsversand bei einer Homepage.

Leider stecke ich fest. Dazu später mehr. Zuerst einmal der Code.

Code: PHP
if (isset($_POST["sendmail2"]))
{  			  			
// Betreff  			
$subject = 'News auf [url]www.xyz.net:[/url]'.$Headline;  			
// Inhalt  			
$text = $Content ."\r\n\r\nwww.xyz.net";  			
// Absender:   			
$headers = "From: [email]xyz@xyz.net[/email]"; 			
$headers .= "\r\n"; 			 			
$headers = "BCC:".$empfaenger; 			
$headers .= "\r\n"; 			 			

// alle Kapitäne dieser saison mit mailadresse  			
$query = "SELECT Mailadresse FROM tbl_Spieler, tbl_TeamSaison WHERE";  			
$query .= " tbl_Spieler.ID = tbl_TeamSaison.r_Kapitaen_ID";  			
$query .= " AND tbl_TeamSaison.r_Saison_ID = " . $Saison_ID;  			
$result = mysql_query( $query, GetConnection() ) or die ( mysql_error() ); 			  			

while( $result && list($empfaenger) = mysql_fetch_row($result) ) 
{ 				
mail("xyz@xyz.net", $subject, $text, $headers); 				 			
}  		 	
}

Ziel ist es aus eine Email an protected zu versenden, wobei die anderen Emailempfänger in BCC stehen sollen. Die anderen sind jene aus der SQL Query.

Wenn der Code von mir nicht komplett falsch ist, habe irgendwo einen Wurm drinnen, da ich bei 9 Kapitänen, 9 Emails auf die protected bekomme.
Ziel wäre es aber eine Email, wo alle Kaptiäne in BCC stehen.

Wie könnte ich das realisieren?

Bis jetzt konnte mir Mr. Google nicht helfen.

Und ja ich bin Newbie was SQL und PHP angeht. Ich habe das Ganze geerbt und darf mich nun daran erfreuen...

Danke für eure Mithilfe.

lg
bam

[Edit] die Lösung:
Code: PHP
			// alle Kapitäne dieser saison mit mailadresse              
			$query = "SELECT Mailadresse FROM tbl_Spieler, tbl_TeamSaison WHERE";              
			$query .= " tbl_Spieler.ID = tbl_TeamSaison.r_Kapitaen_ID";              
			$query .= " AND tbl_TeamSaison.r_Saison_ID = " . $Saison_ID;              
			$result = mysql_query( $query, GetConnection() ) or die ( mysql_error() );                           

			while( $row = mysql_fetch_assoc($result) ) 
			{
 			 $empfaenger[] = $row['Mailadresse'];
			}
			$empf_list = implode('; ', $empfaenger);          		

			// Betreff              
			$subject = 'News auf [url]www.xyz.net:[/url]'.$Headline;              
			// Inhalt              
			$text = $Content ."\r\n\r\nwww.xyz.net";              
			// Absender:               
			$headers = "From: [email]xyz@xyz[/email]";             
			$headers .= "\r\n";                          
			$headers .= "BCC:".$empf_list;             
			$headers .= "\r\n";                          
			
			//echo $headers;
			mail("xyz@xyz.net", $subject, $text, $headers);


Obermotz schrieb am 13.03.2012 um 10:42

Na klar, du hast ja den eMail-Versand in der Schleife.
Du musst dir zuerst die Kapitäne aus der DB holen und dann in einen String verfrachten, durch Semikolons getrennt (Implode mit glue). Das ganze kommt dann in die Headers BCC. Du brauchst dann nur einen Versand per mail() machen.


kleinerChemiker schrieb am 13.03.2012 um 11:17

Vor allem weißt du die Empfänger im Header noch vor der Schleife zu. In der Schleifer wird der header aber nicht mehr geändert.


Obermotz schrieb am 13.03.2012 um 11:26

Zitat von kleinerChemiker
Vor allem weist du die Empfänger im Header noch vor der Schleife zu. In der Schleife wird der header aber nicht mehr geändert.
Somit kann er also auf die ganze Schleife verzichten ;)


kleinerChemiker schrieb am 13.03.2012 um 11:33

Zitat von Obermotz
Somit kann er also auf die ganze Schleife verzichten ;)

Nein, er brauch die Schleife um alle Zeilen von der DB auszuwerten, aber die Schleife müßte eben am Anfang stehen und dannach erst die Empfänger zugewiesen werden.


quilty schrieb am 13.03.2012 um 11:33

Und du schreibst brav den Absender in den Header um ihn anschließen mit den Empfängern zu überschreiben. :)

Und ich hoffe für die SeasonID kann nicht von außen gewählt werden, weil sonst schickt dir bald wer ein drop table mit. Informier dich über SQL Injection und besondern PHP biete viele Features um diese zu verhindern.


bambooS schrieb am 13.03.2012 um 12:08

Danke für die Tipps.

Ich habe den Code jetzt soweit geändert. Wäre dies richtig?

Code: PHP
if (isset($_POST["sendmail2"]))  
{
// alle Kapitäne dieser saison mit mailadresse              
$query = "SELECT Mailadresse FROM tbl_Spieler, tbl_TeamSaison WHERE";              
$query .= " tbl_Spieler.ID = tbl_TeamSaison.r_Kapitaen_ID";              
$query .= " AND tbl_TeamSaison.r_Saison_ID = " . $Saison_ID;              
$result = mysql_query( $query, GetConnection() ) or die ( mysql_error() );                           

while( $empfaenger = mysql_fetch_row($result) ) 
$empf_list .= implode('; ',$empfaenger);
                       
// Betreff 
$subject = 'News auf [url]www.xyz.net:[/url]'.$Headline;              
// Inhalt              
$text = $Content ."\r\n\r\nwww.xyz.net";              
// Absender:               
$headers = "From: [email]xyz@xyz.net[/email]";             
$headers .= "\r\n";                          
$headers .= "BCC:".$empf_list;             
$headers .= "\r\n";                          

mail("xyz@xyz.net", $subject, $text, $headers);
        
} 

Dies funktioniert schon fast. Leider schreibt er mir nicht die Semikolon bei implode() rein...


kleinerChemiker schrieb am 13.03.2012 um 13:00

Folgende Änderungen bei while( $result && list($empfaenger) = mysql_fetch_row($result) )

die {} kannst du weglassen
du überschreibst dir $empfaenger bei jedem durchlauf -> $empfaenger[]

Woher kommt $Saison_ID? Aus einer Benutzereingabe?


bambooS schrieb am 13.03.2012 um 13:10

Hi Chemiker,

hab bereits kleine Änderungen am Code gemacht.

Saison_ID kommt aus einer include Datei die immer mitgeladen wird sofern notwenig.

Bei der Implode() Funktion hackt es. Die Emailadressen werden in einer "Wurst" ausgegeben.


kleinerChemiker schrieb am 13.03.2012 um 13:13

drum benutzt du ja implode, damit du alle in einem string hast.


bambooS schrieb am 13.03.2012 um 13:26

Richtig, nur wollte ich ja die Semikolen mit einfügen. Das ignoriert er komplett.

Code ist derzeit so:
while( $result && list($empfaenger) = mysql_fetch_row($result) )

$empf_list .= implode('; ',$empfaenger);

So bekomm ich gar nix zurück.

Und so:


So bekomm ich eine Endloswurst jedoch nicht mit ; getrennt.

Irgendetwas übersehe ich...

[Edit]

So hab den Fehler gefunden:
while( $empfaenger = mysql_fetch_array($result) )
$empf_list .= implode('; ',$empfaenger);


kleinerChemiker schrieb am 13.03.2012 um 13:43

ob mysql_fetch_row oder mysql_fetch_array macht keinen unterschied. Den Fehler hab ich dir oben schon geschrieben, du überschreibst dir $empfänger in der while Schleife mit jedem Durchlauf


bambooS schrieb am 13.03.2012 um 13:45

Warum funktioniert es dann jetzt?


Obermotz schrieb am 13.03.2012 um 13:47

Code: PHP
while( $row = mysql_fetch_assoc($result) ) 
{
  $empfaenger[] = $row['Mailadresse'];
}
$empf_list = implode('; ', $empfaenger);
So ist es am verständlichsten und lesbarsten.
Wie Chemiker schon sagt.. die Brackets [] machen hier den großen Unterschied. Du fügst dem Array mit jedem Schleifendurchlauf die aktuelle Adresse hinzu.
mysqli_fetch_assoc ist btw. am performantesten.


kleinerChemiker schrieb am 13.03.2012 um 13:57

Zitat von Obermotz
mysqli_fetch_assoc ist btw. am performantesten.

http://at2.php.net/manual/de/functi...fetch-assoc.php :

Hinweis: Performance

Zu betonen ist, dass der Gebrauch von mysql_fetch_array() nicht signifikant langsamer ist als mysql_fetch_row(), obwohl die Funktion einen sichtlichen Mehrwert bietet.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025