2008-10-02 10 views
0

Ich arbeite an einem Skript, das E-Mails herunterlädt und speichert sie in einem db, ich bekomme in der Regel Tausende von E-Mails zu diesem Konto, einmal heruntergeladen die E-Mails gelöscht werden.php - imap - Verschieben von E-Mails auf Anther-Konto

Da ich paranoisch bin, möchte ich mindestens einen Monat Backup meiner E-Mails haben, aber ich kann meine Hauptpostfachadresse nicht durcheinander bringen und sie dort zurücklassen.

Also muss ich die Mails (über PHP-Code) von einer Mailbox zu einer anderen verschieben. Ich kam zu dieser Lösung, die imap_append() verwendet. Diese Lösung erstellt jedoch die E-Mail neu und verschiebt sie nicht wirklich.

Haben Sie irgendwelche Vorschläge oder alternative Möglichkeiten, dies zu tun?

Denken Sie daran: es muss in PHP getan werden, weil ich es in meinem Readmail-Skript integrieren muss.

Ich habe bereits dieses Themas gesehen where a fetchmail solution was proposed

Hier den Code folgt ich für diese Aufgabe

<?php 
/** 
* Conn params 
*/ 

$fromMboxServerPath = "{imap.from.server/notls/imap:143}"; 
$fromMboxMailboxPath = "INBOX"; 
$fromMboxMailAddress = "login"; 
$fromMboxMailPass = "pass"; 


$toMboxServerPath = "{imap.to.server/notls/imap:143}"; 
$toMboxMailboxPath = "INBOX"; 
$toMboxMailAddress = "login"; 
$toMboxMailPass = "pass"; 

$fromMboxConnStr = $fromMboxServerPath.$fromMboxMailboxPath; 
$toMboxConnStr = $toMboxServerPath.$toMboxMailboxPath; 

$fetchStartSeq = 1; 
$fetchEndSeq = 10; 

function myLog($str) 
{ 
    echo "Log [".date('Y-m-d H:i:s')."]: $str\n"; 
} 

myLog("Connecting to mailbox"); 

function mboxConn($connstr,$addr,$pass) 
{ 
    if(!($mbox = @imap_open($connstr, $addr, $pass))) 
    { 
     myLog("Error: ".imap_last_error()); 
     die; 
    } 
    else 
    { 
     myLog("Connected to: $addr $connstr"); 
     return $mbox; 
    } 
} 

function mboxCheck($mbox) 
{ 
    if(!($mbox_data = imap_check($mbox))) 
    { 
     myLog("Error: ".imap_last_error()); 
     die; 
    } 
    else 
    { 
     myLog("Mailbox check ".$mbox_data->Mailbox." OK"); 
     myLog($mbox_data->Nmsgs." messages present"); 
     return $mbox_data->Nmsgs; 
    } 
} 

$fromMbox = mboxConn($fromMboxConnStr, $fromMboxMailAddress, $fromMboxMailPass); 
$toMbox = mboxConn($toMboxConnStr, $toMboxMailAddress, $toMboxMailPass); 

$fromMboxCount = mboxCheck($fromMbox); 
$toMboxCount = mboxCheck($toMbox); 

/** 
* Loop on mails 
*/ 

$fetchStartUID = imap_uid($fromMbox,$fetchStartSeq); 
if ($fromMboxCount < $fetchEndSeq) 
{ 
    $fetchEndSeq = $fromMboxCount; 
} 
$fetchEndUID = imap_uid($fromMbox,$fetchEndSeq); 

/** 
* Loop on mails 
*/ 

myLog("Do stuff and backup from UID [$fetchStartUID] to UID [$fetchEndUID]"); 

for ($i=$fetchStartSeq;$i<=$fetchEndSeq;$i++) 
{ 
    $pfx = "Msg #$i : "; 
    $h = imap_header($fromMbox, $i); 
    $fh = imap_fetchheader($fromMbox, $i); 
    $fb = imap_body($fromMbox, $i); 
    $message = $fh.$fb; 

    $msgUID = imap_uid($fromMbox,$i); 

    $struct = imap_fetchstructure ($fromMbox, $i); 

    /** 
    * We do some logging 
    */ 

    myLog($pfx."UID [".$msgUID."] SEQ [".imap_msgno($fromMbox,$msgUID)."] Flags: [". $h->Unseen . $h->Recent . $h->Deleted . $h->Answered . $h->Draft . $h->Flagged."]"); 
    myLog($pfx."From: [". htmlspecialchars($h->fromaddress) . "] To: [".htmlspecialchars($h->toaddress)."]"); 
    myLog($pfx."Subject: [$h->subject]"); 

    /** 
    * Here you do whaterver you need with your email 
    */ 

    /** 
    * Backup email 
    */ 
    if (!($ret = imap_append($toMbox,$toMboxServerPath.$toMboxMailboxPath,$message))) 
    { 
     myLog("Error: ".imap_last_error()); 
     die; 
    } 
    else 
    { 
     myLog("everything ok, mail [$fetchStartUID:$fetchEndUID] downloaded and moved in $newMailboxNameMOVE"); 
    } 
} 

/** 
* End 
*/ 

imap_close($fromMbox); 
imap_close($toMbox); 

myLog("Connection closed"); 

?> 

Antwort

0

Warum separates Konto und all die Probleme geschrieben, die beteiligt sein wird? Können Sie nicht auch

a) Sichern Sie das Mail-Konto mit Standard-Backup-Tools wie, z. rdiff-backup?

b) sichern sie in der db?

oder sogar

c) einen Aliasnamen erstellen, so dass E-Mails an beiden Konten gehen und Sie haben unterschiedliche Kriterien für die E-Mails von beiden Konten zu entfernen (dh. Halten sie für einen Monat in dem Backup-Konto)

1

Erstens, IMAP hat keinen MOVE-Befehl nur kopieren, aber selbst wenn es getan hat, können Sie direkt von einem IMAP-Server auf einen anderen kopieren.

Warum nicht einen Unterordner im Konto für Sicherungen verwenden. Laden Sie sie auf Ihren lokalen Rechner herunter, kopieren Sie sie in den Unterordner und LÖSCHEN Sie sie dann von der INBOX.

COPY und DELETE sind imap Server-Seite-Kommandos so haben sie nicht den Server verlassen die „move“

zu tun Wenn beide Konten auf demselben Server gibt es eine weitere Möglichkeit, den Zugriff auf das Backup Konto-INBOX an den Benutzer des primären Kontos. Dann können Sie die Server-Seite kopieren/löschen, um sie in den Backup-Ordner zu verschieben.

Nicht alle IMAP-Server erlauben freigegebene Ordner.

php hat eine imap_move-Funktion, aber ich nehme an, dass es eine Kopie/löscht.

+1

Jede Verschiebungsfunktion in jeder Sprache ist im Hintergrund ein Kopier-Lösch-Vorgang. PHP haben imap_mail_move Funktion, können Sie die Details in offiziellen PHP-Seite http://php.net/manual/es/function.imap-mail-move.php – JoelBonetR

1

Ich kenne keine andere Lösung wie PHP.

Aber für Ihren Code und testen Sie verwenden sollten:

$fromMboxServerPath = "{imap.from.server/notls/imap/readonly:143}"; //ReadOnly 

in imap_append() sollten Sie das Datum von emailheader geben. siehe PHP Handbuch: http://php.net/manual/en/function.imap-append.php

Danach haben Sie eine 1to1 Kopie Ihrer Mail auf dem Ziel-IMAP-Server.

+0

Vielen Dank für die Vorschläge, sobald ich einen freien Moment habe ich Ich werde es in meinen Post integrieren. –