2008-10-02 54 views
0

我上下载邮件,并将它们存储在一个数据库的脚本工作的移动电子邮件,我通常会收到此帐户成千上万的电子邮件,一旦下载的邮件被删除。PHP - IMAP - 上antoher账号

作为paranoic,我希望有我的电子邮件中至少一个月的备份,但我不能弄乱我的主邮箱地址,让他们在那里。

所以我需要从一个邮箱移动邮件(通过PHP代码)到另一个。我想出了使用imap_append()的这个解决方案。然而,这个解决方案重新创建了电子邮件,并没有真正移动它。

您有任何建议或替代方法吗?

记住:它必须在PHP做,因为我需要它在我readmail将脚本集成。

我已经看到了这个线程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

为什么独立帐户,所有将要涉及的麻烦的代码?你能不能既

一)备份使用标准的备份工具等,例如邮件帐户。 rdiff进行备份?

b)在db中备份它们?

甚至

C),从而使电子邮件到这两个帐户,你必须从两个帐户删除邮件(即不同的标准创建一个别名。让他们更多的一个月的备份帐户)

1

首先,IMAP没有MOVE命令只有副本,但即使它可以从一个IMAP服务器直接复制到另一个。

为什么不在帐户中使用子文件夹进行备份。将它们下载到本地计算机,然后将它们复制到子文件夹,然后从INBOX中删除它们。

复制和删除的IMAP服务器端命令,所以他们不必离开服务器做了“移动”

如果两个账户都在同一台服务器上还有另一种选择,让访问备份帐户的主要帐户用户的INBOX。然后,您可以使用服务器端复制/删除将其移动到备份文件夹。

并非所有的IMAP服务器都允许共享文件夹。

PHP确实有imap_move功能,但我认为它不会复制/删除。

+1

每种语言的每个移动功能都是在后台进行复制删除工作。 PHP有imap_mail_move功能,你可以在官方的php页面中看到详细信息http://php.net/manual/es/function.imap-mail-move.php – JoelBonetR 2016-06-22 08:40:27

1

我不知道任何其他解决方案,如PHP。

但对你的代码和测试,你应该使用:

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

在imap_append(),你应该给从emailheader日期。请参阅PHP手册:http://php.net/manual/en/function.imap-append.php

之后,您将在目标IMAP服务器中拥有邮件的1to1副本。

+0

感谢您的建议,只要我有空余时间,我会将它整合到我的文章中。 – 2011-05-04 12:18:32