Frank: Eigene E-Mail header einstellen

N'abend alle miteinander,

Ich wollte gerne die E-Mails, welche ich von meinem Server aus, mittels der PHP Funktion mail(), versende mit Hilfe von Headern eindeutig kennzeichnen, um sie später wieder identifizieren zu können.
Ich habe mir dies so vorgestellt, dass die E-Mail vom Server aus zum Benutzer geschickt wird. Wenn nun ein Problem auftritt, soll der Benutzer die E-Mail an meine E-Mailadresse weiterleiten und ich kann anhand des Headers überprüfen, ob diese E-Mail wirklich von meinem Server verschickt wurde.

Nun habe ich dazu zwei Fragen.
1. Kann ich und wenn ja wie kann ich eigene Header an eine E-Mail hinzufügen?
Könnte ich mir nun einfach einen eigenen Namen und Wert für den Header ausdenken und wie z.B. den "From:"-Header hinzufügen und diese dann in die mail()-Funktion einbauen?
$header .= "IdentifierHeader: $UniqueID\n";

und 2. Muss ich damit rechnen, dass die E-Mailprogramme, meinen selbst erstellen Header löschen oder beim weiterleiten der E-Mail nicht mitsenden? Bzw. kann man das, was ich mir vorstelle überhaupt so realisieren?

Danke im Vorraus

LG
Frank

  1. Hallo,

    1. Kann ich und wenn ja wie kann ich eigene Header an eine E-Mail hinzufügen?

    Nein, aber du könntest deinen From: - Teil angeben.
    Dieser wird bei einer Mailweiterleitung mit übertragen und
    den kannst du dann überprüfen. Oder reicht dir das nicht?

    Der 'Betreff' Eintrag wäre ungeeignet, da zu leicht zu verändern.

    Grüße, Matze

    1. Hallo Matze,

      1. Kann ich und wenn ja wie kann ich eigene Header an eine E-Mail hinzufügen?

      Nein, aber du könntest deinen From: - Teil angeben.

      a) sollte das gehen, siehe Link in meinem Beitrag.

      Dieser wird bei einer Mailweiterleitung mit übertragen und
      den kannst du dann überprüfen. Oder reicht dir das nicht?

      Der 'Betreff' Eintrag wäre ungeeignet, da zu leicht zu verändern.

      b) ist From: genauso leicht zu fälschen wie Betreff, hunderte Varianten mit Millionen wenn nicht Milliarden Virus-E-Mails von Netsky und Co. beweisen das.

      Natürlich ist die eigene Erweiterung genauso leicht zu fälschen ...

      Freundliche Grüße

      Vinzenz

      1. Hallo,

        a) sollte das gehen, siehe Link in meinem Beitrag.

        Ja, ich kam noch nicht dazu darauf zu antworten.
        Wieder was dazu gelernt.

        b) ist From: genauso leicht zu fälschen wie Betreff, hunderte Varianten mit Millionen wenn nicht Milliarden Virus-E-Mails von Netsky und Co. beweisen das.
        Natürlich ist die eigene Erweiterung genauso leicht zu fälschen ...

        Sicher, aber nicht so offensichtlich wie der Betreff.
        Demnach ist die ganze Idee eigentlich nicht so ganz zuverlässig.

        Grüße, Matze

  2. Hallo Frank,

    Ich wollte gerne die E-Mails, welche ich von meinem Server aus, mittels der PHP Funktion mail(), versende mit Hilfe von Headern eindeutig kennzeichnen, um sie später wieder identifizieren zu können.

    1. Kann ich und wenn ja wie kann ich eigene Header an eine E-Mail hinzufügen?
      Könnte ich mir nun einfach einen eigenen Namen und Wert für den Header ausdenken und wie z.B. den "From:"-Header hinzufügen und diese dann in die mail()-Funktion einbauen?

    das sollte gehen. Schau Dir dazu bitte die RFC 3798 an, speziell den Abschnitt

    3.3.  Extension-fields

    und 2. Muss ich damit rechnen, dass die E-Mailprogramme, meinen selbst erstellen Header löschen oder beim weiterleiten der E-Mail nicht mitsenden? Bzw. kann man das, was ich mir vorstelle überhaupt so realisieren?

    Probiere es aus und berichte über Deinen Erfolg/Misserfolg.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      das sollte gehen. Schau Dir dazu bitte die RFC 3798 an, speziell den Abschnitt

      3.3.  Extension-fields

      Danke für den Link. Das macht mir schon einmal Mut.

      Probiere es aus und berichte über Deinen Erfolg/Misserfolg.

      Das werde ich. Ich gebe zu, dass ich noch nichts herumprobiert habe, jedoch wollte ich erstmal etwas Theorie büffeln.
      Ich schreibe mir nun ein Versuchs-Script und probier mal etwas herum.

      LG
      Frank

  3. Hallo Frank,

    Könnte ich mir nun einfach einen eigenen Namen und Wert für den Header ausdenken und wie z.B. den "From:"-Header hinzufügen und diese dann in die mail()-Funktion einbauen?
    $header .= "IdentifierHeader: $UniqueID\n";

    Ja, allerdings müssen selbst erfundene Header afaik mit »x-« anfangen, also z.B. »x-IdentifierHeader: ...«.

    und 2. Muss ich damit rechnen, dass die E-Mailprogramme, meinen selbst erstellen Header löschen oder beim weiterleiten der E-Mail nicht mitsenden?

    Das wird vom Mailprogramm abhängig sein: Thunderbird setzt ja beim Weiterleiten den kompletten Header in den Mailtext, hier bekommst du also auf jeden Fall deinen Header zugeschickt, im Header der weitergeleiteten Mail taucht der selbst erstellte Header aber nicht auf - in anderen Programmen wird das ähnlich sein ...

    Grüße aus Nürnberg
    Tobias

    1. Hallo,

      Ja, allerdings müssen selbst erfundene Header afaik mit »x-« anfangen, also z.B. »x-IdentifierHeader: ...«.

      Ja das ist richtig. Das steht auch in dem RFC von Vinzenz Mai.

      Das wird vom Mailprogramm abhängig sein: Thunderbird setzt ja beim Weiterleiten den kompletten Header in den Mailtext, hier bekommst du also auf jeden Fall deinen Header zugeschickt, im Header der weitergeleiteten Mail taucht der selbst erstellte Header aber nicht auf - in anderen Programmen wird das ähnlich sein ...

      Und danke auch für diese Information. Ich habe es jetzt einmal ausführlich mit Thunderbird getestet.
      Und zwar sendet Thunderbird nur die Header mit, welche auch angezeigt werden. Wenn unter Ansicht -> Kopfzeilen also "Alle" ausgewählt wird, werden auch alle mitgeschickt. Wenn jedoch "Normal" ausgewählt ist, werden nur die von Thunderbird als "Normal" angesehenen Header mitgeschickt.
      Dabei ist egal, ob die E-Mail eingebunden oder als Anhang weitergeleitet wird.

      Und an Matze:

      Demnach ist die ganze Idee eigentlich nicht so ganz zuverlässig.

      In gewisser Weise ist das richtig. Wenn man jedoch eine UniqueID verwendet und vllt. noch ein paar andere Informationen speichert, kann man schon eine recht hohe Zuverlässigkeit erreichen. Zumal es ja nicht darum geht den Header zu entfernen oder zu fälschen, sondern er muss ja mit dem gespeicherten übereinstimmen.

      Insgesamt gibt diese Methode aber anscheinend wirklich nur eine ungenügende Sicherheitsgrundlage.

      LG
      Frank

  4. Hi Frank,

    Wenn nun ein Problem auftritt, soll der Benutzer die E-Mail an meine E-Mailadresse weiterleiten und ich kann anhand des Headers überprüfen, ob diese E-Mail wirklich von meinem Server verschickt wurde.

    Ich weiß nicht, was du genau mit deiner Arbeit vor hast, möchte aber trotzdem mal etwas an dem Konzept zweifeln ;-) Vermutlich willst du nachweisen können, ob eine E-Mail von dir, oder eben nicht von dir versandt worden ist.

    Nun denn, deinen "unique identifier" musst du ja irgendwie erst mal erzeugen, dafür kommen folgende Möglichkeiten in Betracht:

    a) Du berechnest den Identifier auf irgendeine Weise (z.B. md5()-Hash) von irgendwelchen Daten (z.B. von der Verkettung von Absender, Empfänger und Uhrzeit).
    Vorteil: Aus den gegebenen Daten lässt sich einfach erneut der Hash berechnen und mit dem gegebenen Identifier vergleichen.
    Nachteil: Sobald ich deinen Algorithmus zur Errechnung des Identifiers geknackt habe, kann ich E-Mails verschicken, die angeblich von dir sind und einen korrekten Identifier haben.

    b) Du erzeugst eine zufällige Zeichenkette, welche du als Identifier nutzt und speicherst diese auf deinem Server z.B. in einer Datenbank ab.
    Vorteil: Davon ausgehend, dass deine Datenbank sicher geschützt ist, kann man dieses System nur schlecht hacken. Wenn du in der DB mit dem Identifier noch Empfänger und Uhrzeit abspeicherst, kann ich auch mit einem geklauten Identifier als Angreifer nicht viel anfangen, weil eben genau dieser geklaute Identifier nur für den in der DB hinterlegten Empfänger zu der ebenfalls hinterlegten Uhrzeit gültig ist.
    Nachteil: Du kriegst mitunter einen recht großen Datenbestand in deiner Datenbank, was zur Verlangsamung des Systems führen kann, wenn die Daten irgendwann zu viel werden.

    Wenn du also zuverlässig und ohne Datenlast auf deinem Server herausfinden willst, ob Mails wirklich von dir geschrieben bzw. verschickt worden sind, so solltest du alle ausgehenden Mails digital signieren. Als Alternative zum teuren PGP bietet sich hier GPG an. Stellst du hierbei dein öffentliches Zertifikat der Öffentlichkeit zur Ansicht bzw. zum Download bereit, so kann der Empfänger hiermit auch selber prüfen, ob die Mail wirklich von dir verschickt (d.h. signiert) wurde.

    Viele Grüße,
      ~ Dennis.