"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[PHP mit SQL] Emailversand mit fortlaufendem BCC

bambooS 13.03.2012 - 10:37 2775 17
Posts

bambooS

OC Addicted
Avatar
Registered: Oct 2005
Location: Vienna
Posts: 672
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);
Bearbeitet von bambooS am 13.03.2012, 15:01

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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.
Bearbeitet von Obermotz am 13.03.2012, 10:58

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
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

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
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

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 3018
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

OC Addicted
Avatar
Registered: Oct 2005
Location: Vienna
Posts: 672
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...
Bearbeitet von bambooS am 13.03.2012, 13:44

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
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

OC Addicted
Avatar
Registered: Oct 2005
Location: Vienna
Posts: 672
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

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
drum benutzt du ja implode, damit du alle in einem string hast.

bambooS

OC Addicted
Avatar
Registered: Oct 2005
Location: Vienna
Posts: 672
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);
Bearbeitet von bambooS am 13.03.2012, 13:38

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
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

OC Addicted
Avatar
Registered: Oct 2005
Location: Vienna
Posts: 672
Warum funktioniert es dann jetzt?

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz