Email Duplikate in IMAP (Cyrus)

Dieses Thema im Forum "Programmieren allgemein" wurde erstellt von Psimon, 26.11.2007.

  1. #1 Psimon, 26.11.2007
    Zuletzt bearbeitet: 26.11.2007
    Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Hallo zusammen,

    folgendes Szenario: ich habe einen Cyrus IMAP Server auf dem es genau eine Mailbox gibt (nämlich meine). In dieser Mailbox gibt es eine Ordnerstruktur mit eingen tausend Emails, leider auch ettliche Duplikate, die es zu löschen gilt.

    Kurzer Hand hab ich gegoogelt und ein nettes Perl Script im tar.gz der IMAP Tools (Quelle: http://www.athensfbc.com/imap_tools/) gefunden, welches diese Aufgabe, das Finden und löschen der Duplikate, meistern soll. Leider findet dieses Script kein einziges meiner Duplikate, obwohl ich doch genau weiß, dass dort duzende vorhanden sind. In anderen Worten, das Script tut nicht wie es soll.

    Meine Google Recherge nach etwas anderem, etwas vergleichbaren, führte zu nichts. Wieso sollte man das Rad auch neu erfinden? Also zurück zum Script von IMAP Tools.

    Es listet zwar die Ordner auf, überprüft jedoch keine Emails. Es dauert viel zu kurz, dafür das massenhaft Nachrichten da sind und es erscheint letztendlich auch die Meldung "Total messages purged 0", wie ihr wie folgt sehen könnt:

    Nachfolgend die Antwort von 'bytepool', die ich erst gerade im Google Cache gesehen habe (warum dieser Thread gelöscht wurde verstehe ich überhaupt nicht):

    Hierzu ist nun zu sagen, dass die Option -p keinen Unterschied gemacht hat. Die Debugausgabe habe ich in Zeile 49 eingesetzt und bekam folgendes Ergebnis:

    Code:
    Inhalt von : 0
    
    Heißt also das mbxs tatsächlich leer ist - Schaaaaajseeeee!! Bedeutet wiederrum das die Zeile

    Code:
    @mbxs = &getMailboxList($sourceUser, 'SRC');
    
    mir kein Array zurückliefert. Was kann ich tun?

    Schöne Grüße,
    Simon
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Aha

    Hallo zusammen,

    ich konnte den Fehler mit Logging-Ausgaben eingrenzen. Der Fehler liegt in der folgenden Zeile:

    Code:
    ($dmy,$mbx) = split(/"\/"/,$response[$i]);
    Hier wird nichts gesplittet und $dmy beinhaltet den kompletten $response[$i] String, wie ihr wie folgt sehen könnt:

    Code:
    * LIST (\HasChildren) "." "INBOX" is splitted into mbx:  and dmy: * LIST (\HasChildren) "." "INBOX"
    * LIST (\HasChildren) "." "INBOX.Archiv_Ausgang" is splitted into mbx:  and dmy: * LIST (\HasChildren) "." "INBOX.Archiv_Ausgang"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2000" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2000"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2001" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2001"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2002" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2002"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2003" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2003"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2004" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2004"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2005" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2005"
    * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2006" is splitted into mbx:  and dmy: * LIST (\HasNoChildren) "." "INBOX.Archiv_Ausgang.2006"
    [...]
    
    Kann mir jemand bitte diese Zeile korrigieren?

    Liebe Grüße,
    Simon
     
  4. #3 bytepool, 28.11.2007
    Zuletzt bearbeitet: 28.11.2007
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    hi,

    waere das nicht die perfekte Gelegenheit ein wenig perl zu lernen? ;)
    Fuer so Skripting Sachen finde ich Perl toll, solange ich damit kein OO Projekt machen muss... ;)

    Also, wenn man sich das so anguckt, ist das ja auch logisch dass er da nichts splittet.
    Code:
    split(/"\/"/,$response[$i])
    sollte eigentlich bewirken, dass "/" als Delimiter genutzt wird, aber das kommt in dem String ja gar nicht vor. Versuch dochmal den / durch einen Punkt (.) zu ersetzen. Also so:
    Code:
    ($dmy,$mbx) = split(/"\."/,$response[$i]);
    Wenn ich den Sinn dahinter richtig verstehe, sollte das schon dein Problem loesen. Im uebrigen bin ich mir nicht sicher ob der Punkt (.) escaped werden muss, aber es kann eigentlich auch nicht schaden ;)

    mfg,
    bytepool
     
  5. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    hallo bytepool,

    schon bevor du geschrieben hast hab ich mir perl zu gemüte gezogen und ein wenig hausaufgaben in regex gemacht. da ich java programmierer bin ist mir das alles ja glücklicherweise nicht so fremd. ;)

    der author der delIMAPdups.pl hat jedenfalls schon sehr gute vorarbeit geleistet und ich bin sicher, dass das script bei ihm auf dem rechner tüchtig funktioniert hat. jedoch sind auf meinem imap (Cyrus IMAP4 v2.2.12) zwei bugs aufgetaucht, wenn man es aktuell von der homepage (siehe erstes posting) bezieht.

    #1: das script kann nicht mit leeren ordern umgehen und bleibt im scanning stehen. wenn man einen ordner mit emails mit dem argument -m mit gibt, funktioniert es tadellos.

    #2: die uid, die eine jede email eindeutig identifiziert, wurde nicht richtig aus dem header ausgelesen und somit wurden auch keine duplikate erkannt. die regexpression hat an dieser stelle überhaupt nicht gestimmt. ich gehe davon aus das der author einen anderen imap server besitzt und die rc konventionen schlicht und ergreifend nicht identisch sind.

    jedenfalls tut es jetzt:)

    ...und selbstverständlich möchte ich das dir und den anderen nicht vorenthalten! eine weitere nachricht folgt daher in kürze.

    besten dank an deinen support bytepool!

    grüße,
    simon
     
  6. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Es gibt leider doch noch ein Problem bei meinen letzten Tests. Und zwar wird an dieser Stelle ein IMAP Command geschickt, dass eigentlich bewirken müßte das die 13 Messages, mit Komma aneinander gereihten UID's als gelöscht markiert werden.

    Leider wird lediglich eine (die UID 35) zum Löschen markiert. Was geht da vor sich? Das IMAP Command ist definitiv in Ordnung!

    Grüße,
    Simon
     
  7. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Der Fehler ist gefunden! Bei dem IMAP Kommando
    Code:
    1 STORE 515, 518, 520 +FLAGS (\Deleted)
    muss beachtet werden, dass IMAP die Nummer der Email möchte, jedoch nicht die UID, wie anfangs gedacht. Sehr seltsam, aber wahr!

    Nachfolgend ein Snippchen aus meiner Telnet Session mit dem Cyrus IMAP:

    Code:
    [...]
    * 555 FETCH (UID 745)
    * 556 FETCH (UID 980)
    * 557 FETCH (UID 981)
    * 558 FETCH (UID 982)
    * 559 FETCH (UID 983)
    * 560 FETCH (UID 984)
    * 561 FETCH (UID 987)
    1 OK Completed (0.000 sec)
    1 STORE 561 +FLAGS (\Deleted)
    * 561 FETCH (FLAGS (\Deleted \Seen))
    1 OK Completed
    1 EXPUNGE
    * 561 EXPUNGE
    * 560 EXISTS
    * 0 RECENT
    1 OK Completed
    1 FETCH 1:1000 (uid)
    [...]
    * 555 FETCH (UID 745)
    * 556 FETCH (UID 980)
    * 557 FETCH (UID 981)
    * 558 FETCH (UID 982)
    * 559 FETCH (UID 983)
    * 560 FETCH (UID 984)
    1 OK Completed (0.010 sec)
    
     
  8. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Das wars! => Total messages purged 4031 :)

    Das Perl Script muss wie folgt aufgerufen werden:
    perl delIMAPdups2.pl -S meinhostname/meinusername/meinpasswort

    -m INBOX.Archiv_Eingang.2001 (Optional ein bestimmtes Verzeichnis angeben)
    -p (Optional löscht dieser Parameter die Emails endgültig, falls -p nicht angegeben wird, werden die Emails mit dem \Deleted Flag versehen)
    -d (Ebenfalls Optional, Debug Ausgaben fürs Matching und IMAP Server kommunikation)

    Und hier das überarbeitete Perl Script:
     

    Anhänge:

  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    Hallo zusammen,

    ich hab noch einen Bug gefixt, sowie die Logging-Ausgaben optimiert. Werde das aktuelle Script nachher nochmal hinterlegen.

    Liebe Grüße,
    Simon
     
  11. Psimon

    Psimon pSY

    Dabei seit:
    16.10.2005
    Beiträge:
    71
    Zustimmungen:
    0
    Ort:
    München
    hier ist es
     

    Anhänge:

Thema:

Email Duplikate in IMAP (Cyrus)

Die Seite wird geladen...

Email Duplikate in IMAP (Cyrus) - Ähnliche Themen

  1. Pipe stream auf email

    Pipe stream auf email: Hi Leute, Ich experimentiere mit RTLSDR und multimon-ng :) Das Ziel meiner Sache ist es eine POCSAG Meldungm zu empfangen und dann per Mail an...
  2. Exim4 - Faxmaster und andere Emailadressen im lokalen System eines Domänen-PCs

    Exim4 - Faxmaster und andere Emailadressen im lokalen System eines Domänen-PCs: Moin Gemeinde, ich habe viele Debian Systeme in mehreren Domains. Auf allen läuft Exim4 mit eigentlich immer derselben Konfig. Dem System wird...
  3. Evolution mit Email-Erstellungsproblem

    Evolution mit Email-Erstellungsproblem: Etwa jeder dritte Versuch eine Email zu erstellen, führt zur Notwendigkeit Evolution zu "beenden" und neu zu starten. Daten: Evolution 3.10.4...
  4. systemmeldungen als emails + postfixkonfiguration - alles nur lokal

    systemmeldungen als emails + postfixkonfiguration - alles nur lokal: Hallo da ich jetzt dabei bin, Statusmeldungen von systemprogrammen (anacron, logwatch, rkhunter lokal als email zu verschicken ud zu speichern...
  5. Outlook-Emails in einem Linux-Emailclient öffnen

    Outlook-Emails in einem Linux-Emailclient öffnen: Hallo! Habe hier fünf msg-Dateien bekommen. Das sind Mails aus Outlook, teilweise mit großen, inkludierten Anhängen. Die kleinen davon kann...