[Postfixbuch-users] @Aliasdomain -> @Domain

Kai Fürstenberg kai_postfix at fuerstenberg.ws
Di Nov 25 19:50:23 CET 2008


Kai Fürstenberg schrieb:
> Thomas -Balu- Walter schrieb am 25.11.2008 16:44:
>> $ postmap -q ausgedacht at barsch-und-scholle.de mysql:/etc/postfix/mysql-domain2domain.cf
>> ausgedacht at barsch-scholle.de
>>
>> Das ist die Alias-Domain-Abfrage. Alle anderen liefern kein Ergebnis zurueck.
> 
>> virtual_alias_maps = 
> 
>>     mysql:SELECT CONCAT('%u', '@', domains.name) FROM domainaliases, domains WHERE domain_id=domains.id AND domainaliases.name="%d" AND domainaliases.mail=1 AND domains.mail=1
> 
> Du prüfst immer noch auf Domain-Basis, nicht jedoch auf User-Basis.
> Schau dir deine WHERE-clause an: WHERE ... = %d (=Domain)
> Da muss aber rein: WHERE ... = %u oder WHERE ... = %s
> 
> Du musst in deiner Abfrage prüfen, ob der USER existiert.
> z.B.
> SELECT CONCAT('%u', '@', domains.name) FROM mailusers WHERE user='%u'
> 
> Existiert %u _nicht_ in der Tabelle, gibt's auch keinen Wert zurück, 
> ergo: Mail-Adresse existiert nicht.
> 
> Aber bei 'WHERE domainaliases.name="%d"' wird wohl immer was 
> zurückkommen, weil die Domain ja wohl in der Tabelle domainaliases 
> drinsteht.

Eine kleine Beispielabfrage:
Du hast zwei Tabellen domain_aliases und users
domain_aliases: (welche Domain wird in welche umgeschrieben)
real            alias
realdoma.in     aliasdoma.in

users: (welche user existieren)
email                   test
user at realdoma.in        12345

das Feld `test` ist nur ein Dummy

Die Abfrage lautet dann:
SELECT CONCAT( '%u', '@', (
   SELECT `real`
   FROM domain_aliases
   WHERE `alias` = '%d'
))
FROM users
WHERE CONCAT( '%u', '@', (
   SELECT `real`
   FROM domain_aliases
   WHERE `alias` = '%d'
))
IN (
   SELECT email
   FROM users
)
LIMIT 1;

Es wird nachgesehen, in welche Domain die Ausgangsdomain umgeschrieben 
wird. Aus diesem Wert und dem Usernamen wird die E-Mail-Adresse (die 
eigentliche) zusammengesetzt und überprüft, ob die Adresse in der 
Userliste existiert. Die SQL-Cracks können das mit Sicherheit noch 
optimieren, aber das Prinzip sollte klar sein.

(Lässt man LIMIT weg, wird für jede vorhandene E-Mail-Adresse in 'users' 
ein Eintrag erzeugt. Also wenn vier Adressen in users stehen, bekommt 
man viermal das gleiche Ergebnis angezeigt.)

-- 
Kai Fürstenberg

PM an: kai at fuerstenberg punkt ws



Mehr Informationen über die Mailingliste Postfixbuch-users