我正在制作一个下载电子邮件并将其存储在数据库中的脚本,我通常会在此帐户上收到数千封电子邮件,一旦下载,邮件就会被删除。
偏执狂,我希望至少有一个月的电子邮件备份,但我不能把我的主邮箱地址弄得乱七八糟,让他们留在那里。
所以我需要将邮件(通过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 :(得分:1)
首先,IMAP没有MOVE命令只复制,但即使这样,您也可以直接从一个IMAP服务器复制到另一个IMAP服务器。
为什么不在帐户中使用子文件夹进行备份。将它们下载到本地计算机,然后将它们复制到子文件夹,然后从INBOX中删除它们。
COPY和DELETE是imap服务器端命令,因此他们不必离开服务器来执行“移动”
如果两个帐户位于同一服务器上,则还有另一个选项,允许访问备份帐户的INBOX给主帐户用户。然后,您可以使用服务器端复制/删除将其移动到备份文件夹。
并非所有IMAP服务器都允许共享文件夹。
php确实有一个imap_move函数,但我认为它会复制/删除。
答案 1 :(得分: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服务器中获得1到1份邮件副本。
答案 2 :(得分:0)
为什么要分开帐户和所涉及的所有麻烦?你也不能
a)使用标准备份工具备份邮件帐户,例如。 rdiff进行备份?
b)将它们备份到db?
甚至
c)创建一个别名,以便电子邮件转到这两个帐户,并且您有不同的条件从两个帐户中删除邮件(即在备份帐户中再保留一个月)