2008-10-02 5 views
0

Je travaille sur un script qui télécharge des emails et les stocke dans un db, je reçois habituellement des milliers d'emails sur ce compte, une fois téléchargés les mails sont supprimés. Comme je suis paranoïaque, je veux avoir au moins un mois de sauvegarde de mes courriels, mais je ne peux pas encombrer mon adresse de boîte aux lettres principale en les laissant là.php - imap - transférer des e-mails sur un autre compte

Donc, je dois déplacer les mails (via le code php) d'une boîte aux lettres à l'autre. Je suis venu avec cette solution qui utilise imap_append(). Cette solution recrée cependant l'email, et ne le déplace pas vraiment.

Avez-vous des suggestions ou d'autres moyens de le faire? Rappelez-vous: cela doit être fait en php, car j'ai besoin de l'intégrer dans mon script readmail.

Je l'ai déjà vu ce fil where a fetchmail solution was proposed

suit Voici le code que j'ai écrit pour cette tâche

<?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"); 

?> 

Répondre

0

Pourquoi compte séparé et tous les tracas qui sera impliqué? Vous ne pouvez pas non plus

a) de sauvegarder le compte de messagerie en utilisant des outils de sauvegarde standard comme, par exemple. rdiff-backup?

b) les sauvegarder dans le db?

ou même

c) créer un alias pour que les courriels aller à deux comptes et vous avez des critères différents pour la suppression mails des deux comptes (ie. Les garder pour un mois de plus dans le compte de sauvegarde)

1

Tout d'abord, IMAP ne dispose pas d'une copie de commande MOVE, mais même si vous l'avez fait, vous pouvez copier directement d'un serveur IMAP vers un autre. Pourquoi ne pas utiliser un sous-dossier dans le compte pour les sauvegardes? Téléchargez-les sur votre ordinateur local, puis copiez-les dans le sous-dossier, puis supprimez-les de la boîte de réception.

COPY et DELETE sont côté serveur imap commandes de sorte qu'ils ne doivent pas quitter le serveur pour faire le « mouvement »

Si les deux comptes sont sur le même serveur, il y a une autre option, permettent d'accéder à la sauvegarde INBOX du compte à l'utilisateur du compte principal. Vous pouvez ensuite utiliser la copie/suppression côté serveur pour le déplacer vers le dossier de sauvegarde.

Tous les serveurs IMAP n'autorisent pas les dossiers partagés. Php possède une fonction imap_move mais je suppose qu'il fait une copie/suppression.

+1

Chaque fonction de déplacement dans chaque langue est, en arrière-plan, un travail de copie-suppression. PHP ont imap_mail_move fonction, vous pouvez voir les détails dans la page officielle php http://php.net/manual/es/function.imap-mail-move.php – JoelBonetR

1

Je ne connais pas d'autre solution comme PHP.

Mais pour votre code et de test, vous devez utiliser:

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

dans imap_append() devrait vous donner la date à partir emailheader. voir le manuel PHP: http://php.net/manual/en/function.imap-append.php

après cela, vous aurez une copie 1to1 de votre courrier dans le serveur IMAP cible.

+0

Merci pour les suggestions, dès que j'ai un moment de libre, je Je vais l'intégrer dans mon post. –

Questions connexes