Bogus: Schon wieder mal: Mailversand und Script starten ...

Hallo Ihr da draussen!

ich habs zwar schon des öfteren geposted, konnte aber nie eine helfende antwort ergattern. nun, bevor man mich einliefert, weil ich gleich die letzten nervern verlieren, frag ich nochmal:

a) hat wirklich niemand erfahrung im versenden von bis zu 10000 emails? das alles sollte auf einmal vor sich gehen. am besten ohne das man online sein muss (ca. 4 stunden sind aber akzeptabel).
ich hab's schon soweit geschaft, dass ich einfach per perl routine die mails an ne liste versende (mit hilfe der mailer.pm). wenn man auf 'senden' klickt, dann kommt eine neue seite, mit den text wie er in der mail erscheint, und dann untereinander für jede adresse: nachricht wurde an .... gesendet, oder auch nachricht konnte nicht gesendet werden.

funzt soweit ganz gut. ich hab über 1000 mails in ca. 30 minuten versendet. aber jetzt kommts: mein kunde, für den ich das code hat nur probleme damit. ca. alle 2 min, sagt er, bricht das script ohne grund ab. WIESO?
bei mir läufts ewig....

ok, nächstest problem: ich hab ein script per mail bekommen (total simpel), welches nur ein input abfragt, und dieses dann an ne liste aus einer datei, versendet.
wieder ne schleife......allerdings hier mit direktem zugriff auf sendmail (ohne mailer.pm), und ohne bestätigungsbildschirm. angeblich, so der author, muss man das script nur aufrufen, und kann das browserfenster dann schliesen oder ne andere page aufrufen. die mails werden angeblich trotzdem versendet.
hab ich 'teilweise' getestet, und sieht so aus, als wäre es wirklich so.
...-- nun die idee, keine bestätigungseite anzuzeigen, in mein script übernommen. das script aufgerufen, ne zeitlang gewartet und den browser geschlossen. es sind aber bei weitem nicht alle mails angekommen (genau gesagt 2 statt 200). wieso also funktioniert das bei meinem script nicht?

ist es überhaupt möglich, dass ein script weiterläuft bis es alles durhgearbeitet hat, nur weil keine ausgabe an den browser erfolgt?

oder, vielleicht gibt es ne andere möglichkeit in perl, dem script einfach zu sagen 'mach alles fertig, egal ob browser anwesend oder nicht, und dann selbst beenden'?
hab da (ich glaub von erik, danke nochmal) was von setsid usw. erfahren. aber nichteinmal dass macht was ich will :-(

zum schluss noch: bitte erzählt mir nichts von majordomo
und: da ich jetzt geschlagene 2 monate versuche das 'schei.....ding' zum laufen zu kriegen, bin ich echt kurz vorm durchdrehen. also, vielleicht bewahrt mich jemand vor der klappsmühle - wäre echt super.

ein riesiges DANKE an den er die rettende lösung weiss.

mfg
Bogus

  1. ein riesiges DANKE an den er die rettende lösung weiss.

    Es fällt mir schwer, Deine Fragestellung klar zu erkennen.

    Das einzige, was mir auffällt ist, daß Du den Browser-Dialog und das Versenden der Mails irgendwie miteinander gekoppelt zu haben scheinst. Das würde ich schon mal bestimmt nicht tun - weder will ich, daß die Verbindung so lange bestehen muß, noch will ich, daß mein Skript auf einem anderen Server mit anderen Timeout-Einstellungen anders funktioniert.

    Ich würde auf jeden Fall also die Dateneingabe für die zu versendende Mail (ggf. via CGI) damit enden lassen, daß eine entsprechende Datei erstellt wird. Über einen völlig anderen Mechanismus (z. B. cron, jedenfalls nicht über den Webserver) würde ich dann das Programm starten, welches diese Datei wegfrißt und die Mails versendet.

    Dein Posting klingt, als würdest Du das nicht so machen ...

    1. Hye michael

      Ich würde auf jeden Fall also die Dateneingabe für die zu versendende Mail (ggf. via CGI) damit enden lassen, daß eine entsprechende Datei erstellt wird. Über einen völlig anderen Mechanismus (z. B. cron, jedenfalls nicht über den Webserver) würde ich dann das Programm starten, welches diese Datei wegfrißt und die Mails versendet.

      Dein Posting klingt, als würdest Du das nicht so machen ...

      du hast recht, ich mache es nicht so. mein script fragt zuerst via formular den mailinhalt ab. dieser wird dann an das script übermittelt, und das script beginnt mit dem versenden, und gibt gleichzeitig für jede mail - nach dem versenden - eine bestätigung aus.

      wie mache ich das mit cron? hab schon mal reingeschaut. weiss jetzt genau soviel wie vorher. ne..doch nicht. ich weiss bereits dass es 'cron' und 'crontab' gibt ...
      gibt es einen perl-befehl, mit dem ich das ganze starten kann? oder laufen cron anweisungen nur via telnet? mit perl wäre es besser, denn ich kann ja nicht meinem kunden erklären, dass er erstmal mit telnet und cron umgehen können muss, damit er die mails versenden kann :-(

      -- ist es möglich, dass ein script zuende ausgeführt wird (nachdem es die daten erhalten hat), nur weil keine ausgabe an den browser erfolgt? ---

      mfg
      Bogus

      1. Hallo Bogus!

        du hast recht, ich mache es nicht so. mein script fragt zuerst via formular den mailinhalt ab. dieser wird dann an das script übermittelt, und das script beginnt mit dem versenden, und gibt gleichzeitig für jede mail - nach dem versenden - eine bestätigung aus.

        Warum erstellst Du nicht in einem Mailprogramm Deiner Wahl eine einfache Mailingliste und schickst einfach die Mails an diese Liste? (Zumindest Netscape Messenger kann das, und richtige Mailprogramme sicher auch.) Wenn eine Mail nicht ausgeliefert werden kann, bekommst Du normalerweise entsprechende Meldungen (Mails) zurueck (von einem Kerl namens Mailer demon *g*).

        wie mache ich das mit cron? hab schon mal reingeschaut. weiss jetzt genau soviel wie vorher. ne..doch nicht. ich weiss bereits dass es 'cron' und 'crontab' gibt ...
        gibt es einen perl-befehl, mit dem ich das ganze starten kann? oder laufen cron anweisungen nur via telnet?

        Du weisst jetzt zwar, dass es das gibt, aber hast nicht die offensichtlich geringste Ahnung, um was es dabei geht. In einem crontab kannst Du festlegen, dass zu einem bestimmten Zeitpunkt ein bestimmtes Programm (auch Script) ausgefuehrt wird. Der klassische Anwendungsfall ist wohl das Backup, das jeden Tag nach Feierabend automatisch anlaufen soll.

        -- ist es möglich, dass ein script zuende ausgeführt wird (nachdem es die daten erhalten hat), nur weil keine ausgabe an den browser erfolgt? ---

        Nein. Wenn der Browser die Verbindung abbaut (und das tut er, wenn Du Stop drueckst oder das Fenster schliesst), wird der Webserver das Script umgehend killen. Genau das wollte Erik Tews damals mit seinem Vorschlag umgehen.

        Calocybe

        1. hallo calocybe :-)

          Warum erstellst Du nicht in einem Mailprogramm Deiner Wahl eine einfache Mailingliste und schickst einfach die Mails an diese Liste?

          Warum? Jeden Tag kommen So ca. 100 an- ab- und ummeldungen ins Haus. Die alle per Hand ändern? Deshalb wollte mein Kunde ja ein Script. Damit die ganze ummelderei automatisch erledigt wird.
          Ansonsten ist es sicher ne gute idee.

          Achja, bezüglich: script läuft weiter wenn browser aus.
          warum hat das programm dann ordnungsgemäß alles beendet, obwohl ich schon lange weg war? Hab es getestet, indem ich 1000 mails an mich selbst gesendet habe. Programm aufruf ... nach ein paar sec. abgebrochen. Nachdem ich dann 500 Mails in der Mailbox hatte, hab ich das programm vom server gelöscht, damit ich nicht noch 500 abrufen muss.
          Hat funktioniert *grübel*

          mfg
          Bogus

          1. Achja, bezüglich: script läuft weiter wenn browser aus.
            warum hat das programm dann ordnungsgemäß alles beendet, obwohl ich schon lange weg war? Hab es getestet, indem ich 1000 mails an mich selbst gesendet habe. Programm aufruf ... nach ein paar sec. abgebrochen. Nachdem ich dann 500 Mails in der Mailbox hatte, hab ich das programm vom server gelöscht, damit ich nicht noch 500 abrufen muss.
            Hat funktioniert *grübel*

            Hm ... kann es sein, daß auf Deinem Testsystem andere Timeouts im Webserver eingestellt sind als in der produktiven Umgebung Deines Kunden? Oder eine andere Last auf dem Rechner? Oder ...
            Bei timeout-Effekten sind umzählige Ursachen denkbar, und reproduzierbar ist da meistens nix.

        2. wie mache ich das mit cron? hab schon mal reingeschaut. weiss jetzt genau soviel wie vorher. ne..doch nicht. ich weiss bereits dass es 'cron' und 'crontab' gibt ...
          Du weisst jetzt zwar, dass es das gibt, aber hast nicht die offensichtlich geringste Ahnung, um was es dabei geht. In einem crontab kannst Du festlegen, dass zu einem bestimmten Zeitpunkt ein bestimmtes Programm (auch Script) ausgefuehrt wird. Der klassische Anwendungsfall ist wohl das Backup, das jeden Tag nach Feierabend automatisch anlaufen soll.

          Ich mache damit auch Produktionsüberwachung: Alle <n> Minuten läuft ein triviales Shell-Skript via cron an, schaut sich auf der Kiste um (wie voll ist die Platte? Laufen alle daemonen? ...), schreibt ggf. Log-Einträge und generiert eventuell Fehlermeldungen (z. B. eine Mail an mich).
          Wenn man die dabei entstehende zusätzliche Systemlast (bei mir so 1-2%) verantworten kann, bekommt man ein schönes Frühwarnsystem für Probleme. (Und ein intelligentes Skript kann fehlende daemons selbst wieder hochfahren usw.).

          Mit einem solchen Mechanismus könnte Bogus ein Skript starten, das sich in einem entsprechenden Verzeichnis umsieht und prüft, ob da etwas herumsteht, was gemailt werden soll, und die entsprechende Datei nach erfolgreicher Verarbeitung wegfressen (löschen, umbenennen, ...).

          Der cron hat hierbei nur die Aufgabe, in einfach zu bedienender Weise ein busy wait zu umgehen und ausfallsicher zu sein (ein eigener Job mit sleep()-Warteschleife würde sich nicht selbst wieder starten, wenn er zerfallen sein sollte).

          1. Hallo!

            Ich mache damit auch Produktionsüberwachung: Alle <n> Minuten läuft ein triviales Shell-Skript via cron an, schaut sich auf der Kiste um (wie voll ist die Platte? Laufen alle daemonen? ...), schreibt ggf. Log-Einträge und generiert eventuell Fehlermeldungen (z. B. eine Mail an mich).

            Ich bin gerade am Austesten eines Systems namens Big Brother zu eben diesem Zweck (http://MacLawran.ca/bb-dnld/). Ist eine Ansammlung von Shellscripts und ein paar kleinen C-Programmen. Ist fuer meinen Geschmack etwas dirty geschrieben, aber an sich recht huebsches Ding.

            Der cron hat hierbei nur die Aufgabe, in einfach zu bedienender Weise ein busy wait zu umgehen und ausfallsicher zu sein (ein eigener Job mit sleep()-Warteschleife würde sich nicht selbst wieder starten, wenn er zerfallen sein sollte).

            Oben genannter BB arbeitet mit sleep(). Ich werde mir mal ueberlegen, ob ich das vielleicht auf cron umstelle.

            Calocybe