Enny: php.ini mail funktion konfigurieren

Hallo miteinander!

Ich habe einen Server auf dem verschiedene Scripte von verschiedenen User ausgeführt werden. Weiterhin ist auf diesem Server PHP 5 installiert und eine Domain gemappt, z.B. mydomain.com. Mein Ziel ist es eine Möglichkeit zu finden, dass wenn User Emails mit der mail() Funktion verschicken und diese nicht als Absender @mydomain.com haben, die Mails nicht zugestellt werden. Im Klartext die mail() Funktion nur für Absender einer bestimmten Domain zu, zulassen...

Ist so etwas möglich und wenn ja wie? (php.ini ?) Hat jemand eine Ahnung? Wie gesagt ich kann die Prüfung nicht vorher vornehmen, erst dann wenn die Mail an die PHP Funktion übergeben wurde.

Mein Ansatz war die php.ini doch leider konnte ich dazu nichts befriedigendes finden...

Danke und Grüsse
Enny

  1. Moin!

    Ist so etwas möglich und wenn ja wie? (php.ini ?) Hat jemand eine Ahnung?

    Das filterst du schlauerweise am Mailserver.

    - Sven Rautenberg

    1. Hallo Sven,

      erstmal Danke für die schnelle Antwort. Leider ist das nicht möglich, denn mein Exim Mailserver wendet leider die eingebaute Condition sowohl auf ausgehende als auch eingehende Mails. D.h. ich kann von *@mydomain.com schicken aber nicht mehr empfangen, außer von *@mydomain.com. Nachdem es mir nicht möglich war eine passende Condition zu bauen, versuche ich es über die mail() Funktion...

      Grüsse und Dank
      Enny

      1. echo $begrüßung;

        Leider ist das nicht möglich, denn mein Exim Mailserver wendet leider die eingebaute Condition sowohl auf ausgehende als auch eingehende Mails. D.h. ich kann von *@mydomain.com schicken aber nicht mehr empfangen, außer von *@mydomain.com. Nachdem es mir nicht möglich war eine passende Condition zu bauen, versuche ich es über die mail() Funktion...

        Gebetsmühle: Verwende bitte für beispielhafte Domainnamen die dafür vorgesehenen, nicht einfach irgendwelche, die noch dazu anderen Personen/Organisationen gehören.

        Die Funktion mail() hat keinen eingebauten Filter. Exim kann man aber sehr wohl so konfigurieren, dass es nur die ausgehenden Mails filtert. Das passende Stichwort müsste Relay sein, wenn ich mich recht erinnere.

        echo "$verabschiedung $name";

        1. Hallo und vielen Dank für die Antwort.

          Ich hab wirklich versucht den Exim zu konfigurieren, aber wie gesagt dei Regel wurde auf eingehende und ausgehende Mails angewand.

          grüsse

          1. echo $begrüßung;

            Ich hab wirklich versucht den Exim zu konfigurieren, aber wie gesagt dei Regel wurde auf eingehende und ausgehende Mails angewand.

            Mit der Information wird man dir nur sagen können, dass du da wohl etwas falsch gemacht hast.

            echo "$verabschiedung $name";

            1. Danke für die Antwort, leider scheinst Du auch keine Condition für das Exim Config zu haben, in der man lediglich die Domain ersetzen müßte und schon würde es funktionieren, richtig?

              Nur zur Info, hier geht es nicht um einen vergessen Semicolon oder Formfehler...

              1. echo $begrüßung;

                Danke für die Antwort, leider scheinst Du auch keine Condition für das Exim Config zu haben, in der man lediglich die Domain ersetzen müßte und schon würde es funktionieren, richtig?

                Doch, hab ich: http://www.exim.org/exim-html-current/doc/html/spec_html/ch40.html#SECTrelaycontrol

                Nur zur Info, hier geht es nicht um einen vergessen Semicolon oder Formfehler...

                Nur zur Info: Es gibt hier keine Hellseher, Wenn du willst, dass jemand sagt, was du falsch machst, musst du schon deine Konfiguration zeigen.

                echo "$verabschiedung $name";

                1. Erstmal danke für den Link, ich bin mir ziemlich sicher diesen schon durchgelesen zu haben. Nichts desto trotz habe ich es mir nochmals angeschaut aber trotzdem werde ich nicht ganz schlau aus der Sache.

                  Wenn:

                  domainlist relay_to_domains =

                  leer ist, heißt es dass Mails von allen Domains angenommen und weitergeleitet werden, oder? In der Zwischenzeit habe ich versucht meine Domain einzutragen, funktioniert aber leider nicht... :-(

                  grüsse

                  1. echo $begrüßung;

                    Wenn:
                    domainlist relay_to_domains =
                    leer ist, heißt es dass Mails von allen Domains angenommen und weitergeleitet werden, oder? In der Zwischenzeit habe ich versucht meine Domain einzutragen, funktioniert aber leider nicht... :-(

                    Das allein reicht noch nicht, denn das ist quasi nur das Setzen einer Variablen. Es kommt darauf an, wie die ACL-Regeln konfiguriert sind und von dieser und gegebenenfalls weiteren Listen Gebrauch machen - oder auch nicht.

                    echo "$verabschiedung $name";

                    1. Stimmt, Du hast recht. Würde es nicht ausreichen einfach:

                      acl_check_rcpt: +local_domains

                      hinzu zu fügen?

                      grüsse und dank

                      1. echo $begrüßung;

                        Stimmt, Du hast recht. Würde es nicht ausreichen einfach:
                        acl_check_rcpt: +local_domains
                        hinzu zu fügen?

                        Nein, die Syntax ist eine andere, wie die verlinkte Seite zeigt:

                        acl_check_rcpt:
                          accept domains = +local_domains : +relay_domains
                          accept hosts   = +relay_hosts

                        Ob es ausreicht? Die Exim-Konfiguration ist zu mächtig, um anhand eines kleinen Ausschnittes deine Frage vollständig beantworten zu können.

                        Im obigen Beispiel wird der RCPT, also der Empfänger (gemäß SMTP-Protokoll, nicht die To-Zeile im Mail-Header) gegen die local_domains und relay_domains getestet. Immer wenn eine passende accept- oder deny-Bedingung erfüllt wird, ist der ACL-Test abgeschlossen. Die zweite accept-Zeile testet den Host des Absenders gegen relay_hosts. Es sind sicher noch weitere Regeln in dener Exim-Konfiguration enthalten. Die beiden Beispielzeilen erlauben jedenfalls einen Versand für alle Empfänger mit lokalen Domains und solchen, für die Exim als Relay funktioniert sowie für Absender mit bestimmten Hosts, also lokale Absender (wenn nur deren Hosts in relay_hosts stehen).

                        Das ist erstmal nur die Erlaubnis. Es gibt weitere Konfigurationen, die für den Transport zuständig sind und die Nachrichten in die konfigurierten Kanäle weiterleiten. Auch daran kann ein Mailausliefern scheitern.

                        echo "$verabschiedung $name";

                        1. echo $begrüßung;

                          »» Stimmt, Du hast recht. Würde es nicht ausreichen einfach:
                          »» acl_check_rcpt: +local_domains
                          »» hinzu zu fügen?

                          Nein, die Syntax ist eine andere, wie die verlinkte Seite zeigt:

                          acl_check_rcpt:
                            accept domains = +local_domains : +relay_domains
                            accept hosts   = +relay_hosts

                          Ob es ausreicht? Die Exim-Konfiguration ist zu mächtig, um anhand eines kleinen Ausschnittes deine Frage vollständig beantworten zu können.

                          Im obigen Beispiel wird der RCPT, also der Empfänger (gemäß SMTP-Protokoll, nicht die To-Zeile im Mail-Header) gegen die local_domains und relay_domains getestet.

                          Bevor ich Dich falsch verstehe, der Empfänger ist in diesem Fall wer genau?
                          Mein Ziel ist es, dass keine Mail über meinen Server rausgeht, die nicht in der From Zeile @localedomain.irgendwas hat. Eine Hostproblematik besteht bei mir nicht.

                          Das ist erstmal nur die Erlaubnis. Es gibt weitere Konfigurationen, die für den Transport zuständig sind und die Nachrichten in die konfigurierten Kanäle weiterleiten. Auch daran kann ein Mailausliefern scheitern.

                          Klingt so als ob es mehrere Wege gibt dass zu erreichen was ich gern hätte, die Frage ist wo man am besten angreift.

                          Grüsse

                          1. echo $begrüßung;

                            » Im obigen Beispiel wird der RCPT, also der Empfänger (gemäß SMTP-Protokoll, nicht die To-Zeile im Mail-Header) gegen die local_domains und relay_domains getestet.

                            Bevor ich Dich falsch verstehe, der Empfänger ist in diesem Fall wer genau?

                            Dazu muss man ein wenig das SMTP kennen. SMTP interessiert sich nicht für den Inhalt, wozu auch die Mailheaderzeilen zählen. Nach etwas Geplänkel bekommt der SMTP gesagt, an wen die Email gehen soll (Recipient). Wenn der Server an der Stelle den Empfang ablehnt, ist noch kein einziges Byte der Mail (inklusive ihrer Header) übertragen worden. Es wurde bis dahin lediglich der Umschlag (Envelope) ausgewertet.

                            Du kannst dir das im Vergleich zur Briefpost so vorstellen: Auf dem Briefpapier steht der Briefkopf mit Angaben wie Empfänger, Absender, Datum, Firmenlogo und Betreff. Das wären bei der Email die Headerzeilen. Anrede, Fließtext und Grußformel sind der Email-Body. Das ganze kommt in einen Umschlag und auf dem kann etwas ganz anderes stehen als im Briefkopf. Die Post interessiert sich nur für die Angaben auf dem Umschlag und nicht für die im Inhalt. Die Umschlag-Angaben sind das was im SMTP als MAIL FROM und RCPT TO übertragen wird. Siehe auch: http://de.wikipedia.org/wiki/SMTP

                            Mein Ziel ist es, dass keine Mail über meinen Server rausgeht, die nicht in der From Zeile @localedomain.irgendwas hat. Eine Hostproblematik besteht bei mir nicht.

                            Die From-Zeile ist beliebig fälschbar (und das ist leider nicht nur Theorie). Beim SMTP-Versand interessiert die RCPT-Angabe. Der Einlieferer einer Mail muss nur angeben, an wen die Mail gehen soll. Eine From-Angabe ist bei PHPs mail()-Funktion optional, bzw. muss, wenn gewünscht, extra in den zusätzlichen Headerzeilen angegeben werden. Wenn du keine From-Angabe machst, willst du sicherlich auch, dass deine Post befördert wird. PHPs mail()-Funktion fügt auch von sich aus keine From-Angabe ein. Exim kann demzufolge diese Angabe nicht auswerten. Beim Durchgehen der ACL steht Exim nur die die SMTP-RCPT-Angabe zur Verfügung. Du möchtest deinen Exim so konfigurieren, dass er als RCPT nur deine Domain(s) durchlässt, was im Allgemeinen bei ankommenden Mails der Fall ist, denn ansonsten wäre er ein offenes Relay und damit gemeingefährlich. Für eine Kontrolle der Mails die "nach außen" gehen sollen, bleibt dir dann noch der Host des Einlieferers übrig. Also musst du da die Hosts angeben, von denen Post versendet wird. Das wären der PHP-Server und andere Hosts in deinem Netzwerk die über den Exim senden sollen.

                            » Das ist erstmal nur die Erlaubnis. Es gibt weitere Konfigurationen, die für den Transport zuständig sind und die Nachrichten in die konfigurierten Kanäle weiterleiten. Auch daran kann ein Mailausliefern scheitern.
                            Klingt so als ob es mehrere Wege gibt dass zu erreichen was ich gern hätte, die Frage ist wo man am besten angreift.

                            Es sind einfach mehrere Schritte, die der Exim nacheinander abarbeiten muss, um eine Mail zu versenden. Momentan bist du ja noch beim ACL. Wenn das erledigt ist, kommt der nächste Schritt und das ist das Ausliefern. Du kannst deine Post an den SMTP-Server deines Providers weitergeben oder sie direkt an den Empfängerbriefkasten ausliefern. Hierbei gibt es auch einige Dinge zu konfigurieren, aber das hast du vielleicht schon erledigt, sonst gingt gar kein Mailversand.

                            echo "$verabschiedung $name";

                2. erstmal danke für die antwort, heißt das im klartext, dass wenn ich hier eine domain eintrage nur noch mails von dieser domain angenommen werden ?

                  domainlist relay_to_domains =

                  Wenn es so ist, funktioniert es leider nicht...