Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Umlaute in meinem Script ermöglichen?

Frage Entwicklung PHP

Mitglied: n-i-k-e

n-i-k-e (Level 1) - Jetzt verbinden

22.05.2009, aktualisiert 24.05.2009, 4307 Aufrufe, 3 Kommentare

Hallo zusammen,

ich habe folgendes Script in für meinen Formmailer verwendet,
ich habe es auf meine Bedürfnisse angepasst und es funktioniert auch soweit alles,
nur in der Mail, die mir dann zugesendet wird, werden Sonderzeichen und Umlaute
in Fragezeichen oder sonstigen Zeichen dargestellt,

kann mir jemand von euch sagen an welcher Stelle ich was einfügen muss,
damit das normal dargestellt wird?

Hier mein Script:

01.
<?PHP 
02.
// Unsere PHP-Datei 
03.
 
04.
// Global-Array für die Fehlermeldungen 
05.
$GLOBALS['fehler'] = array(); /* Hier wird ein Array definiert mit noch keinen Einträgen. $GLOBALS[] ist ein Array 
06.
und sagt aus, dass das Objekt in dem Index ($GLOBALS[Index eines Arrays]) überall im Script aufrufbar sein soll. Hätten 
07.
wir einfach $fehler geschrieben, würden unsere selbstgeschriebenen Funktionen nicht darauf zugreifen können.  
08.
Extra-Zeug: Wer mit C(++) etwas zutun hatte, kann es schlecht nachvollziehen, dass die globalen Objekte so gekennzeichnet 
09.
werden müssen, da es in C(++) automatisch erfolgt, soweit ein Objekt "außen" definiert wird. */ 
10.
 
11.
if (isset($_POST['submit'])) // Unsere Hauptanfrage 
12.
    { /* Hier fangen die Funktionsaufrufe an, um die Definition anzugucken, sehen Sie wie schon auf der Skizze gezeichnet 
13.
    nach ganz unten im Script */ 
14.
    pruefe_name($_POST['nachname'], 
15.
        "Sie haben den Nachnamen nicht eingegeben.", 
16.
        "Sie haben unerlaubte Zeichen im Nachnamen eingegeben."); 
17.
    pruefe_name($_POST['strasse'], 
18.
        "Sie haben die Straße nicht eingegeben.", 
19.
        "Sie haben unerlaubte Zeichen in der Straße eingegeben."); 
20.
    pruefe_name($_POST['PLZ'], 
21.
        "Sie haben die Postleitzahl nicht eingegeben.", 
22.
        "Sie haben unerlaubte Zeichen in der Postleitzahl eingegeben."); 
23.
    pruefe_name($_POST['Ort'], 
24.
        "Sie haben den Ort nicht eingegeben.", 
25.
        "Sie haben unerlaubte Zeichen im Ort eingegeben."); 
26.
    pruefe_email($_POST['email'], 
27.
        "Sie haben keine eMail angegeben.", 
28.
        "Sie haben unerlaubte Zeichen in Ihrer eMail-Adresse verwendet."); 
29.
    if (empty($_POST['anfrage'])) : array_push($GLOBALS['fehler'], 
30.
    "Sie haben keine Anfrage eingegeben."."<BR>"); $_POST['anfrage'] = NULL; endif; /* Hier wird überprüft 
31.
    ob das Textfeld "Anfrage" keinen Wert enthällt. Falls 
32.
    es so ist wird wie in unseren Funktionen auch in das Fehlermeldungs-Array geschrieben und der Wert auf NULL 
33.
    umgeändert. Eine Funktion in diesem Fall zu schreiben ist nicht nötig, da hier nur zwei simple Anweisungen  
34.
    erfolgen. */ 
35.
    /* Hier werden die Daten für den Versand eingegeben, sowie der Umgang mit Fehlermeldungen festgelegt: */ 
36.
    daten_senden("mail@mail.de", 
37.
        "Anfrage - ".$_POST['thema'], 
38.
        "Von: ".$_POST['Firma']." ".$_POST['anrede']." ".$_POST['nachname']."\n". 
39.
		"Anschrift: ".$_POST['strasse']." ".$_POST['PLZ']." ".$_POST['Ort']." ".$_POST['Telefon']." ".$_POST['Betreff']."\n". 
40.
        "eMail-Adresse: ".$_POST['email']."\n". 
41.
        "Anfrage: \n----------\n".$_POST['anfrage'], 
42.
        "Bestätigung", 
43.
        "Guten Tag ".$_POST['anrede']." ".$_POST['nachname'].",\n". 
44.
        "Sie erhalten diese eMail, da Sie auf unserer Webseite mit uns Kontakt aufgenommen und eine eMail-". 
45.
        "Bestätigung gewünscht haben.\n". 
46.
        "Ihre Anfrage wird so schnell wie möglich von unseren Mitarbeitern verarbeitet und Sie werden von uns informiert.\n". 
47.
        "Mit freundlichen Grüßen,", 
48.
        "Leider konnte Ihre Nachricht nicht übermittelt werden.", 
49.
        "Leider konnte Ihre Bestätigung nicht übermittelt werden.", 
50.
        "Ihre Anfrage wurde erfolgreich an uns weitergeleitet.", 
51.
        "Ihre Bestätigungsmail wurde erfolgreich an Sie weitergeleitet.", 
52.
        "From: ".$_POST['email']." <".$_POST['nachname'].">", 
53.
        "From:"); 
54.
55.
 
56.
// Funktionen: 
57.
function pruefe_name(&$name, $fehlermld_1, $fehlermld_2) /* &$name ist eine Referenz, das heißt es wird keine Kopie 
58.
der übergebenen Variable für die Funktion gemacht, sondern ein Aliasname erstellt, der auf die übergebene Variable  
59.
direkt zugreifen kann. Also wird nach dem Funktionsaufruf z.B. $_POST['vorname'] als Argument direkt verändert, ohne,  
60.
dass man $_POST['vorname'] = pruefe_name($_POST['vorname']); hinschreiben muss. Die anderen zwei Argumente sind dazu 
61.
da, um die zwei Fehlermeldungen zu übergeben. Die erste ist für den Fall, dass die übergebene Variable nichts 
62.
erhält und die zweite falls die Variable durch das Muster nicht passt und z.B. unerlaubte Zeichen oder Ziffern  
63.
erhält */ 
64.
65.
    $name = trim($name); /* trim() entfernt ua. überflüssige Leerzeichen am Ende und Anfang des Strings. Danach wird 
66.
    ein "sauberer" String ausgegeben und an die Variable $name übergeben */ 
67.
    if (empty($name)) : array_push($GLOBALS['fehler'], $fehlermld_1."<BR>");  
68.
    $name = NULL; return; endif; /* Vielleicht etwas ungewöhnliche Methode eine if-Abfrage zu machen, aber manchmal  
69.
    übersichtlicher, wenn es um 2-3 kleine Befehle geht: if (Bedingung) : Befehle... endif; */ 
70.
    /* empty() gibt true zurück, falls der String leer, undefiniert oder gleich 0 ist. 
71.
    array_push() wird hier verwendet, um das Fehler-Array zu updaten. Danach wird der Wert der Variable $name evtl. 
72.
    $_POST['vorname'] auf NULL gesetzt. NULL ist sowas wie unbekannt und nicht mit 0 als Zahl zu verwechseln! 
73.
    Wir weisen NULL allen Feldern zu, die irgendwelche Fehler erhalten, das erleichtert die Fehlersuche im Script. 
74.
    return wird verwendet, um in einer Funktion einen Rückgabewert auszugeben (return "Wert") oder die Funktion 
75.
    einfach zu beenden und somit false zu liefern (return;) */ 
76.
    if (preg_match("/^[- A-Za-zÄÖÜßäöü0-9]{2,25}$/i", $name)) 
77.
78.
        return $name; 
79.
80.
        else 
81.
82.
            array_push($GLOBALS['fehler'], $fehlermld_2."<BR>"); 
83.
            $name = NULL; 
84.
            return; 
85.
            } /* Hier wird zuerst in der Funktion preg_match() 
86.
    überprüft ob der String dem Muster entspricht (Argument 1) und falls ja true ausgegeben, wenn preg_match() false 
87.
    zurückliefert wird auch aus unserer Funktion false kommen und die entsprechende Fehlermeldung wird im Array  
88.
    gespeichert */ 
89.
90.
    // Die nächste Funktion unterscheidet sich kaum, es wird nur ein anderes Überprüfungsmuster geschrieben 
91.
function pruefe_email(&$email, $fehlermld_1, $fehlermld_2) 
92.
93.
    $email = trim($email); 
94.
    if (empty($email)) : array_push($GLOBALS['fehler'], $fehlermld_1."<BR>"); $email = NULL; return; endif; 
95.
    if (preg_match( 
96.
    "/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", 
97.
    $email)) 
98.
    /* Dieses lange Ding habe ich nicht selbst geschrieben, da für sowas wie eMails 
99.
    oder URLs es genug fertige Regex im Netz gibt. Man muss ja auch nicht unbedingt zwei Stunden lang etwas in dieser  
100.
    Art selbst entwickeln. (Es sei denn man lernt es gerade :)) */ 
101.
102.
        return $email; 
103.
104.
        else 
105.
106.
            array_push($GLOBALS['fehler'], $fehlermld_2."<BR>"); 
107.
            $email = NULL; 
108.
            return; 
109.
110.
111.
    /* Funktion für die Versendung von Daten: (Verwaltet auch die Fehlermeldungen und Erfolgsmeldungen bei der  
112.
    Benutzung der mail()-Funktion) */ 
113.
function daten_senden($email, $betreff, $inhalt, $betreff_empfbest, $inhalt_empfbest, $fehlermld, 
114.
$fehlermld_empfbest, $erfolgrmld, $erfolgrmld_empfbest, $header = "", $header_empfbest = "") 
115.
/* Funktionsparameter erklärt: 
116.
$email            = eMail-Adresse des Webmasters 
117.
$betreff            = Betreff der Nachricht 
118.
$inhalt            = Inhalt der Mail 
119.
$betreff_empfbest        = Betreff der Bestätigungsmail 
120.
$inhalt_empfbest        = Inhalt der Bestätigungsmail 
121.
$fehlermld        = Fehlermeldung der Nachricht 
122.
$fehlermld_empfbest    = Fehlermeldung der Bestätigungsmail 
123.
$erfolgrmld        = Erfolgreich versendet-Meldung 
124.
$erfolgrmld_empfbest    = Erfolgreich versendet-Meldung der Bestätigungsmail 
125.
$header            = Header der Nachricht (optional) 
126.
$header_empfbest        = Header der Bestätigungsmail (optional) 
127.
*/ 
128.
129.
    if (sizeof($GLOBALS['fehler']) == 0) // Prüft ob das Array mit keiner Fehlermeldung gefüllt wurde 
130.
131.
        /* Prüfen ob die Mail an den SMTP-Server erfolgreich gesendet wird und die passende Meldung ausgeben: */ 
132.
        if (@mail($email, $betreff, $inhalt, $header)) { echo $erfolgrmld."<BR>"; } else { echo $fehlermld."<BR>"; } 
133.
        if ($_POST['bestaetigung']) // Prüft, ob der Besucher eine eMail-Bestätigung wünscht 
134.
135.
            if (@mail($_POST['email'], $betreff_empfbest, $inhalt_empfbest, $header_empfbest)) 
136.
137.
                echo $erfolgrmld_empfbest."<BR>"; // Erfolgreich gesendet-Nachricht 
138.
139.
                else 
140.
141.
                    echo $fehlermld_empfbest."<BR>"; // SMTP-Fehler aufgetreten 
142.
143.
144.
145.
        else // Falls Fehler in den Feldern gefunden wurden: 
146.
147.
            foreach ($GLOBALS['fehler'] AS $value) // Schleife, um alle Fehler aufzuzählen, die eingetragen wurden 
148.
149.
                echo $value; 
150.
151.
152.
153.
?>
Mitglied: godlie
22.05.2009 um 13:25 Uhr
Hallo,

das Problem mit zerstörten Umlauten kommt aus dem falschen Encoding heraus.
Such einfach mal nach Umlaute email php dann bekommst viele informationen darüber,
denn das Encoding ist abhängig vom Ausgangsformat.
Sprich wenn die Website in latin9 ist und die Mail aber als UTF-8 verschickt wird,
kann der Mailclient das nicht erraten was das wirklich sein soll.

Was du bruachen wirst, ist ein richtiger MailHeader in dem das Encoding auch enthalten ist.
Wird dann bei der mail() Funktion mit angegeben.

php.net Hilfe
Bitte warten ..
Mitglied: dog
22.05.2009 um 15:04 Uhr
godlie hat es schon auf den Punkt gebracht.

Nur noch ein paar kleine Stiltipps:

01.
if (sizeof($GLOBALS['fehler']) == 0) 
schreibt man kürzer:
01.
if(empty($GLOBALS['fehler']))
Wenn du deine Funktionen gerne dokumentieren möchtest schau dir mal phpdoc oder doxygen an, die können auch noch ein übersichtliches HTML erzeugen.
01.
    if (empty($name)) : array_push($GLOBALS['fehler'], $fehlermld_1."<BR>");  
02.
    $name = NULL; return; endif; 
Das ist leider definitiv nicht übersichtlicher als:
01.
if (empty($name)) { 
02.
	array_push($GLOBALS['fehler'], $fehlermld_1."<BR>");  
03.
	$name = NULL;  
04.
	return;  
05.
}
Auch wenn dir dein Ansatz im ersten Moment schneller oder platzsparender erscheint, wenn du programmiert musst du immer eins im Hintergrund haben: Wartbarkeit.
Und die definiert sich auch darüber wie leicht der Code für Andere verständlich ist - und da ist das eine Katastrophe
01.
    if (preg_match("/^[- a-zÄÖÜßäöü0-9]{2,25}$/i", $name))
Dank deinem trim() vorneweg gibt es hier kein eigentliches Problem, aber PHP hat eine kleine Eigenart:
Wenn ein String mit einem Zeilenumbruch endet wird das von $ nicht erfasst.
D.h. folgender String "abc\n" würde von der Regex "/^[a-z]+$/i" als korrekt behandelt werden. Um das zu verhindern muss man den Parameter D anfügen. "/^[- A-Za-zÄÖÜßäöü0-9]{2,25}$/iD"

Übrigens gucken Franzosen bei dieser Regex dumm aus der Wäsche
01.
array_push(...
Ich persönlich finde array_push zu umständlich. Genauso kann man schreiben:

01.
$GLOBALS['fehler'][] = $fehlermld_1."<BR>";
Und zur Fehlerbehandlung eignen sich übrigens Exceptions ganz prima und vermeiden riesige if-Konstrukte.
Grüße

Max
Bitte warten ..
Mitglied: n-i-k-e
22.05.2009 um 15:19 Uhr
hallo dog,

danke für deine tipps, nur leider muss ich sagen,
dass ich damit nicht all so viel mit anfangen kann,
da ich das script nicht geschrieben habe,
habe es wie gesagt nur an meine bedürfnisse angepasst,
wäre trotzdem sehr geil wenn du mir mit meinem eigentlichen
problem weiterhelfen könntest,
ich weiß einfach nicht wo ich was hinschreiben soll
damit die umlaute angezeigt werden???
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Linux
gelöst Umlaute zählen - Bash-Script (5)

Frage von plutowitsch zum Thema Linux ...

Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
Script zum Auflösen einer Ordnerstruktur und zurück gesucht (12)

Frage von websolutions zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...