2008-10-02 13 views
0

私は電子メールをダウンロードしてデータベースに保存するスクリプトを作成していますが、ダウンロードしたメールは通常このアカウントで数千のメールを受け取ります。php - imap - 盗難防止アカウントでメールを移動する

パラノイックなので、私は少なくとも1ヶ月間私のメールをバックアップしたいと思っていますが、メインのメールボックスアドレスを混乱させてそこに残すことはできません。

私はメールボックスを(PHPコードで)あるメールボックスから別のメールボックスに移動する必要があります。私はimap_append()を使うこの解決策を思いつきました。しかし、このソリューションは電子メールを再作成し、実際には移動しません。

これを行うための提案や代替方法はありますか?

私は自分のreadmailスクリプトに統合する必要があるので、phpで実行する必要があります。私はすでにここでは、このスレッドwhere a fetchmail solution was proposed

を見てきました

は、私は、このタスク

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

?> 

答えて

0

なぜ別のアカウントと関わることになるすべての手間のために書いたコードを次の?あなたはどちらでもできません。

a)例えば、次のような標準的なバックアップツールを使用してメールアカウントをバックアップします。 rdiff-backup?

b)データベースにバックアップしますか?

あるいは

c)のメールは両方のアカウントにアクセスして、あなたはすなわち(両方のアカウントからメールを削除するための異なる基準を持つように。エイリアスを作成し、バックアップのアカウントで1か月のためにそれらを保つ)

1

まず、IMAPにはMOVEコマンドのみのコピーはありませんが、IMAPサーバから別のIMAPサーバに直接コピーすることはできます。

バックアップ用にアカウントのサブフォルダを使用しないでください。それらをローカルマシンにダウンロードし、サブフォルダにコピーしてから、INBOXから削除します。

COPYと両方のアカウントは別のオプションがあり、同じサーバー上にある場合、それらは「移動」

を行うには、サーバーを残すことはありませんので、バックアップへのアクセスを許可するIMAPサーバー側のコマンドですDELETEアカウントのINBOXをプライマリアカウントのユーザーに送信します。次に、サーバー側のコピー/削除を使用して、バックアップフォルダーに移動することができます。

すべてのIMAPサーバーで共有フォルダが使用できるわけではありません。

phpにはimap_move関数がありますが、コピー/削除すると仮定します。

+1

各言語のすべての移動機能は、バックグラウンドではコピー・削除作業です。 PHPはimap_mail_move関数を持っています、公式のPHPページhttp://php.net/manual/es/function.imap-mail-move.phpで詳細を見ることができます – JoelBonetR

1

私はPHPのような他の解決策を知りません。

しかし、あなたのコードのために、あなたが使用する必要がありますテスト:imap_appendで

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

()あなたはemailheaderから日付を与える必要があります。 PHP Manual:http://php.net/manual/en/function.imap-append.php

を参照してください。その後、ターゲットIMAP-Serverにメールの1to1コピーがあります。

+0

私は余裕を持ってすぐに提案をありがとうそれを私のポストに統合します。 –

関連する問題