我想将全部数据(所有子文件夹)从一个 imap 服务器传输到另一个,而不会丢失任何数据。
2 回答
正如 vpetersson 所提到的,它不太适合 PHP 部分,因为使用任何 imap 客户端软件也可以轻松地将电子邮件从一个 Imap 迁移到另一个 Imap 服务器,例如,Microsoft Outlook、Mozilla Thunderbird、Apple Mail 客户端和很快。你怎么能做到这一点很简单。如果您需要迁移的电子邮件帐户数量有限,这里是 Mozilla Thunderbird 的示例工作流程,您也可以在任何其他客户端上遵循相同的流程。
- 创建一个新的 Imap 帐户,并将其命名为 Source。[确保选择 IMAP 作为协议而不是 POP]
- 以可以连接到当前源 Imap 服务器的方式对其进行配置,并且根据该帐户中的电子邮件量和网络速度,同步所有电子邮件可能需要一段时间。
- 同步完成后,为目标服务器创建一个新帐户,将其命名为 Target,并将其配置为 IMAP。
- 目标帐户显然是空的,现在只需将所有文件夹从源帐户复制到目标帐户。
- Thunderbird 将处理所有的复制过程,并且它会自动将所有邮件上传到新服务器(作为 IMAP 帐户的默认行为)一旦完成,您将在两台服务器上完整克隆您的电子邮件帐户。
或者,如果您必须在 PHP 中执行此操作,可能是因为您有数百个电子邮件帐户并且使用上述方法不实用,请按照以下步骤操作。
你也可以使用 PHP_Imap 库,但如果你可以控制你的服务器,我会推荐使用 PEAR 的 Net_IMAP 库,它在 php statdard IMAP 库中缺少一些功能。
- 为所有帐户和每个帐户编写一个 for 循环
连接到服务器
$imapServer = new Net_IMAP($emailHost, 143); $loggedIn = $imapServer->login($loginName , $password); if($loggedIn == true){ //代码放在这里 }
查找所有文件夹
$mBoxes = $imapServer->getMailboxes('', 0, true);
对于每个文件夹
$mBox = $imapServer->selectMailbox($folderName);
查找所有消息
$msgsList = $imapServer->getMessagesList();
获取原始消息。
foreach($msgUid){ $fullRawMail = $imapServer->getMessages($msgUid,false); }
连接到目标服务器
检查目标服务器是否与源服务器具有相同的文件夹,如果没有则创建一个文件夹
将原始消息上传到目标服务器 [特定文件夹]。你可以使用 php 的 imap_append 函数。
imap_append($ImapStream, $folderName, $fullRawMail , "\Seen");
我不确定您所说的“PHP 电子邮件迁移”是什么意思,因为我不明白 PHP 如何融入这个等式。
也就是说,有一些 MAP 迁移工具可以完成您所描述的内容。我是一个名为YippieMove的产品的联合创始人,它可以做到这一点,但也有其他开源替代品,比如imapsync。如果您花一些时间在 Google 上,您会发现更多选择。