Postfix sendmail Skript - Performancefrage

hammerhans

New Member
Hallo allerseits,

ich habe einen Server, auf dem Postfix läuft.
Teilweise müssen mehrere Tausend Emails in sehr kurzer Zeit versendet werden, daher versuche ich momentan die Performance zu optimieren.
Bisher habe ich Emails immer über die php mail() Funktion versendet, allerdings ist dies u.U. zu langsam.
Daher folgende Fragen:
Ist es generell sinnvoll Emails direkt über ein Shell-Skript zu versenden (also mit sendmail [options] [message])?
Gibt es Performanceunterschiede zwischen der Verwendung von php und Java und einem Shellaufruf?

Vielen Dank schon einmal
 

LinuxAdmin

Moderator
Ohne es quantitativ belegen zu können, würde ich behaupten, dass es vollkommen egal ist, mit welcher Methode Du /usr/lib/sendmail aufrufst, sei es über ein Shell-Skript, PHP, Java, etc.

Die so versendeten Mails landen in jedem Fall in der Warteschlange des MTA (Postfix) und erst dort findet der wirklich zeitaufwändige Teil der Verarbeitung statt: DNS-Abfragen, Verbindungsaufbau zum entfernten MTA, etc.
 

hammerhans

New Member
Das Problem bei z.B. php mail() ist, dass Abfragen streng sequentiell durchgeführt werden, d.h. die nächste mail wird erst dann versendet, wenn die erste raus ist.
IMO ist es für die Performance besser, wenn die mails parallel in die mailq eingeliefert werden könnten und postfix das Abarbeiten der queue übernimmt, da dann für gleiche hosts die smtp-Verbindungen gechacht werden können...
Das müsste mit Java problemlos möglich sein...
Hat sonst noch jemand Ideen?
 

LinuxAdmin

Moderator
Sieh Dir mal den Abschnitt "Anmerkungen" auf der PHP: mail()-Seite an:
Hinweis: Bitte beachten Sie, dass die mail()-Funktion nicht dazu geeignet ist, große Mengen von E-Mails in einer Schleife zu senden, da die Funktion für jede E-Mail ein SMTP-Socket öffnet und schließt, was nicht sehr effizient ist.
Um große Mengen von E-Mails zu senden, schauen Sie sich bitte die PEAR-Pakete » PEAR::Mail und » PEAR::Mail_Queue an.
 

Huschi

Moderator
IMO ist es für die Performance besser, wenn die mails parallel in die mailq eingeliefert werden könnten
Der Traum eines jeden Spammers! :D

Das parallele Einliefern von Mails geht z.B. mit BCC-Headern. Ist aber nicht wirklich empfehlenswert. Insbesondere da eine Personalisierung nicht mehr möglich ist.

Ein sequentielles Einliefern von Mails funktioniert nur, wenn Du eine Sprache verwendest die auch Threading (fork) unterstützt. Damit könntest Du Mails auf mehrere Threads verteilen die jeweils mit sendmail oder dem SMTP-Port kommunizieren. Allerdings kann es dann vorkommen, dass Du Postfix überreizt.

Du musst auch das Gute daran sehen: Postfix braucht Zeit um eine Mail zu verschicken. Und zwar mehr Zeit als Du zum Einliefern brauchst.

huschi.
 

hammerhans

New Member
BCC kommt nicht in Frage, da es sich um ein Newsletter-System handelt, das personalisierte Emails verschickt.
Also nix von wegen
Der Traum eines jeden Spammers! :D
;)
funktioniert nur, wenn Du eine Sprache verwendest die auch Threading (fork) unterstützt. Damit könntest Du Mails auf mehrere Threads verteilen
^^Deshalb die Idee mit Java...
 

Cenic

Registered User
Laut Postfix Architektur schiebt /usr/lib/sendmail die Mails über postdrop doch ohnehin direkt in die Queue...

Mail ist üblicherweise I/O bound, da der Statusübergang jeder einzelnen Nachricht synchron auf Platte geschrieben werden muß, damit beim Crash nicht plötzlich die Mails weg sind. Ich würde erstmal da schauen: wenn die Platte jetzt schon am Ende ist, dann wird das durch Parallelisierung kaum schneller.
 
Top