Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Mail alias met wildcard, maar geen catch all

Pagina: 1
Acties:

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ik wil graag dat test1@domein tot en met test100@domein aankomen op info@domein.

Nu heb ik in mijn mysql database een aantal aliassen aangemaakt (1 tm 10), wat prima werkt. Maar is het ook mogelijk om test* te gebruiken? Maar dan zonder dat testa@domein aankomt?

Zo hou ik mijn database nl. het schoonst. De bedoeling is dat er nog veel meer getallen komen, en die wil ik natuurlijk niet allemaal handmatig invullen...

Software: dovecot, exim4 en mysql met een tabel met aliassen.

MySQL:
1
2
3
4
      data = ${lookup mysql{SELECT aliases.goto AS goto FROM domains,aliases $                   (aliases.local_part='${quote_mysql:$local_part}' OR alias$                   aliases.active=1 AND \
                   aliases.domain_id=domains.id AND \
                   domains.fqdn='${quote_mysql:$domain}' AND \
                   domains.active=1}}

[ Voor 27% gewijzigd door Paultje3181 op 27-09-2014 16:11 . Reden: Mysql select toegevoegd ]


  • begintmeta
  • Registratie: November 2001
  • Niet online

begintmeta

Moderator General Chat
Ik kan me voorstellen dat exim wel regular expressions zou kunnen verwerken (postfix unieker geval wel), maar ik ken dat programma niet zo goed. Misschien dat je met die zoekterm wel wat kan vinden.

[ Voor 7% gewijzigd door begintmeta op 27-09-2014 20:31 ]


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Wat ik er uit opmaak is dat ik dan een alias test aanmaak en vervolgens 1tm9 toevoeg als regular expression. Maar dan werkt test 1a dus ook?

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Hangt van je precieze expression af, denk ik dan ;)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
is het werkelijk zo'n probleem om ze handmatig cq met een scriptje toe te voegen aan je DB ?
straks wil je er wellicht tijdelijk 1tje disablen .. daar wordt een regex dan ook niet mooier op zeg maar.

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ik weet niet wat het performance wie doet als je 100.000.000 aliassen op je server hebt. Die orde van grootte gaat het om als het werkt... Dus vandaar

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ik ben ze nu handmatig aan het importeren en ik zit nu op 2,5 miljoen van de 100 miljoen aliassen. Een select * duurt nu gemiddeld 2 seconden. Ik verwacht dus dat het uiteindelijk timeouts op gaat leveren.

Qua regular expressions kom ik alleen voor de domeinen tegen om die te gebruiken. Voor een domein zou het ^test\d(8)\.domein worden.

Maar hoe kan ik dit nu voor een database-driven exim voor elkaar krijgen?

Update: bij 50.000.000 is de query-tijd van een select 30 seconden. Het lijkt dus erom te gaan spannen volgens mij. CPU = 60% voor mysqld.

[ Voor 14% gewijzigd door Paultje3181 op 06-10-2014 23:55 ]


  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
erhmmm mjah .. maakt me wel nieuwsgierig voor wat voor iets (on)geniaals je dat gaat gebruiken ;)

maar goed lijkt me opzich een vrij eenvoudige tabel die niet al te veel geheugen in zou moeten nemen en die je derhalve waarschijnlijk wel geheel in het geheugen kan cachen.

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Een hele hoop mailaliassen...

Maar hoe zou ik dit nu het beste kunnen testen. Ik heb helaas maar 1 eigen server tot mijn beschikking, dus ik kan niet op server 1 1000 mails sturen naar verschillende aliassen en dan op server 2 kijken of ze allemaal aangekomen zijn en hoelang dit geduurd heeft...

[ Voor 82% gewijzigd door Paultje3181 op 07-10-2014 23:05 ]


Verwijderd

Ik denk dat hij met "maakt me wel nieuwsgierig voor wat voor iets (on)geniaals je dat gaat gebruiken" bedoelt:
"Weet je zeker dat dit een slimme manier is om je probleem op te lossen; zou je niet liever je hele probleem voorleggen en ons laten meedenken naar een intelligente, effectieve en beheersbare oplossing in plaats van tientallen miljoenen mailaliassen te maken"

Want eerlijk gezegd kan ik me niet voorstellen dat iemand anders zich voor kan stellen dat dit een nuttige besteding van iemand's leven is, 100 miljoen mailaliassen inkloppen. In het mogelijke geval dat je een mailserver opzet voor een telecom-iets en dat je wilt dat 06********@jouwdomein.nl allemaal aankomt op een vaste mailbox zolang je bepaalde 06nummers nog niet als klant hebt, is een catch-all gevolgd door een scriptje dat die mailbox elke X minuten checkt en mail verwerkt op basis van ontvangstadres bijvoorbeeld vele malen intelligenter dan aliassen aan gaan maken voor 0600000000@jouwdomein.nl tot en met 0699999999@jouwdomein.nl en dan uitzonderingen bakken voor de nummers die je daadwerkelijk als klant hebt.

Anders geformuleerd: er is een reden voor dat niemand 100 miljoen aliassen gebruikt. Het moet wel héél bizar zijn wil er niet een makkelijkere, betere, snellere, efficiëntere, beheersabaardere en goedkopere oplossing te verzinnen zijn.

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
Verwijderd schreef op woensdag 08 oktober 2014 @ 11:07:
Ik denk dat hij met "maakt me wel nieuwsgierig voor wat voor iets (on)geniaals je dat gaat gebruiken" bedoelt:
"Weet je zeker dat dit een slimme manier is om je probleem op te lossen; zou je niet liever je hele probleem voorleggen en ons laten meedenken naar een intelligente, effectieve en beheersbare oplossing in plaats van tientallen miljoenen mailaliassen te maken"
Dat inderdaad .. of er is dus iets geniaals aan wat ik compleet over het hoofd zie .. en dan leer ik er graag van natuurlijk :)

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Een grote kick, maar ik ben er ondertussen eindelijk aan toe om een stuk te verbeteren. De vorige oplossing werkt prima, alleen zorgt natuurlijk voor erg veel load op de server. Nu wil ik dus uiteindelijk een reguliere expressie zijn werk laten doen:

In Exim4 wordt een query gedraaid:
code:
1
2
3
4
5
6
7
8
9
10
11
### router/401_exim4-config_mysql_aliases
system_aliases:
     driver = redirect
     allow_fail 
     allow_defer
     data = ${lookup mysql{SELECT aliases.goto AS goto FROM domains,aliases WHERE \
                   (aliases.local_part='${quote_mysql:$local_part}' OR aliases.local_part='@') AND \
                   aliases.active=1 AND \
                   aliases.domain_id=domains.id AND \
                   domains.fqdn='${quote_mysql:$domain}' AND \
                   domains.active=1}}

Hierin moet volgens mij de reguliere expressie REGEXP '^316[0-9]{8}$' verwerkt worden, maar ik heb dus geen idee hoe. Verder staat alles wat ik vind op lokale users, hetgeen bij mij dus uit staat.
Volgens mij zou er in de query iets moeten komen als:
MySQL:
1
2
3
4
5
6
SELECT aliases.goto AS goto FROM domains,aliases WHERE \
                   (aliases.local_part='${quote_mysql:$local_part}' OR aliases.local_part='@' OR '${quote_mysql:$local_part} REGEXP '^316[0-9]{8}$') AND \
                   aliases.active=1 AND \
                   aliases.domain_id=domains.id AND \
                   domains.fqdn='${quote_mysql:$domain}' AND \
                   domains.active=1

Alleen is die natuurlijk niet gevuld, aangezien ik geen wildcards in mijn tabel heb (of is het zo simpel dat dit wel kan?)

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
Neem aan dat je wel indexen op die kolommen in je DB hebt gezet .. gok dat dat nogal wat query tijd kan schelen .. ?

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ja, staan er in. Maar dan nog duurt het een minuut ongeveer om een select te maken in phpmyadmin

Vandaar de wens om te optimaliseren

[ Voor 63% gewijzigd door Paultje3181 op 15-05-2015 13:19 ]


  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
en heb je alle indidivuele entries nodig .. of is er ook een soort van "default" die jou zou kunnen gebruiken als de local_part niet in de DB zit ?
Dan heb je dus voornamelijk je uitzonderingsgevallen apart in de DB zitten .. zou nogal wat rows schelen.

En wat meer uitleg over de werkelijke data zou ook wel handig zijn .. als je wil optimaliseren

[ Voor 16% gewijzigd door gekkie op 15-05-2015 13:35 ]


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Huidige situatie:
id domain_id local_part goto description active created modified
4 1 31610000001 forward@mijndomein.nl 316 -> forward 1 2014-10-06 21:05:14 2014-10-06 21:05:14

Ik heb voor zover ik weet geen standaard domein of mailadres, wat gebruikt kan worden. Bedoel je een catch-all? Of bedoel je wat anders?

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
eummm je wou toch iets van 00000000000001@bla.com t/m 99999999999999999@bla.com en dan (tussenliggende) mappen naar andere mailadressen ?

Zijn het altijd alle nummers die gemapt zijn ?
Zijn er vaak maar enkele gemapt ?
Wat moet er gebeuren met mail voor nummers die niet gemapt zijn ?

enzovoorts, nogal lastig om iets te optimaliseren als je de constraints niet kent, optimaliseren is vaak het handig gebruik maken van je constraints (cq ze handig op te stellen).

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Het is een systeem waar alle mogelijke nummers in gebruik zouden kunnen zijn. En dus moet alles gemapt worden.

Dus zoals de regexp doet: ^316[0-9]{8}$

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
Paultje3181 schreef op vrijdag 15 mei 2015 @ 19:26:
Het is een systeem waar alle mogelijke nummers in gebruik zouden kunnen zijn. En dus moet alles gemapt worden.

Dus zoals de regexp doet: ^316[0-9]{8}$
Zouden kunnen zijn = het dus niet per definitie zijn ..
waarom moet dan wel alles gemapt worden .. ook als nummers niet ingebruik zijn .. en naar wat wordt het dan gemapt .. als ze niet ingebruik zijn ?

Wat bedoel je met je regexp .. alles wat daaraan match moet mappen naar één en het hetzelfde adres ?
En aangezien het telefoonnummers zijn lijkt het erop dat je series wilt mappen naar één en hetzelfde adres ?

Probeer eens een tikkie scheutiger per keer te zijn met info .. als ik zin had om te quizen had ik er wel eentje uitgekozen met een hoofdprijs van een paar miljoen.

En als je persé wil regex'en .. zet een pipe transport op .. schrijf wat perl python bash php haskell skala lisp .. whatever waar je in wil regexen .. en pipe het daarna weer terug exim in met een flag zodat tie dat niet nog een 2e keer doet, maar dan wel delivered.

[ Voor 13% gewijzigd door gekkie op 15-05-2015 19:42 ]


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ik wil dat 316xxxxxxxx@ domein binnenkomt op paul@domein2 waarbij xxxxxxxx = 00000000 tm 99999999 en alles ertussen.

Ja, ik wil ze allemaal en ja, ze worden niet allemaal gebruikt. Maar ze mogen gewoon niet bouncen

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
dus je zet in je DB de "prefix" 316 .. en in je query strip je voor je where je localpart naar "316" .. en een match.
En dat is dus 1 database row .. ipv alle 00000000 tm 99999999 ?

Ik zie of het probleem niet zo ... of je bent nog steeds niet volledig in wat je nou wil.

[ Voor 20% gewijzigd door gekkie op 16-05-2015 10:09 ]


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
Ik heb nu:
MySQL:
1
SELECT aliases.goto AS goto FROM domains,aliases WHERE '${quote_mysql:$local_part}' REGEXP '^316[0-9]\{8\}\$' AND aliases.local_part='316' AND aliases.active=1 AND aliases.domain_id=domains.id AND domains.fqdn='${quote_mysql:$domain}' AND domains.active=1

Dit werkt prima. Ik heb 316@domein nu expliciet uitgesloten in een hogere Search, waardoor ik ook daarvan geen meldingen krijg.

Dank voor het meedenken.

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
Paultje3181 schreef op zondag 17 mei 2015 @ 08:19:
Ik heb nu:
MySQL:
1
SELECT aliases.goto AS goto FROM domains,aliases WHERE '${quote_mysql:$local_part}' REGEXP '^316[0-9]\{8\}\$' AND aliases.local_part='316' AND aliases.active=1 AND aliases.domain_id=domains.id AND domains.fqdn='${quote_mysql:$domain}' AND domains.active=1

Dit werkt prima. Ik heb 316@domein nu expliciet uitgesloten in een hogere Search, waardoor ik ook daarvan geen meldingen krijg.

Dank voor het meedenken.
Mjah was vooral niet duidelijk wat je constraints waren .. en of er (veel) uitzonderingsitiuaties zijn.
000000000-999999999 allemaal naar 1 .. behalve toevalig 147372727 en 2484948474.

Maar goed .. mooi dat het werkt :)
Je database size en query time zullen wel drastisch gezakt zijn :+

[ Voor 4% gewijzigd door gekkie op 17-05-2015 10:45 ]


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 29-11 18:00
mwah... redelijk... ;)

Vooral je tip om 316 naar het forward adres te laten verwijzen heeft het nu uiteindelijk gedaan... Zonder die optie, was ik nu nog steeds bezig geweest...

  • gekkie
  • Registratie: April 2000
  • Laatst online: 08:10
Achja dat is het voordeel van kijken van een afstandje .. en doorhameren welke restricties er nou werkelijk in je data zitten en of je daar niet op kunt vereenvoudigen. Een betere oplossing voor data dan een database .. what's in a name, is er vaak niet. Als gehannes met data niet in een database kan .. dan kan het daar buiten meestal ook niet (beter) ...
Pagina: 1