Software > Programmieren, Kompilieren
Perl: Mail::IMAPClient macht Probleme beim Zugriff auf IMAPd
juedan:
Moin Perl-Sonnen ;D
Ein gutes und sonnenreiches neues Jahr.
Auf meinem Netzwerkserver mit OpenSolaris 11 ist Courier-IMAP installiert. Konfiguriert ist der Daemon so, daß ein Zugriff über SSL stattfindet, was auch mit Thunderbird und Evolution sauber funktioniert. Zusätzlich sind auch zwei Postfächer für Spam und NoSpam angelegt, in welche die User ihre Spams bzw. fälsch erkannten Spams verschieben oder per Forwarding hinschicken. Wie geschrieben, das funktioniert alles bestens.
Um den Spam/NoSpam zu verarbeiten, habe ich ein Perl-Script gebastelt, das sich am Server anmeldet und die Postfächer Spam bzw. NoSpam ausliest und die Nachrichten an SpamAssassin zur weiteren Verarbeitung schickt. Genau hier ist das Problem:
* Wenn das Skript im Perl-Debugger läuft funktioniert es prächtig und macht was es soll. Die Anmeldung wird im Logfile protokolliert.
* Wenn es nicht im Perl-Debugger läuft, dann kann es sich nicht mit dem IMAP verbinden und es kommt nach einer ganzen Weile diese Ausgabe:
--- Code: ---ERROR: Socket closed while reading data from server.
Sending: 1 LOGIN "spam@heim.netz" spam123
Sent 45 bytes
ERROR: Socket closed while reading data from server.
Sending: 2 SELECT INBOX
Sent 16 bytes
ERROR: Socket closed while reading data from server.
Sending: 3 STATUS INBOX (MESSAGES)
Sent 27 bytes
ERROR: Socket closed while reading data from server.
Es liegen Spam-Nachrichten zur Verarbeitung vor
Sending: 4 EXPUNGE
Sent 11 bytes
ERROR: Socket closed while reading data from server.
Sending: 5 SELECT
Sent 11 bytes
ERROR: Socket closed while reading data from server.
Sending: 6 CLOSE
Sent 9 bytes
ERROR: Socket closed while reading data from server.
Sending: 7 LOGOUT
Sent 10 bytes
ERROR: Socket closed while reading data from server.
--- Ende Code ---
Der SSL-Socket wird erstellt. Bei "Mail::IMAPClient->new()" bleibt das Skript fast eine Minute stehen und dann kommen obige Meldungen auf einen Schlag.
Im Logfile stehen auch keine Anmeldeversuche drin.
Was ist an dem Skript falsch bzw. wo kann ich noch suchen?
[/li]
Auszug aus dem Skript:
--- Code: ---[ # Initialisiere Objekt SSL-Socket
# ----------------------------------------------------------
my $ssl = IO::Socket::SSL->new(
Proto => 'tcp',
PeerAddr => $host,
PeerPort => 993);
if (!defined($ssl)) {
die "SSL-Socket nicht erstellt\n";}
my $greeting = <$ssl>;
my ($id, $answer) = split /\s+/, $greeting;
if ($answer ne 'OK') {
die "Problem beim Verbinden mit dem SSL-Socket: ", $ssl=>errstr(); }
# Initialisiere Objekt IMAPClient zur Spam-Verarbeitung
# ----------------------------------------------------------
my $imap = Mail::IMAPClient->new(
User => $user,
Password => $user_pw,
Socket => $ssl,
Timeout => 1,
Debug => 1);
if (!defined($imap)) {
die $aktion, ": IMAP nicht erstellt\n";}
# Status explizit auf connected setzen
$imap->State($imap->Connected());
/code]
Vielen Dank für Eure Hilfe.
Juedan
--- Ende Code ---
juedan:
Hallo Forum,
hat keine eine Idee, woran es liegen könnte?
Grüße
JueDan
claus:
Hallo,
ehrlich gesagt glaube ich eher, dass das ein code bzw Perl Problem ist als alles andere, wegen:
--- Zitat ---# Wenn das Skript im Perl-Debugger läuft funktioniert es prächtig und macht was es soll. Die Anmeldung wird im Logfile protokolliert.
# Wenn es nicht im Perl-Debugger läuft, dann kann es sich nicht mit dem IMAP verbinden und es kommt nach einer ganzen Weile diese Ausgabe:
--- Ende Zitat ---
Machst Du etwas im debugger ausser n oder s?
Hast das Script im Header -w und verwendest Du use strict?
Claus
juedan:
Hallo claus,
danke für Deine Antwort.
--- Zitat ---Machst Du etwas im debugger ausser n oder s?
--- Ende Zitat ---
Nein. Ich wollte die Stelle herausfinden, an der das Skript Probleme verursacht.
--- Zitat ---Hast das Script im Header -w und verwendest Du use strict?
--- Ende Zitat ---
Aha. Guter Vorschlag. Werde ich ausprobieren. Ich hatte die Option -w gesetzt, aber keinerlei Warnungen erhalten. In Kombination mit use strict hatte ich es nicht probiert.
Viele Grüße
JueDan
juedan:
Hallo Forum,
nachdem ich die Ratschläge meines Vorposters umgesetzt hatte und es immer noch nicht funktionierte, habe ich auch die Zeritfikate erneuert. Auch dies brachte keinen Erfolg.
Nachdem ich beim Aufruf des Construktors die folgende Änderung vorgenommen hatte, funktioniert es problemlos. Ich muß nur noch herausfinden warum dem so ist.
Vor der Änderung:
--- Code: ---# Initialisiere Objekt IMAPClient zur Spam-Verarbeitung
# ----------------------------------------------------------
my $imap = Mail::IMAPClient->new(
User => $user,
Password => $user_pw,
Socket => $ssl, # <----
Timeout => 10,
Debug => $debugflag);
--- Ende Code ---
Nach der Änderung:
--- Code: ---# Initialisiere Objekt IMAPClient zur Spam-Verarbeitung
# ----------------------------------------------------------
my $imap = Mail::IMAPClient->new(
User => $user,
Password => $user_pw,
RawSocket => $ssl, # <----
Timeout => 10,
Debug => $debugflag);
--- Ende Code ---
In sämtlichen Tutorials zum Thema stand es so beschrieben, wie ich es bei "vor der Änderung" dokumentiert habe. Ich vermute einen Bug in IO::Socket::SSL und/oder Mail::IMAPClient.
Viele Grüße
JueDan
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln