Ein eigener Mailserver - wie geht das?

  • Das funktioniert.... :conf:... allerdings versehe ich dieses Statement nicht... ich kanns nicht lesen... denn awk ist ja viel mehr, als nur mal eben ne Feld-Ausgabe... und so tief bin ich da leider nicht drin. Meine Version ist zwar länger und offensichtlich auch umständlicher, aber die verstehe wenigstens.... ich bin jetzt echt hin- und hergerissen. :daumendreh2:

  • LinuxUser=$(/usr/bin/awk -v user="$VirtUser" '$1 == user {print $NF;exit}' /etc/dovecot/alias_maps)

    awk kann leider keine Shell-Variablen als Suchbegriff in normaler Form nutzen, sonst sähe es so aus:

    Code
    /usr/bin/awk '$1 == $VirtUser {print $NF;exit}' /etc/dovecot/alias_maps

    Also einfach "Wenn Feld 1 ($1) gleich der Var $VirtUser ist, dann gib das letzte Feld der Zeile ($NF) aus und beende dich (exit)"


    Deswegen der Umweg awk eine eigene Variable "-v user=" mit dem Inhalt von $VirtUser zu übergeben und die für den Vergleich her zu nehmen.

    Wenn du nichts zu sagen hast, sag' einfach nichts.


  • Das sieht erst besser aus und führt zu 2 korrekten Ausgaben, aber dann zum gleichen Fehler wie oben, siehe das Otto-Problem. Der Linux-User "thomas" hat mehrere Postfächer (virt.user) und eines von denen heisst auch "thomas", ein weiteres "toml".

    Da ich mit Deinem Otto-Beispiel kein Problem hatte, würde ich das gerne verstehen: Kannst Du die entsprechenden Zeilen mal posten? Eigentlich sollte mein grep nur Zeilen finden, die mit dem entsprechenden VirtUser als ganzes Wort anfangen.

  • ...würde ich das gerne verstehen:

    Du hast tatsächlich Recht, das war wirklich nicht das Problem, sondern die Tatsache, dass es mehrere Postfächer gibt, die mit dem Wort "thomas" anfangen.... also nach dem Muster "vorname.nachname@domain.tld". Ich habe 3 Echt-Namen-Postfächer bei 3 Mailhostern. Dementsprechend angelehnt sind die virtuellen User bei Dovecot bezeichnet.

  • Habe ich das richtig verstanden, daß Du virtuelle User der Form "thomas.a", "thomas.b" etc. hast? Dann klappt mein Vorschlag natürlich nicht, da auch das enthaltene Satzzeichen als Wortgrenze (switch "-w") interpretiert wird. Alternative wäre

    Code
    LinuxUser=$(grep "^$VirtUser[[:space:]]" -i /etc/dovecot/alias_maps | awk '{ print $2 }')
  • lutz, danke, das habe ich verstanden... ich bin zum einen an der Logik {print $NF;exit} hängengeblieben...und auch an der Tatsache, dass eingabe, greppen, if-condition und ausgeben alles in einem einzigen Statement stattfindet.... welches schließlich an einer Stelle zusätzlich irritierend auch noch eine bestimmte Rückschluss-Logik verwendet.... und zwar wird das letzte Feld von der Anzahl "Number of fields" zurückgegeben, was bei mir quasi nur zufällig mit dem gewollten Ergebnis als Feld 2 übereinstimmt. In meinem Fall eindeutiger und etwas leichter zu verstehen wäre jedoch die Variante {print $2;exit}.


    Aber insgesamt ist das schon starker Tobak.... und wiedermal bin ich total von den Möglichkeiten in Linux beeindruckt.... aber gleichzeitig auch etwas abgeschreckt... weil ich Sourcecode immer eher nach der Prämisse "hohe reproduzierbarkeit" erstellt habe. :conf:

  • awk kann leider keine Shell-Variablen als Suchbegriff in normaler Form nutzen

    Zumindest nicht ohne wildes escapen. Die folgenden beiden Varianten scheinen zu funktionieren:

    Code
    /usr/bin/awk '$1 == "'$VirtUser'" {print $NF;exit}' am
    /usr/bin/awk "\$1 == \"$VirtUser\" {print \$NF;exit}" am

    Ob das eleganter ist als die Variablenübergabe ist allerdings sicher Geschmackssache... :D

  • 'Linux' sollte nur ausdrücken, dass ich damit Linux-Betriebssysteme im allgemeinen meinte.... unter Windows kannte ich das damals (bis 2012) jedenfalls nicht....

  • Die folgenden beiden Varianten scheinen zu funktionieren:

    Kann ich bestätigen:

    Code
    # export VirtUser="thomas"; echo $(/usr/bin/awk '$1 == "'$VirtUser'" {print $2;exit}' /etc/dovecot/alias_maps)
    dummy

    Die Ausgabe ist korrket. Diese Variante ist mir sogar noch etwas eingängiger....

  • Zumindest nicht ohne wildes escapen. Die folgenden beiden Varianten scheinen zu funktionieren:

    Die 1. (hier) nicht auch (wenn man die Var richtig schreibt), sry


    Der für mich tägliche Fall ist sowas wie awk '/suchwas/ { print $xy} file' und das geht mit Shell-Vars nicht bzw. wie du schriebst, nur mit wildem, fehlerträchtigen Escapen. Deswegen habe ich mir das mit der Hilfsvariablen angewöhnt.

    Wenn du nichts zu sagen hast, sag' einfach nichts.


  • und das geht mit Shell-Vars nicht bzw. wie du schriebst, nur mit wildem, fehlerträchtigen Escapen.

    Anscheinend gehts ja auch ohne escapen, wenn mit ' (vorne und hinten) verhindert wird, dass die Shell-Var expandiert wird. Das heisst, es geht, wenn die Shell-Var als Namen übergeben wird, aber nicht der Inhalt. Und der Inhalt kann nicht übergeben werden, weil die ganze Condition mit ' eingepackt ist, was wiederum die Expansion verhindert.... *hmmm*

  • Geschmackssache, ich finde mixed-quoting unschön und nicht weniger fehlerträchtig. Aber ist doch schön, wenn jeder irgendwo seinen Weg findet.

    Wenn du nichts zu sagen hast, sag' einfach nichts.


  • ich finde mixed-quoting unschön

    Ja, das stimmt... der Vorteil hierbei ist allerdings, mir fällt die Interpretation bzw. das Verstehen der Bedeutung des Statements beim Lesen einfacher.... weil weniger Elemente..... was natürlich aber auch nur meinen subjektiven Vorlieben entspricht.... und ein wenig dem Alter entgegenkommt *fg*.


    Ich habe jetzt jedenfalls diese Variante produktiv übernommen... womit ich im Moment eigentlich auch zufrieden bin. Die anschließenden Tests haben auch keine Umstimmigkeiten ergeben.

    LinuxUser=$(awk '$1 == "'$VirtUser'" {print $2;exit}' /etc/dovecot/alias_maps)


    Danke Euch beiden.... :thumbup:

  • An dieser Stelle noch einmal ausdrücklich meinen Dank an Lutz und Manu für einige wirklich hilfreiche Anregungen, die ich heute endgültig produktiv gesetzt habe.


    Das ist jetzt der aktuelle Stand dreier relevanter Code-Zeilen, die ich heute morgen ca 'ne halbe Stunde lang mit Stresstests und provozierten Fehlersituationen genervt habe... und verdammte hacke.... alles hat zu meiner großen Freude perfekt funktioniert... (:

    Code
    VirtUser=$(echo "$USER" | sed 's/^[ \t]*//;s/[ \t]*$//')
    LinuxUser=$(awk '$1 == "'$VirtUser'" {print $2;exit}' /etc/dovecot/alias_maps)
    LinuxUser_UID=$(/usr/bin/id -r -u "$LinuxUser" 2>/dev/null)
  • Senden funktioniert nicht

    Die Installation habe ich auf einem Raspi3 nach dieser hervorragenden Anleitung durchgeführt. Die Dienste starten ohne Fehlermeldung und das Abrufen der zwei Mailadressen sowie die Zuordnung funktioniern einwandfrei.


    Aber beim senden erhalte ich ständig folgende Meldung:

    Jän 15 16:05:32 raspimail postfix/smtp[864]: warning: SASL authentication failure: No worthy mechs found

    Jän 15 16:05:32 raspimail postfix/smtp[864]: 5106B1FCAF: to=<gemu56@gmail.com>, \

    relay=securemail.a1.net[195.3.96.71]:25, delay=75598, delays=75598/0.19/0.49/0, \

    dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server \

    securemail.a1.net[195.3.96.71]: no mechanism available)


    Ich habe die configs (Postfix & ./rules) xmal verglichen / kontrolliert aber Momentan sehe ich den Wald vor lauter Bäume nicht. Ich halte mich zwar für einen fortgeschrittenen Anwender, aber hier wäre ich für jeden Tipp dankbar.

    Auch wenn ich weiß das ich nicht weiß, bin ich fähig dazuzulernen.(;

  • Das ist jetzt fummelei..... und sucherei.... mal sehen. Wie sind die Ausgaben der beiden folgenden Befehle, jeweils als root:

    Code
    # dpkg -l libsasl2-modules
    # postconf -n | grep smtp_sasl

    Und zweitens, ist sichergestellt, dass der Absender ("from" im Mail-Header) identisch mit der Postfach-Adresse bei gmail ist? Also das der Replace in check_generic_replace_from mit der richtigen from-Adresse ersetzt?

  • Das ist jetzt fummelei..... und sucherei.... mal sehen. Wie sind die Ausgaben der beiden folgenden Befehle, jeweils als root:

    Code
    # dpkg -l libsasl2-modules
    # postconf -n | grep smtp_sasl

    Und zweitens, ist sichergestellt, dass der Absender ("from" im Mail-Header) identisch mit der Postfach-Adresse bei gmail ist? Also das der Replace in check_generic_replace_from mit der richtigen from-Adresse ersetzt?

    Hallo Thomas,

    Danke für Deine rasche Rückmeldung. Hier die Ausgabe in der Console:

    root@raspimail:/home/pi# dpkg -l libsasl2-modules

    Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten

    | Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/

    Halb installiert/Trigger erWartet/Trigger anhängig

    |/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)

    ||/ Name Version Architektur Beschreibung

    +++-================-============-============-=================================

    un libsasl2-modules <keine> <keine> (keine Beschreibung vorhanden)



    root@raspimail:/home/pi# postconf -n | grep smtp_sasl

    smtp_sasl_auth_enable = yes

    smtp_sasl_password_maps = hash:/etc/postfix/get_relayhost_passwd

    smtp_sasl_security_options = noanonymous


    In der "check_generic_replace_from" habe ich folgendes eingetragen:

    # Per-sender replacement of local "from" to Provider-"from"

    #==========================================================


    root@mail gemu@a1.net


    gerhard_a1@mail gemu@a1.net

    gerhard_gmail@mail gemu56@gmail.com


    Ich habe vor kurzem ein Systemupdate gemacht. Seitdem denke ich habe ich das Problem beim Senden.

    Am Wochenende hat's noch geklappt.

    Gehe ich richtig in der Annahme (werde es gleich testen ;-) ), da das "libsasl2-modules" nicht installiert ist daher das Senden nicht funktioniert?


    Jawohlja, das war's - da wäre ich nie draufgekommen, Danke für Deine Mühe

    Auch wenn ich weiß das ich nicht weiß, bin ich fähig dazuzulernen.(;

    Edited once, last by gemu ().