mmofacts.com

E-Mail weiterleiten via PHP oder eine bessere methode

gepostet vor 14 Jahre, 12 Monate von BlackScorp

Hi leute,
ich möchte gerne eine E-Mail weiterleiten. Die ganze Prozedur soll ungefair so aussehen:
Benutzer füllt Kontaktformular aus-> klickt auf senden-> erhält eine Bestätigungsmail zur Überprüfung der Daten mit einem Acceptlink -> klickt auf den link -> Die E-Mail wird an den Seitenbetreiber weitergleitet.
Eigentlich könnte ich das ja machen in dem ich die Kontaktdaten in einer MYSQL datenbank abspeichere und dann beim aufruf von kontakt.php?mailid=sowieso dann die daten aus der Datenbank nehme und an die E-Mail adresse des seitenbetreibers verschicke. Problem ist aber dabei der Datei anhang. also ich könnte ja ihn auch vor dem absenden der bestätigungsmail hochladen auf webspace und dann die datei auch noch verschicken. aber was wenn der benutzer eine ungültige email adresse angibt? dann lagern bestätigungsmails in der datenbank und dateianhänge auf dem webspace.
meine idee wäre dass die erhaltene email "einfach" weitergeleitet wird aber wie geht das in php? oder gibt es da eine bessere möglichkeit?
MFG

gepostet vor 14 Jahre, 12 Monate von DrakeL

Warum nicht einfach aus den Daten des Kontaktformulars sofort E-Mail generieren für den Seitenbetreiber? Akzeptierungslink als Spamschutz?

Ich würde die Daten auf dem Server speichern und dem Benutzer nur ein Link mit einer ID zuschicken. Ansonsten müsstest du ja die Daten hochladen und dem Benutzer komplett schicken sodass er diese wieder beim Bestätigen hochlädt.

Die Bestätigungsmails sollten generell nur 1 Tag (oder ähnliche Zeiträume) gültig sein, danach kannst die Daten aus der Datenbank und die Dateianhänge ja per CronJob löschen.

Zum Weiterleiten brauchst du ein Postfach an welches der Benutzer die E-Mail schickt und mit PHP musst dieses Postfach auslesen und die E-Mails an den Seitenbetreiber weitersenden. Aber warum sollte man dies tun? Entweder dem Benutzer direkt Kontaktmöglichkeit an den Seitenbetreiber geben und keine Zwischenschicht dazwischen oder einfach eine Weiterleitungsadresse verwenden.

gepostet vor 14 Jahre, 12 Monate von BlackScorp

Akteptierungslink soll nicht als spamschutz dienen sondern damit die Kontaktperson eine gültige email adresse angibt. Für Spamschutz habe ich captcha abfrage und ip sperre. Ich habe mir auch schon überlegt die Daten aus der Datenbank und die Dateianhänge aus dem webspace nach 1em tag mit chronojobs zu löschen. problem ist, dass der Auftragsgeber keine chronojobs auf seinem webspace nicht unterstützwerden. Habe schon überlegt die Dateianhänge als blob in Datenbank abzuspeichern aber das macht wieder Probleme da blob die datenbank verlangsamt  und sehr begrenzt ist. statt chronojobs dachte ich, ich mache ein button im admin bereich für "unbestätigte mails löschen". nur dachte ich, ich werde es machen wenn es garkeine möglichkeit gibt die erhaltene email vom email konto an php weiterzusenden und dann an den seitenbetrieber zu schicken. naja muss ich wohl oder übel doch die dateianhänge auf den webspace hochladen.vielen dank für deine Antwort

MFG

BlackScorp

gepostet vor 14 Jahre, 12 Monate von DrakeL

Original von BlackScorp

[...] Ich habe mir auch schon überlegt die Daten aus der Datenbank und die Dateianhänge aus dem webspace nach 1em tag mit chronojobs zu löschen. problem ist, dass der Auftragsgeber keine chronojobs auf seinem webspace nicht unterstützwerden.

Gibt es eigentlich zwei gute Lösungen die mir einfallen:

  • Externer Anbieter von CronJobs (da gibt es auch kostenlose)
  • Bei jedem Request Prüfung anstossen und die abgelaufenen Bestätigungen löschen
gepostet vor 14 Jahre, 12 Monate von BlackScorp

Original von DrakeL

  • Bei jedem Request Prüfung anstossen und die abgelaufenen Bestätigungen löschen

ahh wieso bin ich nicht selber draufgekommen. danke

gepostet vor 14 Jahre, 12 Monate von BlackScorp

ich habe jetzt einige probleme mit meinem kontakt formular:
Also die Bestätigungsmail wird verschickt an die Kontaktperson mit dateianhang wenn vorhanden. aber wird die irgendwie auch an den administrator verschickt. und dann wenn ich auf den aktivierungslink klicke kommt folgende meldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL .....
vllt kann sich das mal ja jemand anschauen und mir weiterhelfen.
kontakt.php welche mir die kontaktform ausgibt und die methoden der klasse kontakt ausführt
http://pastebin.com/m6c7bbd50
kontakt klasse.php
http://pastebin.com/m21a9bc7a
Hoffe jemand kann mir nachhelfen
MFG

gepostet vor 14 Jahre, 12 Monate von DrakeL

PHP:

  1. $sql = mysql_query(sprintf("SELECT * FROM".TABLE_PREFIX."mails WHERE code ='%s'",
  2.                 mysql_real_escape_string($id)));

Kann es sein dass in deiner Senden Methode für den Admin nach dem "FROM" ein Leerzeichen fehlt? Das würde den SQL Fehler erklären. Generell solltest mal drüber nachdenken die Rückgabe eines Querys zu kontrollieren bevor dir die Zeilen davon holst. Rest ist mir etwas zuviel zum Lesen. Die Klasse erscheint mir arg überladen und vermischt.

gepostet vor 14 Jahre, 12 Monate von BlackScorp

jop hattest recht nun funktioniert das alles so wie ich will. es seidenn ich verschicke datein mit. dann wird die bestätigungsmail an admin und an kontaktperson geschickt und aktivieren geht garnicht weil der query nicht ausgeführt werden kann. wahrscheinlich wird INSERT INTO nicht ausgeführt wenn datein vorhanden sind leider kann ich im phpmyadmin nicht naschauen weil die person für den ich das erstelle mir keine strato zugangsdaten liefern will ich muss immer raten was in der strato datenbank drin steht oder jedesmal nur um eine tabelle anzuzeigen eine extra datei erstellen mit den querys:( aber ich schau mal weiter vllt finde ich was. ach ja wieso ist denn die klasse überladen? ich habe halt versucht alles, was man benötigt in eine klasse reinzupacken. sollte ich es lieber mit vererbung aufteilen`??

gepostet vor 14 Jahre, 12 Monate von DrakeL

Du solltest dir von der Person ein Dump von der Datenbank geben lassen (wenn dort keine sensiblen Daten hinterlegt sind, ansonsten diese anonymisieren vielleicht oder nur mit Testdaten gefüllt). Wenn du etwas nicht testen kannst, kannst es auch nicht richtig entwickeln.

Eine Klasse sollte nur eine oder wenige Verantwortlichkeiten haben und wenig Abhängigkeiten. Deine Klasse weiß genau was eine E-Mail ist und gleichzeitig ist sie an MySQL gebunden. Würdest die Klasse in einem anderen Projekt verwenden wollen wo E-Mails mit Daten aus Textdateien generiert werden geht es schon nicht mehr. Daher sollte man die Verantwortlichkeiten E-Mail und Datenbank trennen um beide Komponenten unabhängig voneinander nutzen zu können. Eine Vererbung kann man hier nicht nutzen, da das eine keine Spezialisierung/Generalisierung vom Anderen ist.

Eine Assozation wäre eher zu bevorzugen. Beispiel: Du nutzt ein Model "Email" (also eine Klasse), welches die Daten einer E-Mail enthält (Empfänger, Absender, Betreff, Text usw.). Eine Klasse "Datenbank" besitzt die Funktionalitäten um die Daten aus einer Datenbank zu laden und eine Klasse "Mail" kann eine E-Mail dann über die "mail()" Funktion verschicken.

Vorgehensweise: Mit der Klasse Datenbank holst dir die Daten und befüllst damit das Objekt für die E-Mail, dieses gibst an die Mail Klasse weiter zum verschicken. Du willst eine E-Mail aus einer Textdatei erstellen? Dann hol dir die Daten für das E-Mail Objekt aus einer Textdatei zur Befüllung du kannst es weiterhin an deine Mail Klasse zum Versenden weitergeben. Du willst nicht über die PHP Funktion "mail()" versenden, sondern am Bildschirm anzeigen? Dann schreib dir ein View (ein Skript zur Anzeige), welches ein Objekt einer E-Mail bekommt. Du kannst so weiter beliebig kompinieren und hast immer unabhängige Klassen.

Wenn dich diese Denkweisen interessieren: "Entwurfsmuster von Kopf bis Fuss" oder "PHP Design Patterns" wären gute Lektüren in diese Richtung (also in Richtung Entwurfsmuster und Klassenmodellierung), sehr empfehlenswert.

gepostet vor 14 Jahre, 12 Monate von knalli

Oder auch: Objektorientierte Analyse und Design, gleiche Reihe, "gleiche" Thema.

Auf diese Diskussion antworten