0

私はメールをダウンロードしてデータベースに保存するスクリプトに取り組んでいます。ダウンロードするとメールが削除されると、通常、このアカウントで何千ものメールを受信します。

妄想的で、少なくとも1か月はメールのバックアップを取りたいのですが、メインのメールボックスアドレスを散らかしてそこに残しておくことはできません。

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

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

覚えておいてください:私はそれを私のreadmailスクリプトに統合する必要があるので、それはphpで行われなければなりません。

fetchmailソリューションが提案されたこのスレッドはすでに見ました

このタスクのために私が書いたコードは次のとおりです

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

?>
4

3 に答える 3

1

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

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

COPY と DELETE は imap サーバー側のコマンドであるため、「移動」を行うためにサーバーを離れる必要はありません。

両方のアカウントが同じサーバー上にある場合は、バックアップ アカウントの受信トレイへのアクセスをプライマリ アカウント ユーザーに許可する別のオプションがあります。次に、サーバー側のコピー/削除を使用して、バックアップ フォルダーに移動できます。

すべての IMAP サーバーで共有フォルダーが許可されているわけではありません。

php には imap_move 関数がありますが、コピー/削除を行うと思います。

于 2008-10-07T16:07:43.473 に答える
1

PHPのような他のソリューションは知りません。

ただし、コードとテストには次を使用する必要があります。

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

imap_append() では、メールヘッダーから日付を指定する必要があります。PHP マニュアルを参照してください: http://php.net/manual/en/function.imap-append.php

その後、ターゲット IMAP サーバーにメールの 1 対 1 のコピーが作成されます。

于 2011-04-29T17:16:54.627 に答える
0

なぜ特別勘定とそれに伴うすべての面倒なことですか?あなたもできません

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

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

あるいは

c)エイリアスを作成して、メールが両方のアカウントに送信され、両方のアカウントからメールを削除するための基準が異なるようにします(つまり、バックアップアカウントにさらに1か月間保持します)。

于 2008-10-02T11:20:32.587 に答える