Merkwürdige Absender-Adresse bei Mailinglistenteilnehmern
Beate Mielke
- cgi
Liebe Perl-CGI-ExpertInnen,
Dies ist ein kleiner Ausschnitt eines sehr schlichten Mailinglistenprogramms.
--------------------------------------------------------------------------------------------------------------------
open(LIST,"$list_file");
@addresses=<LIST>;
close(LIST);
foreach $member(@addresses)
{
open (MAIL, "$mailprog $member") die "...";
print MAIL "From:$recipient \n"; #Email-Adresse des Listen-Moderators
print MAIL "Subject:$FORM{'subject'}\n"; #subject der Mail
print MAIL "To:$member\n"; #Email-Adressen aus der Adress-Datei
print MAIL "$FORM{'massmail'}\n"; #Inhalt der Mail
close (MAIL);
$x++;
}
--------------------------------------------------------------------------------------------------------------------
Soweit funktioniert das alles wunderbar!
Das Problem:
Hinter $recipient verbirgt sich die Email-Adresse des Listenmoderators, im Fall dieser Liste der einzig Berechtigte, Informationen an die Teilnehmer zu senden. Verschickt er nun eine Botschaft (in einem HTML-Formular generiert), so erscheint bei den Teilnehmern im Absender-Feld nicht nur seine Email-Adresse, sonder mit einem "@" abgetrennt eine weitere Email-Adresse, nämlich eine die dem Provider gehört, über den er sich gerade eingewählt hat.
z.B.: moderator@domain.de@provider@server.de
Inzwischen weiß ich, daß das so voreingestellt und nicht zu ändern ist. Man soll sich angeblich nur helfen können, indem man die Mail direkt an sendmail schickt, also in etwa so:
--------------------------------------------------------------------------------------------------------------------
$MAIL <<EOM
From: <a1@a1.a1>
To: $listenname <b1@b1.b1>
BCC: cat mailist.datased -e's#\(.\*\)#\1,#'
Subject: $FORM{'subject'}
Reply-To: <a1@a1.a1>
Errors-To: <b1@b1.b1>
$FORM{'massmail'}
Kommentar
EOM
open (MAIL,"/usr/bin/sendmail -t") die "Kann $mailprog nicht öffnen!\n";
print MAIL "$MAIL";
close(MAIL);
}
--------------------------------------------------------------------------------------------------------------------
Aber leider funktioniert hier irgend etwas nicht. Ich bin in Perl noch nicht sehr bewandert und Fehlermeldungen kann ich nur sehen, wenn ich die CGI-Prüfseite von Schlund & Partner benutze. Aber dort wird mir nur mitgeteilt, daß das Programm keine Syntaxfehler enthält.
Kann mir jemand sagen, was dort nicht funktioniert?
Ich vermute den Fehler in der Zeile, die mit BCC anfängt, ich weiß selber nicht was dieser Kuddelmuddel am Ende der Zeile macht, nur daß in mailist.data die Empfänger-Emailadressen stehen.
--------------------------------------------------------------------------------------------------------------------
Viele Grüße
Beate Mielke
BCC:
cat mailist.datased -e's#\(.\*\)#\1,#'
Ich vermute den Fehler in der Zeile, die mit BCC anfängt, ich weiß selber nicht was dieser Kuddelmuddel am Ende der Zeile macht, nur daß in mailist.data die Empfänger-Emailadressen stehen.
Das UNIX-Systemkommando "sed" ist ein "Editor" (haha ...), aber einer von der allerkryptischsten Sorte. Diese Zeile startet den sed und läßt ihn mit "-e' das nachfolgend beschriebene "Skript" ausführen. Dieses sieht für mich (der ich *kein* sed-Benutzer bin) aus wie ein regular expression - also wie ein Filter für die zu lesende Datei, in der etwas ersetzt wird.
Das '#'-Zeichen ist offenbar das, was in Perl mit '/' bezeichnet wird, also der delimiter für die beiden pattern, rate ich mal. Ersetzt würde dann der Ausdruck (in Perl-Notation) /(.*)/ (also irgendwas in runden Klammern) durch /\1,/ (also der gefundene Inhalt gefolgt von einem Komma).
Jetzt müßtest Du Dir die maillist.data ansehen und überlegen, was das bewirken soll. Wenn Du telnet-Zugang hast, kannst Du das sed-Kommando auch direkt eingeben und Dir die Ausgabe ansehen.
Natürlich kannst Du das auch selbst in Perl realisieren, aber das Einfügen der Ausgabe dieses Filters (kommando
) in die Ausgabe des Perl-Skripts selbst macht die Sache ja so kurz und knackig ...
BCC:
cat mailist.datased -e's#\(.\*\)#\1,#'
Danke für die Ausführungen, Michael, aber das löst mein Problem noch nicht, denn es ist nur eine Vermutung von mir, daß hier der Fehler liegen könnte.
Ich weiß nur, daß der Fehler mit Sicherheit in diesen Zeilen steckt, deshalb habe ich gehofft, daß jemand vielleicht einen Fehler in den Zeilen feststellen kann.
In der Datei mailist.data befindet sich pro Zeile eine Email-Adresse.
Warum tausch man also dort zum Versenden an diese Adressen
(.*) gegen 1 aus ? Was soll das überhaupt?
Oder liegt der Fehler vielleicht gar nicht in der Zeile?
Viele Grüße
Beate Mielke
In der Datei mailist.data befindet sich pro Zeile eine Email-Adresse.
Warum tausch man also dort zum Versenden an diese Adressen
(.*) gegen 1 aus ? Was soll das überhaupt?
"\1" ist "der erste gefundene Paramete (auch "$1" in Perl), würde ich sagen. Es geht also offenbar darum, die Klammern zu entfernen ... ?
"BCC" ist das Feld der "blind carbon copies". Um eine Massenmail so zu versenden, daß ihr Empfänger *nicht* sieht, wer noch alles diese Mail bekommen hat, werden die Kopien im BCC-Modus verschickt. Die Adresse im To:-Feld ist nur aus syntaktischen Gründen nötig - eine solche Mail schickt man "pro forma" an sich selbst, um die vielen BCCs nebenbei zu erzeugen. Und die Syntax des sendmail-Kommandos erwartet an dieser Stelle offenbar eine Liste von Mail-Adressen - also liest "sed" die Datei und wandelt sie in den Parameterwert, also eine solche Liste, um.
Oder liegt der Fehler vielleicht gar nicht in der Zeile?
Sorry, *das* kann ich so nicht beantworten ...
Hallo!
BCC:
cat mailist.datased -e's#\(.\*\)#\1,#'
"\1" ist "der erste gefundene Paramete (auch "$1" in Perl), würde ich sagen. Es geht also offenbar darum, die Klammern zu entfernen ... ?
Nein, glaub ich nicht. Ich hab von sed auch keine Ahnung (weiss gerade, dass es das ueberhaupt gibt), aber ich vermute mal folgendes: In sed erhaelt eine Klammer die Bedeutung, die sie in Perl hat, wahrscheinlich erst durch das Vorsetzen eines Backslash. # entspricht dem / in Perl, und s steht wie in Perl fuer substitute (sagtest Du ja schon, Michael). Haben wir also den entsprechenden Perl-Ausdruck:
s/(.*)/$1,/
Mit anderen Worten, es wird an jede Adresse ein Komma angehaengt, damit sie eine kommagetrennte Liste ergeben.
Ueberleg mal, wenn die Klammern wie in Perl durch den \ als echte Klammern im Text interpretiert werden wuerden, dann koennte ja gar kein \1 gesetzt werden.
Jetzt steht allerdings in dem Script die Zeile BCC: cat mailist.datased -e's#\(.\*\)#\1,#'
. Erstmal weiss ich gar nicht, ob die Kommandosubstitution ueberhaupt ausgefuehrt wird, wenn da $MAIL <<EOM steht. Ich haette $MAIL << "EOM" geschrieben. Bei $MAIL << 'EOM' wird sie jedenfalls nicht ausgefuehrt. Nun, wenn sie denn ausgefuehrt wird, dann steht da eine Liste von EMail-Adressen, die durch Komma UND ein \n abgetrennt sind. Ich weiss nicht, ob das mit den Zeilenumbruechen so passt.
Ansonsten weiss ich auch nicht, was Reply-To: <a1@a1.a1> bedeutet, denn da kommt doch sowas wie Reply-To: calocybe@calocybe.calocybe heraus, oder? Oder war das jetzt nur ein Beispiel von Beate, um keine echten Adressen zu schreiben?
Naja, das bringt Euch wohl alles nicht sehr viel weiter. Was die seltsame Absenderadresse angeht, so koennte das Problem irgendwo beim Mailserver liegen. Oder hangt sendmail selbstaendig die Domain an? Dann mal probieren, keine vollstaendige Adresse bei From anzugeben, sondern nur den Usernamen innerhalb der Domain?
Calocybe
P.S. Muss man bei Reply-To: <a1@a1.a1> vielleicht die < > weglassen?