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-Key: 546353

Url: https://administrator.de/contentid/546353

Printed on: April 16, 2024 at 10:04 o'clock

Member: StefanKittel
StefanKittel Feb 12, 2020 at 20:38:57 (UTC)
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
Member: tsunami
tsunami Feb 13, 2020 at 11:09:41 (UTC)
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
Member: bloodstix
bloodstix Feb 13, 2020 updated at 12:50:17 (UTC)
Goto Top
Das return vor $email->Send(); ist unnötig und könnte für beendigung der Schleife führen.
Member: tsunami
tsunami Feb 19, 2020 at 16:11:08 (UTC)
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
Member: bloodstix
bloodstix Feb 21, 2020 updated at 17:54:05 (UTC)
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