PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (S) Progger für Mailsystem



MasterG
20.12.2009, 16:06
Hallo zusammen,

da bei mir die Paidmails alle per php-mail versendet werden, sorgt das regelmäßig für einen verstopften Mailserver.
Deshalb suche ich jmd, der mir das Mailsystem so umbauen könnte, dass die Mails alle per smtp versendet werden.
Anzumerken wäre, dass der Mailversand kein Standard-Skript vom VMS 1 ist, da dieses schon stark geändert wurde.
Freue mich auf eure Angebote!

jpwfour
20.12.2009, 16:13
Ich würde da nicht das Rad neu erfinden, sondern:

a) eine SMTP-Mail-Klasse runterladen, bspw. von:
http://www.phpclasses.org/search.html?words=smtp&x=0&y=0&go_search=1

b) diese in der extras.lib.php einbinden

c) den aufruf für die klasse in der extras.lib.php in der funkiton usermail() einfügen.

Wobei in dem Falle dann für jede Email eine extra SMTP Verbindung geöffnet wid, und wenn jetzt schon die Anzahl deinen Mailserver überfordert...

Besser:
Newsletter für User deaktivieren, die sich länger als bspw. 30 Tage nicht mehr eingeloggt haben.

Paidmails für User deaktivieren, die schon länger als bspw. 5 Tage keine mehr bestästigt haben.

Mail-Software aktualisieren/besser konfigurieren/wechseln

Mails in Warteschlange stecken, also nicht 200.000 Paidmails mit einen PHP Script aufruf verschicken, sondern via Cronjob nach und nach in bspw. 500er Paketen verschicken lassen.

rudicarell81
20.12.2009, 16:24
Mails in Warteschlange stecken, also nicht 200.000 Paidmails mit einen PHP Script aufruf verschicken, sondern via Cronjob nach und nach in bspw. 500er Paketen verschicken lassen.


So machen wir das und ganz einfach zu Lösen. Einfach in die Usermail den Query rein und einen cron schreiben der immer ein paar Mails verschickt ( bei uns 25 in 5 minuten).

zusätzlich haben wird bei der Funktion USermail noch eine Variable die, die Mails direkt verschickt wenn diese angehängt ist ( bei aktivierungsmails).

Aradiv
20.12.2009, 16:42
Ich hab das auch per Cron gelöst.
allrdings ist der Cron auch bei 3 verschieden Servern jede Minute eingetragen und zusätzlich noch bei einigen Free Cron diensten mit der kürzesten Frequenz. Damit erreiche ich das im schnitt alle 10 sec nach mails geprüft wird.

mfg
Aradiv

MasterG
20.12.2009, 17:01
@jpwfour
Vielen Dank für die Tipps! Das mit dem Cronjob haben wir ja bereits so gelöst und es läuft. Nur das einzige Problem ist eben, dass wir per phpmail versenden, statt per smtp. Das müsste eben in der Mailversand.php umgeschrieben werden.
Vielleicht willst du das ja machen? :-)

Gremlin
20.12.2009, 21:27
Damit erreiche ich das im schnitt alle 10 sec nach mails geprüft wird.
Auch sinnlos, wenn dann Nachts 10k Mails reinkommen ist es im Prinzip wie ein Direktversand und überlastet auch. Ich hab das mit einer Warteschleife gelöst und gebe wichtigen Mails eine höhere Priorität in der DB, und lese die dann sortier nach Priorität aus (welche ich auch direkt in den Mailheader mit übernehme)

breaker
20.12.2009, 23:19
Da braucht man sich eigentlich nur mal Professionelle Newsletter-Scripte ansehen (oder eben den Mailversand aus dem VB-Forum)....dort werden 50-75 gleichzeitig verschickt, danach gibt es ca. 1-5 Sekunden Pause, erst danach werden die nächsten Mails verschickt.

MasterG
03.01.2010, 21:49
Wenn es so einfach ist, wieso meldet sich dann keiner? *g*

jpwfour
03.01.2010, 21:53
Ich wüsste gerne welcher externe SMTP Anbieter einem erlaubt, bspw. 5.000 Mails gleichzeitig rauszuschicken?

Es ist einfach, so eine SMTP Klasse da einzubaun, macht aber m.E.n. keinen Sinn, ich würde eher den Fehelr beheben, dass der MTA auf dem eigenen Server "verstopft".

Was zwar mehr Arbeit macht, aber iwie die schönere Lösung ist :wink:

rudicarell81
13.01.2010, 00:16
Hallo,

wir haben so so gelöst. Leider musste ich einige Teile rausnehmen da diese zu einer fremden Mailklasse gehören.

Ich denke aber damit lässt sich dein Problem schnell lösen.

Außerdem kann ich aus Zeitgründen leider keine Support geben!
Füre das im Phpmyadmin aus:



CREATE TABLE IF NOT EXISTS `vms_mail_cache` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`an` varchar(250) NOT NULL,
`von` varchar(250) NOT NULL,
`betreff` varchar(250) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL,
`mail` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=25223 ;
ersetze die Funktion usermail in lib/extras.lib.php mit dieser hier:



function usermail ($an, $betreff, $nachricht, $von, $cache='1') {
if ($cache == 0) {

// hier die Mailfunktion zum direktversand der Mail
} else {
db_query ('INSERT INTO vms_mail_cache (an, betreff, mail) VALUES ("'.mysql_real_escape_string($an).'", "'.mysql_real_escape_string($betreff).'", "'.mysql_real_escape_string($nachricht).'")');
}
}


Dort kommt der Wert Cache dazu wenn Ihr die Mail direkt verschicken wollt müsst Ihr den wert in der Funktion auf 0 setzen ( Standart ist 1)

Dies ist zum Beispiel bei der Anmeldung ganz sinnvoll.


Danach brauch Ihr noch einen Cron der immer ein paar Mails aus der Datenbank holt und verschickt. Leider musste ich diesen arg anpassen da bei uns eine fremde klasse genutzt wird und ich gerade nicht weiß ob wir diese veröffentlichen dürfen.

Ihr müsst also noch im ganzen script den versand einbauen. Dies geht entweder mir function mail() oder ihr baut euch noch eine smtp klasse ein.

Den Cron könnt Ihr alle Paar Minuten aufrufen es werden dann immer 75 Mails verschickt.




<?php

$mails = db_query('SELECT * FROM vms_mail_cache LIMIT 75')or die(mysql_error());
while($row = mysql_fetch_array($mails)) {

if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/" , $row['an'])) {
echo 'Fehler in der E-Mail-Adresse <strong>'.$row['an'].'</strong><br>';
continue;
}

// hier noch die funktion mail() zum verschicken

echo 'Message has been sent.<br>';
@db_query('DELETE FROM vms_mail_cache WHERE id = '.$row['id']);
}

?>


Leider musste ich einiges rausnehmen ich denke aber vom Prinzip her sollte es klar sein :-).