tsunami
Goto Top

Php Mailer und foreach bricht ab

Hallo,
ich habe ein Backup Script programmiert. Damit ich nun nicht für jede Datenbank einen Cron Job anlegen muss, habe ich ein Array gebaut und durchlaufe das mit foreach.
Zusätzlich, möchte ich, falls der Provider mal Mist baut oder ein Fehler erst nach einigen Wochen bemerkt wird, die DB per Email verschicken. Dazu nutze ich php Mailer.
Leider nimmt er nur die erste Schleife. Was ich gelesen habe, ist, dass php mailer Probleme macht.
Aktuell habe ich die eigendliche Send-Funktion außerhalb der foreach-Schleife. Funktioniert in sofern, als dass ich die Email bekomme, allerdings mit allen DBs im Anhang. Schöner wäre 1 Email 1 Anhang/Datenbank.

Was muss ich ändern?
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;      
require 'phpmailer/src/Exception.php';  
require 'phpmailer/src/PHPMailer.php';  
require 'phpmailer/src/SMTP.php';  
 $email = new PHPMailer();
$email->SetFrom('backup-service@papalangstrumpf.biz', 'Backup Service'); //Name is optional  
//*****DB Array ***************

     $datenbank_array ["db_name"] ="hugo";  
     $datenbank_array ["db_passwd"] ="12345";  
     $datenbank_array ["db_pfad"] ="backup/";  
     $datenbank_array ["firmennamex"] ="Firma Mustermann";  
     
     $datenbank_array[1] ["db_name"] ="anton";  
     $datenbank_array[1] ["db_passwd"] ="54321";  
     $datenbank_array[1] ["db_pfad"] ="../tralala/backup/";  
     $datenbank_array[1] ["firmennamex"] ="Firma Holzwurm";  

     $x=0;
// echo $datenbank_array[1] ["firmennamex"]; 
   foreach ($datenbank_array as $hilfsarray){  
//    echo "x".$x;   
   foreach ($hilfsarray as $key => $value)  {
   $$key =$value;
//    echo $$key."<br>"; 
   }
   echo $db_name." - ".$db_passwd." - ".$db_pfad." - ".$firmennamex."<br>";  
$sql_file = $db_pfad."dump_".str_replace(' ','',$firmennamex)."_". $db_name . "_" . date('Ymd_Hi').".sql";  
// echo "<br>peep".$sql_file; 
$dateiname="dump_".str_replace(' ','',$firmennamex)."_". $db_name . "_" . date('Ymd_Hi').".sql";  
$dateiname = $dateiname . ".gz";  
// ************Backup bereinigen Älter als 3 Monate löschen*************
   $dreimonate  = mktime(0, 0, 0, date("m")-3, date("d"),  date("Y"));  
// echo date("d.m.y", $dreimonate); 
$suchmuster="dump_".$db_name."_".date('Ym',$dreimonate)."*";  
// echo "peep".$db_passwd; 
array_map('unlink', glob($db_pfad.$suchmuster));  

// *******************Dumb erstellen ******************************
// echo "Ausgabe: mysqldump -u $db_name -p'$db_passwd' --allow-keywords --add-drop-table --complete-insert --quote-names $db_name > $sql_file"; 
exec("mysqldump -u $db_name -p'$db_passwd' --allow-keywords --add-drop-table --complete-insert --quote-names $db_name > $sql_file");  
// echo "<br><br>Vorlage: mysqldump -u $db_name -p'$db_passwd' --allow-keywords --add-drop-table --complete-insert --quote-names $db_name > $sql_file"; 
exec("gzip $sql_file");  

$datei = $sql_file.".gz";  
$link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];  
$link = str_replace(basename(__FILE__),$datei,$link);

//*************** Mailen***************************
 

$email->Subject   = 'Backup Buf-O '.$firmennamex.' vom '.date("d.m.Y");  
$email->Body      = "Sehr geehrte Damen und Herren, \nanbei das Backup vom  ".date("d.m.Y")." der Firma ".$firmennamex.".\nZusätzlich wird die Datenbank im Rechenzentrum gespeichert. \nBitte behandeln Sie die Daten vertraulich!  
\n\nMit freundlichem Gruß\n\n
-- 
Max Mustermann
$email->AddAddress( 'peter@pan.de' );  

$file_to_attach = $db_pfad.$dateiname;
// echo $file_to_attach."<br><br>"; 
 $email->AddAttachment( $file_to_attach , $dateiname );

 $x++ ;
  }  return $email->Send(); 
?>


Vielen Dank für Tipps
tsunami

Content-ID: 546353

Url: https://administrator.de/forum/php-mailer-und-foreach-bricht-ab-546353.html

Ausgedruckt am: 04.04.2025 um 17:04 Uhr

StefanKittel
StefanKittel 12.02.2020 um 21:38:57 Uhr
Goto Top
Hallo,
Entweder merkst Du Dir vorher schon welche Anhänge verschickt werden sollen.
Oder Du löscht schlicht das Objekt nach dem Senden. Dann sollte auch die Schleife gehen.
Stefan
tsunami
tsunami 13.02.2020 um 12:09:41 Uhr
Goto Top
Oder Du löscht schlicht das Objekt nach dem Senden. Dann sollte auch die Schleife gehen.
Stefan
Das heißt, ich bräuchte sowas wie
 $email->AddAttachment( $file_to_attach , $dateiname );

 $x++ ;  return $email->Send();
unset($email);
  }
 
?
Danke für die superschnelle Antwort.
tsunami
bloodstix
bloodstix 13.02.2020 aktualisiert um 13:50:17 Uhr
Goto Top
Das return vor $email->Send(); ist unnötig und könnte für beendigung der Schleife führen.
tsunami
tsunami 19.02.2020 um 17:11:08 Uhr
Goto Top
Hi,
nun habe ich es fast:
$email->AddAddress( 'peter@pan.de' );  

$file_to_attach = $db_pfad.$dateiname;
// echo $file_to_attach."<br><br>";  
 $email->AddAttachment( $file_to_attach , $dateiname );
   $email->Send();
 $x++ ;
  }  

Dann bekam ich zwei Emails , die Schleife lief also durch.
Aber: An der Email waren beide Dumbs dran.
Also nochmal angepasst:
$email->AddAddress( 'peter@pan.de' );  

$file_to_attach = $db_pfad.$dateiname;
// echo $file_to_attach."<br><br>"; 
 $email->AddAttachment( $file_to_attach , $dateiname );
   $email->Send();

//*********VAriable leer gemacht, damit die neu gesetzt wurde. Nun bekomme ich zwei Email, eine mit Dumb 1 und eine mit Dumb1 und Dumb2???
   unset($file_to_attach);
 $x++ ;
  }  

Wie ist die Variable nicht leer? Normalerweise würde ich es verstehen wenn da sowas stände wie $file_to_attac.=

mfG
tsunami
bloodstix
bloodstix 21.02.2020 aktualisiert um 18:54:05 Uhr
Goto Top
Du übergibst das Attachment dem "$email"-Objekt und das merkt sich das und resettet nicht nach dem Senden automatisch. Das musst du am Ende der Schleife auch mit unset behandeln. Also am Beginn jeder schleife $email = new PHPMailer(); und die Dinge wie $email->SetFrom('backup-service@papalangstrumpf.biz', 'Backup Service');
und am Ende unset($email);

Grüße
bloody