Testen ob Sendmail verfügbar
Beat
- perl
0 Struppi
Hallo
Ich schreibe gerade an einer Formmailer Konfiguration.
Der Formmailer kann auch ohne Sendmail sinnvoll benutzt werden.
Nun möchte ich eine Test Sendmail Routine schreiben, habe aber selbst kein Sendmail auf dem lokalen PC.
Wie kann ich sinnvoll Testen, ob Sendmail (auf irgend einem Server) vorhanden ist, ohne dass ich eine Mail versenden muss?
Mein bisheriger Versuch
open(SM, "|/usr/sbin/sendmail -oi -t") or die("No Sendmail $!");
gibt nicht die Warnung aus sondern:
"Das System kann den angegebenen Pfad nicht finden."
Ich weiss nicht wie ich diesen Fehler trappen kann.
versuche mit eval{} und Abrage auf $@ führen zu nichts. $@ ist schlicht nicht besetzt.
Wie kann ich sinnvoll testen ob unter dem Pfad sendmail erreichbar ist?
Hintergrund: Das CMS muss auf mir unbekannten Servern laufen können.
mfg Beat
Mein bisheriger Versuch
open(SM, "|/usr/sbin/sendmail -oi -t") or die("No Sendmail $!");
Wie wär's mit -e?
Struppi.
Mein bisheriger Versuch
open(SM, "|/usr/sbin/sendmail -oi -t") or die("No Sendmail $!");
Wie wär's mit -e?
Ist ja schon peinlich einfach.
Wer kommt auch auf die Idee, dass ein Programm auch nur ein File ist.
Danke.
mfg Beat
Moin Moin!
»» > open(SM, "|/usr/sbin/sendmail -oi -t") or die("No Sendmail $!");
»»
»» Wie wär's mit -e?Ist ja schon peinlich einfach.
Wer kommt auch auf die Idee, dass ein Programm auch nur ein File ist.
Eben deshalb willst Du auch nicht auf Existenz (-e) prüfen, sondern auf ein plain file (-f). Und außerdem möchtest Du auch noch prüfen, ob das File ausführbar ist (-x).
die "no sendmail? Died" unless -f "/usr/sbin/sendmail" && -x _;
# Schon tot auf einigen älteren Systemen mit sendmail in /usr/lib oder noch perverseren Verstecken.
# Einige CPU-Zyklen später, gerade als root sendmail gegen exim ersetzt hat:
open SM,"|/usr/sbin/sendmail -oi -t" or die "Can't open pipe to /usr/sbin/sendmail: $!";
# ... und tot! ;-)
Sendmail ist eine Plage. Wenn Du Mails loswerden willst, sprich SMTP mit einem willigen Mailserver (z.B. localhost:25 oder localhost:547, oder Smart Host des Providers). MIME::Lite ist dafür hervorragend geeignet. Alte Versionen vor 3.022 haben den selten dämlichen Bug, dass es zur Laufzeit prüft, ob sendmail vorhanden und ausführbar ist, obwohl es gar kein sendmail braucht.
Alexander
»» > open(SM, "|/usr/sbin/sendmail -oi -t") or die("No Sendmail $!");
»»
»» Wie wär's mit -e?Ist ja schon peinlich einfach.
Wer kommt auch auf die Idee, dass ein Programm auch nur ein File ist.Eben deshalb willst Du auch nicht auf Existenz (-e) prüfen, sondern auf ein plain file (-f). Und außerdem möchtest Du auch noch prüfen, ob das File ausführbar ist (-x).
die "no sendmail? Died" unless -f "/usr/sbin/sendmail" && -x _;
Schon tot auf einigen älteren Systemen mit sendmail in /usr/lib oder noch perverseren Verstecken.
Einige CPU-Zyklen später, gerade als root sendmail gegen exim ersetzt hat:
open SM,"|/usr/sbin/sendmail -oi -t" or die "Can't open pipe to /usr/sbin/sendmail: $!";
... und tot! ;-)
hmm ja Danke für den Hinweis. Der Test erfolgt eigentlich während der Konfiguration. Nicht bei der Anwendung des Mailversands.
Vielleicht ist da noch eine Timing Falle in deinem Fall.
Ich bin da jetzt aber in der Zwickmühle ob ich Mime:Lite wirklich vorsehen kann...
Der Pfad kann konfiguriert werden. Das dürfte also kein Problem sein.
Oftmals ist auf einem Server ja auch nur ein Wrapper und ein ganz anderer SMTP Server wird dann aufgerufen. Sendmail ist da so eine Art Conspiracy.
Ich werd mir das mal noch überlegen. werde ich für Sendmail/Mime::Lite/Net:SMTP Behandlung ein Modul vorsehen, das ich lokal installieren kann.
So im Stil: Same Name different Game.
mfg Beat
--
<°)))o>< ><o(((°>o
Moin Moin!
hmm ja Danke für den Hinweis. Der Test erfolgt eigentlich während der Konfiguration. Nicht bei der Anwendung des Mailversands.
Dann bleibt zu hoffen, das zwischendurch niemand sendmail gegen was besseres tauscht. ;-)
Der Pfad kann konfiguriert werden. Das dürfte also kein Problem sein.
Ich hab in den letzten paar Jahren eigentlich immer ganz stumpf fünf Konfigurationswerte abgefragt: HELO-Hostnamen (Default: Hostname), SMTP-Host (kein Default), SMTP-Port (Default: 25), SMTP-Username und SMTP-Passwort (Default: jeweils leer, d.h. kein Login nötig).
Das hat bislang für die perversesten Mail-Konstruktionen gereicht. Auch für Novell und Notes gab (gibt?) es Gateway-Server, die den Versand per SMTP erlauben.
Wenn der Server-Admin meint, er müsse sendmail auf dem Server laufen lassen, hat man damit kein Problem: sendmail nimmt Mails auf localhost:25 an. Ist der Admin exim-Fan, auch kein Problem: exim nimmt Mails auf localhost:25 an. Steht der Admin auf Exchange, schickst Du die Mails an localhost:25. Packt den Admin die Paranoia, nimmt er qmail, und Du liefest die Mails bei localhost:25 ab. Schreibt der Admin seinem MTA lieber selbst, lieferst Du die Mails bei localhost:25 ab. Und wenn der Admin meint, dass auf einem Webserver kein Mailserver was zu suchen hat, lieferst Du die Mails eben an $mailserver:25, egal was dort für eine Software läuft.
Egal wie, in jedem Fall mußt Du die Mail komplett selbst konstruieren. Nur zum Ausliefern hast Du die Wahl, entweder startest Du einen unzuverlässigen (1) Subprozess, der die Mail per SMTP verschickt, oder Du öffnest einen Socket und sprichst dort selbst SMTP. MIME::Lite nimmt Dir das komplett ab.
(1) Unzuverlässig im Sinne von: Mal hier, mal da, mal echtes sendmail, mal eine mehr oder weniger gute Immitation.
Bei der Pipe-Konstruktion über open(PIPE,"|program param param param") kommt noch dazu, dass auch noch die Default-Shell ihre Finger im Spiel hat, und Du mit variablen Parametern höllisch aufpassen mußt, damit Du keine Sicherheitslücke baust. perlipc/Safe Pipe Opens ist der sicherere Weg, ein externes Programm wie Sendmail mit variablen Parametern aufzurufen.
Alexander