tastenkloppe
Goto Top

Mailversand sowie Übergabe aus PHP-Variable

Guten Morgen sehr geehrtes Forum,

ich verfolge dieses Forum schon lange und habe nun selbst eine Frage.
Mein Spezialgebiet ist nicht gerade die Webentwicklung, aber ich verwalte und entwickle unser Intranet.

Wir nutzen derzeit als IT-Helpdesk die Freeware Spiceworks, diese stößt jedoch schnell an Ihre Grenzen was das Customizing betrifft.

Ich setze derzeit ein separates Frontend auf, in dem ich beispielsweise auch T-SQL Abfragen einbinden kann und dies auch schon umgesetzt habe.
Das gewünschte Ergebnis des Frontends, in dem vorab nur die Eingabe einer Rechnungsnummer erfolgt, sollte die ersichtliche Ausgabe aus der Datenbank sein,
sowie im Idealfall der Versand dieser Daten an eine spezifische Adresse von Spiceworks, sodass daraus ein Ticket resultiert.

Ich habe jedoch zwei Problemstellungen, bei denen ich mir erhoffe, dass mir hier im Forum geholfen werden kann:

- Das Ergebnis des T-SQL-Selects gebe ich derzeit via Echo für den Enduser aus und das ist auch so gewünscht, ich möchte den Inhalt nur gerne in einer Variable deklarieren, die anschließend via Post an die Function übergeben werden soll, die die Mail versendet.

- Im unten aufgeführten Code wird die E-Mail immer von einem spezifischen Account verschickt, die Mail (und das daraus resultierende Ticket) sollte aber im Idealfall im Namen - oder besser mit der E-Mail- des jeweiligen Benutzers versendet werden (eine LDAP-Anbindung ist existent und funktionsfähig -die User werden alle via SSO eingeloggt), mir fehlt aber die Variable für die E-Mail-Adresse und wie ich diese korrekt einbinde - das müsste ja etwas in der Form "$_SERVER ['REMOTE_USER']" sein.

Die ersten -leider gescheiterten Versuche- eine Variable zu initialisieren findet sich in Zeile 92-108 des Quellcodes.

Ich würde mich riesig über eine Rückmeldung Eurerseits freuen und verbleibe mit den besten Grüßen!

<html>
<!-- Meta-Daten sind wichtig für die richtige Interpretation der Daten. -->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />  
<head></head>
<body>

<?php  
// Verbindungsdaten zum SQL-Server, zzgl. Zugangsdaten - in diesem Fall aus .txt-File.
$serverName = "192.168.55.712";    

// Deklarierung der Konstanten und Variablen
if (empty($_POST['RGNR'])) {  
     $_POST['RGNR'] = "09040-27230";  
 }
$Rechnungsnummer = $_POST['RGNR'] ;  
$uid = file_get_contents("C:\AppData\uid.txt");    
$pwd = file_get_contents("C:\AppData\pwd.txt");  
$connectionInfo = array( "UID"=>$uid,    
                         "PWD"=>$pwd,    
                         "Database"=>"Contoso-DB",  
                         "CharacterSet"=>"UTF-8"            );    

// Verbindung herstellen mit SQL-Zugangsdaten aus den Textdateien 
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
     echo "Es besteht keine Verbindung zum Datenbankserver.</br>";    
     die( print_r( sqlsrv_errors(), true));  
}  
  
// Auszuführendes TSQL anhand der Berechtigung des oben hinterlegten Nutzers
$tsql = 
"  
SELECT 
    EmpfAenger, 
    ReDatum, 
    tbl_Login.Name [Rechnungsersteller], 
    FORMAT(Netto, 'c') [Rechnungsbetrag],   
    FORMAT(tbl_Buchungen.Netto, 'c') [Zahlungseingang],    
    tbl_Filialen.Bezeichnung [Betreuende_NL],
    tbl_login.Name [Betreuer_NL],
    tbl_Kunden.Strasse [Strasse_Entsendung],
    tbl_Kunden.Plz [Postleitzahl_Entsendung],
    tbl_Kunden.Ort [Ort_Entsendung],
    tbl_Kunden.RStrasse [Strasse_Rechnungsadresse],
    tbl_Kunden.RPlz [Postleitzahl_Rechnungsadresse],
    tbl_Kunden.ROrt [Ort_Rechnungsadresse]
FROM tbl_Rechnungsausgang

    INNER JOIN tbl_Login 
        ON (tbl_Rechnungsausgang.erstellt_von = tbl_Login.Benutzerkennung)
    INNER JOIN tbl_Buchungen
        ON tbl_Rechnungsausgang.ReNummer = tbl_Buchungen.Rechnungsnummer
    INNER JOIN tbl_Kunden
        ON tbl_Rechnungsausgang.id_Kunden = tbl_Kunden.id_Kunden
    INNER JOIN tbl_Filialen
        ON tbl_Kunden.id_Filialen = tbl_Filialen.id_Filialen

WHERE ReNummer='$Rechnungsnummer'   
ORDER by tbl_Buchungen.erstellt_am DESC";  

// Ausgabe insofern der SQL-Code falsch ist
$stmt = sqlsrv_query( $conn, $tsql); 
if( $stmt === false )  
{  
     echo "Es ist ein Fehler aufgetreten.</br>";    
     die( print_r( sqlsrv_errors(), true));  
}  

// Empfang und Ausgabe des SQL-Selects
echo '<table border="1">';  
$row = sqlsrv_fetch_array($stmt); 
echo"</br></br></br>";  
echo"Kunde: ".$row[EmpfAenger]."</br>";    
echo"Rechnungsdatum: ".$row[ReDatum]-> format('d.m.Y')."</br>";    
echo"Rechnungsnummer: ".$Rechnungsnummer."</br>";    
echo"Rechnungsersteller: ".$row[Rechnungsersteller]."</br></br>";    
echo"Rechnungsbetrag: ".$row[Rechnungsbetrag]."</br>";    
echo"Zahlungseingang: ".$row[Zahlungseingang]."</br></br></br>";    
echo"Straße Entsendung: ".$row[Strasse_Entsendung]."</br>";  
echo"Postleitzahl Entsendung: ".$row[Postleitzahl_Entsendung]."</br>";  
echo"Ort Entsendung: ".$row[Ort_Entsendung]."</br></br></br>";  
echo"Rechnungsadresse: ".$row[Strasse_Rechnungsadresse]."</br>";  
echo"Postleitzahl Rechnung: ".$row[Postleitzahl_Rechnungsadresse]."</br>";  
echo"Ort Rechnung: ".$row[Ort_Rechnungsadresse]."</br>";  
echo"Verantwortlicher in der Niederlassung: ".$row[Betreuer_NL]."</br>";  
echo"Verantwortliche Niederlassung: ".$row[Betreuende_NL]."</br></br></br>";  


/* Versuch die Ergebnisse in einer String-Variable zu initialisieren zu deklarieren u. initialisieren:

$str=
$row = sqlsrv_fetch_array($stmt); 
echo"</br></br></br>"; 
echo"Kunde: ".$row[EmpfAenger]."</br>";   
echo"Rechnungsdatum: ".$row[ReDatum]-> format('d.m.Y')."</br>";   
echo"Rechnungsnummer: ".$Rechnungsnummer."</br>";   
echo"Rechnungsersteller: ".$row[Rechnungsersteller]."</br></br>";   
echo"Rechnungsbetrag: ".$row[Rechnungsbetrag]."</br>";   
echo"Zahlungseingang: ".$row[Zahlungseingang]."</br></br></br>";   
echo"Straße Entsendung: ".$row[Strasse_Entsendung]."</br>"; 
echo"Postleitzahl Entsendung: ".$row[Postleitzahl_Entsendung]."</br>"; 
echo"Ort Entsendung: ".$row[Ort_Entsendung]."</br></br></br>"; 
echo"Rechnungsadresse: ".$row[Strasse_Rechnungsadresse]."</br>"; 
echo"Postleitzahl Rechnung: ".$row[Postleitzahl_Rechnungsadresse]."</br>"; 
echo"Ort Rechnung: ".$row[Ort_Rechnungsadresse]."</br>"; 
echo"Verantwortlicher in der Niederlassung: ".$row[Betreuer_NL]."</br>"; 
echo"Verantwortliche Niederlassung: ".$row[Betreuende_NL]."</br></br></br>"; 
*/



// Auflösen der Anfrage und Schließen der Verbindung.
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>  
<form action="Rechnungskorrektur.php" method="post">  
<input type="text" name="Bemerkungen" value="Bitte tragen Sie hier Kommentare ein."style="width:800px;"style="hidth:400px;" /></br></br>  
</form>
<form method="post">  
    <input type="submit" name="test" id="test" value="Übermitteln" /><br/>  
</form>
 
<?php

// Funktion zum Versand der Mail - hier müssen die Variablen hin übergeben werden aus dem vorherigen <?php

function testfun()
{
     $to = "ticketsystem@contoso.de";  
     $subject = "Rechnungskorrektur:;  
     $txt = "Testmails";  
     $headers = "From: c.ehrik@contnso.de" . "\r\n" .  
     "CC: c.ehrik@contoso.de";  
     
     mail($to,$subject,$txt,$headers);
     
     
}

if(array_key_exists('test',$_POST)){  
   testfun();
}

?>
</body>

Content-ID: 3541197367

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

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

SlainteMhath
SlainteMhath 04.08.2022 um 11:26:47 Uhr
Goto Top
Moin,

du solltest dich mal in das Thema SQL-Injection einlesen. Was du hier baust:

$Rechnungsnummer = $_POST['RGNR'] ;  
[...]
WHERE ReNummer='$Rechnungsnummer'   

Ist eine Einladung für Hacker den Server zu übernehmen (auch wenn's nur ein interner Server ist)

lg,
Slainte
Tastenkloppe
Tastenkloppe 04.08.2022 um 11:33:57 Uhr
Goto Top
Zitat von @SlainteMhath:

Moin,

du solltest dich mal in das Thema SQL-Injection einlesen. Was du hier baust:

$Rechnungsnummer = $_POST['RGNR'] ;  
[...]
WHERE ReNummer='$Rechnungsnummer'   

Ist eine Einladung für Hacker den Server zu übernehmen (auch wenn's nur ein interner Server ist)

lg,
Slainte

Danke für den Hinweis! Das ist mir absolut bewusst, in prepared statements lese ich mich gerade ein, sehe ich aber im Nachgang als Optimierung an, zunächst wollte ich erst eine lauffähige Variante haben und weitere Abfragen dann sicher gestalten
SlainteMhath
SlainteMhath 04.08.2022 um 11:36:30 Uhr
Goto Top
zunächst wollte ich erst eine lauffähige Variante haben und weitere Abfragen dann sicher gestalten
Deine Prioritäten sind falsch face-smile
3479126418
3479126418 04.08.2022 aktualisiert um 11:46:40 Uhr
Goto Top
Nicht nur das, die übergebenen Daten für die Mail-Funktion werden in keinster Weise in quoted printables umgewandelt bzw. kodiert übergeben. Eine Mail mit einem Umlaut oder Sonderzeichen wird dir so bei den empfangenden Mailservern wohl zu 99% im Spam landen oder sogar von den Empfangenden Mail-Servern gleich abgelehnt! Es lauern hier noch mehr Fallen!
Deswegen, wenn du keine Ahnung von der Materie hast, nutze für das Versenden eine Bibliothek wie z.B. phpmailer. Oder übergebe das Projekt am besten gleich an jemanden der weis was er da tut, wenn es schon an einer Variablen und Funktionsdefinitionen hapert sehe ich sehr schwarz ...
Tastenkloppe
Tastenkloppe 04.08.2022 aktualisiert um 11:54:40 Uhr
Goto Top
Zitat von @bangalore:

Nicht nur das, die übergebenen Daten für die Mail-Funktion werden in keinster Weise in quoted printables umgewandelt bzw. kodiert übergeben. Eine Mail mit einem Umlaut oder Sonderzeichen wird dir so bei den empfangenden Mailservern wohl zu 99% im Spam landen oder sogar von den Empfangenden Mail-Servern gleich abgelehnt! Es lauern hier noch mehr Fallen!
Deswegen, wenn du keine Ahnung von der Materie hast, nutze für das Versenden eine Bibliothek wie z.B. phpmailer. Oder übergebe das Projekt am besten gleich an jemanden der weis was er da tut, wenn es schon an einer Variablen und Funktionsdefinitionen hapert sehe ich sehr schwarz ...

Danke für diesen Hinweis, das hatte ich (als Nicht-Webentwickler) überhaupt nicht auf dem Schirm. Glücklicherweise ist dies aber -vermutlich aufgrund des Domänen-Internen Versands- nicht der Fall, vermutlich weil es eine vertrauenswürdige Stelle ist. Die Mails sollen ja alle nur eine spezifische, interne E-Mail-Adresse gehen.

Bzgl. der beiden zuletzt genannten Punkte: Es sind ja tatsächlich nur die beiden Dinge noch erforderlich, dann habe ich eine Grundlage auf der ich alles Weitere aufbaue, abgesehen vom select ändert sich daran nichts mehr.
3479126418
3479126418 04.08.2022 aktualisiert um 12:09:30 Uhr
Goto Top
function testfun($param){
    // use $param
    echo $param;
}

$text = "whatever";
testfun($text);
https://www.w3schools.com/php/php_functions.asp
Tastenkloppe
Tastenkloppe 04.08.2022 um 12:15:46 Uhr
Goto Top
Zitat von @bangalore:

function testfun($param){
    // use $param
    echo $param;
}

$text = "whatever";
testfun($text);
https://www.w3schools.com/php/php_functions.asp

Mein Problem ist, dass die Variable da noch nicht zur Verfügung steht und dort ja auch nicht initialisiert wird. Ich müsste die aus dem oberen php-code in der function verfügbar machen, da weiß ich leider nicht wie.
stefaan
stefaan 04.08.2022 um 12:30:38 Uhr
Goto Top
Servus,

wenn das ganze Customizing mehr als ein Mailversand werden soll: Nutze bitte ein Framework wie z.B. Laravel.
Das kann alles (in deinem Fall DB-Abfragen, Mailversand, sicherheitsrelevante Überürpfungen von Inputs, ...).

Ja, es mag sich am Anfang komisch anfühlen, wenn man ein Framework mit 30-50MB verwendet, um nur schnell ein paar Daten zu verarbeiten. Aber es kommen dann schnell weitere Anforderungen dazu und da spielt das Framework seine Stärken aus.

Grüße, Stefan
3479126418
3479126418 04.08.2022 aktualisiert um 12:51:18 Uhr
Goto Top
Zitat von @Tastenkloppe:
Mein Problem ist, dass die Variable da noch nicht zur Verfügung steht und dort ja auch nicht initialisiert wird. Ich müsste die aus dem oberen php-code in der function verfügbar machen, da weiß ich leider nicht wie.
Na einfach die Postvariable abfragen und nur wenn sie gesetzt ist weitermachen ....
function testfun($param){
    // use $param
    echo $param;
}
$var = isset($_POST['test']) ? $_POST['test'] : "";  
if ($var != ''){  
    testfun($var);
}
Variablen aus PHP-Blöcken die vorher angelegt wurden sind automatisch in weiteren Blöcken weiter unten verfügbar!. Das ist ja die Funktionsweise von einem PHP-Parser.

Hier fehlen vollkommen die absoluten Basics face-confused.

Ich bin daher nun raus.

Viel Spaß noch bei deinem "Let's Bastel-Projekt" face-big-smile. Kann man nur hoffen das da nichts wichtiges dran hängt ... Aber wenn ich schon das Wörtchen "Rechnungskorrektur" lesen, bleibt dann wohl nur noch Kopfschütteln.

Adios muchachos