php-imap-在其他帐户上移动电子邮件
时间:2020-03-06 15:01:13 来源:igfitidea点击:
我正在使用一个脚本来下载电子邮件并将其存储在数据库中,通常我会在此帐户上收到数千封电子邮件,一旦下载,邮件就会被删除。
由于偏执,我想至少备份我的电子邮件一个月,但我不能弄乱我的主邮箱地址,将它们留在那里。
所以我需要将邮件(通过php代码)从一个邮箱移动到另一个邮箱。我想出了使用imap_append()的解决方案。但是,此解决方案会重新创建电子邮件,并且不会真正移动它。
我们有任何建议或者其他替代方法吗?
请记住:必须在php中完成,因为我需要将其集成到我的readmail脚本中。
我已经在提议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"); ?>
解决方案
为什么要单独设置帐户以及将涉及的所有麻烦?你也不能
a)使用标准备份工具(例如)备份邮件帐户。 rdiff备份?
b)将它们备份到数据库中?
甚至
c)创建一个别名,以便将电子邮件发送到两个帐户,并且我们具有从两个帐户删除邮件的不同标准(即,将它们在备用帐户中保留一个月)
首先,IMAP没有仅复制MOVE命令,但是即使复制了,我们也可以直接从一台IMAP服务器复制到另一台IMAP服务器。
为什么不在帐户中使用子文件夹进行备份。将它们下载到本地计算机,然后将其复制到子文件夹,然后从收件箱中删除它们。
COPY和DELETE是imap服务器端命令,因此它们不必离开服务器即可执行"移动"
如果两个帐户都在同一台服务器上,则还有另一个选择,允许主要帐户用户访问备份帐户的INBOX。然后,我们可以使用服务器端复制/删除将其移动到备份文件夹。
并非所有的IMAP服务器都允许共享文件夹。
php确实具有imap_move函数,但我认为它具有复制/删除功能。