Net::IMAP::Simple will nicht so recht...
Net::IMAP::Simple will nicht so recht...
am 05.06.2007 22:31:34 von Daniel Bleisteiner
Ich habe seit längerem mal wieder ein paar Gehversuche mit Perl, weil
ich über einen cronjob meine eMails auf dem Server vorsortieren
möchte. Dafür nutze ich Net::IMAP::Simple... aber es schafft es nicht,
die eMails wirklich zu kopieren und zu löschen... übersehe ich etwas?
#!/usr/bin/perl -w
use strict;
use Net::IMAP::Simple;
use constant HOST =3D> 'imap.server.de';
use constant USER =3D> 'username';
use constant PASS =3D> 'password';
my %filterFROM =3D (
'noreply@betanews.com' =3D> 'INBOX.BetaNews',
'mailrobot@xing.com' =3D> 'INBOX.Xing',
'service@youtube.com' =3D> 'INBOX.YouTube',
'itunes_de@new-music.itunes.com' =3D> 'INBOX.iTunes'
);
print("Connecting to ".HOST."...\n");
my $imap =3D Net::IMAP::Simple->new(HOST);
unless($imap) {
my $msg =3D $Net::IMAP::Simple::errstr;
die "Connect to @{[HOST]} failed: $msg";
}
print(" Logging in as ".USER."...\n");
unless($imap->login(USER, PASS)) {
die "Login to @{[HOST]} as @{[USER]} failed: " . $imap->errstr;
}
print(" Checking for messages... ");
my $count =3D $imap->select('INBOX');
print($count." found!\n");
foreach my $idx (1 .. $count) {
print(" Handling message #".$idx."...\n");
my $headers =3D $imap->top($idx);
foreach my $header (@{$headers}) {
$header =3D~ s/[\r\n]//g;
if ($header =3D~ /^subject: .+$/i) {
print(" Subject: '".substr($header,9)."'...\n");
last;
}
}
foreach my $header (@{$headers}) {
if ($header =3D~ /^from: .+$/i) {
foreach my $key (keys %filterFROM) {
if ($header =3D~ /$key/i) {
print(" Matched FROM '".$key."'... moving
to '".$filterFROM{$key}."'... ");
$imap->create_mailbox($filterFROM{$key});
$imap->folder_subscribe($filterFROM{$key});
if ($imap->copy($idx,$filterFROM{$key}) && $imap-
>delete($idx)) {
print("SUCCESS!\n");
$count =3D $imap->select('INBOX'); # ohne gibts
fehler...?
}
else {
print("FAILED!\n");
}
last;
}
}
}
}
}
print("Disconnecting!\n");
$imap->quit;
Als Ausgabe liefert mir das Script das folgende... beispielhaft...
Connecting to imap.server.de...
Logging in as username...
Checking for messages... 7 found!
Handling message #1...
Subject: 'Tunes der Woche von den Toten Hosen, Paul McCartney
und mehr'...
Matched FROM 'itunes_de@new-music.itunes.com'... moving to
'INBOX.iTunes'... SUCCESS!
Handling message #2...
Subject: 'Of extensive an byers'...
Handling message #3...
Subject: 're:Don't have time to visit local drug store'...
Handling message #4...
Subject: 'How r things going'...
Handling message #5...
Subject: 'Ihre Gesundheit '...
Handling message #6...
Subject: 'ILLEGAL UNDERAGE ADULT SITES'...
Handling message #7...
Subject: 'RE:'...
Disconnecting!
Ich bin für jeden Tipp dankbar... seh im Moment leider nicht, wo ich
den Fehler mache...
--
Daniel
Re: Net::IMAP::Simple will nicht so recht...
am 06.06.2007 13:53:30 von sheinrich
Hallo Daniel,
ohne das Mod naeher zu kennen, wuerde ich fast drauf wetten, dass das
Message-Array zero-based ist.
Aendere einfach mal die Zeile
my $headers = $imap->top($idx);
in
my $headers = $imap->top($idx-1);
Gruesse von Steffen
Re: Net::IMAP::Simple will nicht so recht...
am 06.06.2007 14:43:01 von Daniel Bleisteiner
On 6 Jun., 13:53, sheinr...@my-deja.com wrote:
> ohne das Mod naeher zu kennen, wuerde ich fast drauf wetten, dass das
> Message-Array zero-based ist.
Die erste Message hat die 1... zur 0 gibts nen Fehler zurück.
Zumindest hätte dann trotzdem das copy/delete gehen sollen... und
genau da hakt es ja leider...
Weitere Ideen?
--
Daniel
Re: Net::IMAP::Simple will nicht so recht...
am 06.06.2007 15:07:08 von sheinrich
On 6 Jun., 14:43, Daniel Bleisteiner
wrote:
> On 6 Jun., 13:53, sheinr...@my-deja.com wrote:
>
> > ohne das Mod naeher zu kennen, wuerde ich fast drauf wetten, dass das
> > Message-Array zero-based ist.
>
> Die erste Message hat die 1... zur 0 gibts nen Fehler zurück.
> Zumindest hätte dann trotzdem das copy/delete gehen sollen... und
> genau da hakt es ja leider...
>
> Weitere Ideen?
>
Aber die eine Mail, von itunes, wurde doch anscheinend erfolgreich
verschoben und dann aus der INBOX geloescht.
Wenn der from-Header mit keinem deiner Schluessel matcht, dann wir
doch auch kein code ausgefuehrt.
Wenn du alle nicht erkannten mails loeschen wolltest, dann koenntest
du das ->delete einfach ans Ende des Loops "foreach my $idx (1 ..
$count) {" stellen.
Steffen
Re: Net::IMAP::Simple will nicht so recht...
am 06.06.2007 15:52:02 von Daniel Bleisteiner
On 6 Jun., 15:07, sheinr...@my-deja.com wrote:
> Aber die eine Mail, von itunes, wurde doch anscheinend erfolgreich
> verschoben und dann aus der INBOX geloescht.
> Wenn der from-Header mit keinem deiner Schluessel matcht, dann wir
> doch auch kein code ausgefuehrt.
Vermutlich war ich nicht deutlich genug. Der Code scheint zu tun, was
ich ihm angedacht habe... aber das COPY und DELETE wird garnicht
durchgeführt! Obwohl beim copy als auch beim delete TRUE geliefert
wird, hat die Aktion nicht wirklich stattgefunden. Die Mails liegen
nachwievor in der INBOX.
Ich frage mich daher, ob man das copy und delete noch irgendwie
flushen muss oder dergleichen... konnte aber in der Doku keine
Anhaltspunkte dazu finden. Und so stehe ich vor dem scheinbar
laufenden Code, der aber nichts reales bewirkt.
--
Daniel
Re: Net::IMAP::Simple will nicht so recht...
am 06.06.2007 18:09:12 von sheinrich
On 6 Jun., 15:52, Daniel Bleisteiner
wrote:
> On 6 Jun., 15:07, sheinr...@my-deja.com wrote:
>
> > Aber die eine Mail, von itunes, wurde doch anscheinend erfolgreich
> > verschoben und dann aus der INBOX geloescht.
> > Wenn der from-Header mit keinem deiner Schluessel matcht, dann wir
> > doch auch kein code ausgefuehrt.
>
> Vermutlich war ich nicht deutlich genug. Der Code scheint zu tun, was
> ich ihm angedacht habe... aber das COPY und DELETE wird garnicht
> durchgeführt! Obwohl beim copy als auch beim delete TRUE geliefert
> wird, hat die Aktion nicht wirklich stattgefunden. Die Mails liegen
> nachwievor in der INBOX.
>
> Ich frage mich daher, ob man das copy und delete noch irgendwie
> flushen muss oder dergleichen... konnte aber in der Doku keine
> Anhaltspunkte dazu finden. Und so stehe ich vor dem scheinbar
> laufenden Code, der aber nichts reales bewirkt.
>
> --
> Daniel
Also, wenn ich dich jetzt richtig verstehe, dann haben copy und delete
nicht das Gewuenschte getan (Mail 1 nach 'INBOX.iTunes' kopiert und
aus der INBOX geloescht), _obwohl_ offenbar (wegen print von
'SUCCESS!') beide Methoden ein true zurueckgeliefert haben muessen.
Wozu dient in deinem Code das $imap->folder_subscribe()?
Hat vielleicht das create_mailbox() nicht funktioniert?
Ich wuerde mal den Rueckgabewert und errstr() checken.
Und danach ein
print "Current Mail Box folder: " . $imap->current_box . "\n";
einbauen. Denn der Kommentar deiner Zeile
$count =3D $imap->select('INBOX'); # ohne gibts fehler...?
deutet darauf hin, dass 'INBOX' nicht mehr der aktuelle Folder ist.
Steffen
Re: Net::IMAP::Simple will nicht so recht...
am 07.06.2007 07:53:48 von Daniel Bleisteiner
On 6 Jun., 18:09, sheinr...@my-deja.com wrote:
> deutet darauf hin, dass 'INBOX' nicht mehr der aktuelle Folder ist.
Ahhh... das ist's gewesen. Durch das erzeugen der Folder in der
Schleife wurde die aktuell selektierte Mailbox geändert. Jetzt erzeuge
und subscribe ich die Folder separat vorher und das copy/delete
funktioniert!
print(" Subscribing folders... ");
foreach my $key (keys %filterFROM) {
$imap->create_mailbox($filterFROM{$key});
$imap->folder_subscribe($filterFROM{$key});
}
print("DONE!\n");
print(" Checking INBOX... ");
my $count =3D $imap->select('INBOX');
print($count." messages found!\n");
foreach my $idx (1 .. $count) {
print(" Handling message #".$idx."...");
my $headers =3D $imap->top($idx);
foreach my $header (@{$headers}) {
$header =3D~ s/[\r\n]//g;
if ($header =3D~ /^subject: .+$/i) {
print(" SUBJECT: '".substr($header,9)."'");
last;
}
}
print("\n");
foreach my $header (@{$headers}) {
if ($header =3D~ /^from: .+$/i) {
foreach my $key (keys %filterFROM) {
if ($header =3D~ /$key/i) {
print(" Matched FROM '".$key."'... moving
to '".$filterFROM{$key}."'... ");
if ($imap->copy($idx,$filterFROM{$key}) && $imap-
>delete($idx)) {
print("SUCCESS!\n");
}
else {
print("FAILED!\n");
}
last;
}
}
}
}
}
print("Disconnecting!\n");
$imap->quit;
Danke für diesen Denkanstoß! Jetzt kann ich meine eMails sauber
vorfiltern und habe gleich etwas mehr Ordnung in meinem Account.
--
Daniel