【问题标题】:php - imap - moving emails on antoher accountphp - imap - 在另一个帐户上移动电子邮件
【发布时间】:2008-10-02 11:13:32
【问题描述】:

我正在编写一个下载电子邮件并将其存储在数据库中的脚本,我通常会在此帐户上收到数千封电子邮件,一旦下载这些邮件就会被删除。

由于偏执,我想至少备份一个月的电子邮件,但我不能把我的主要邮箱地址弄乱,把它们留在里面。

所以我需要将邮件(通过 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");

?>

【问题讨论】:

    标签: php email imap


    【解决方案1】:

    首先,IMAP 没有仅复制的 MOVE 命令,但即使有,您也可以直接从一个 IMAP 服务器复制到另一个。

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

    COPY 和 DELETE 是 imap 服务器端命令,因此它们不必离开服务器即可执行“移动”

    如果两个帐户在同一台​​服务器上,还有另一个选项,允许主帐户用户访问备份帐户的收件箱。然后您可以使用服务器端复制/删除将其移动到备份文件夹。

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

    php 确实有 imap_move 功能,但我认为它会进行复制/删除。

    【讨论】:

    【解决方案2】:

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

    但是对于您的代码和测试,您应该使用:

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

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

    之后,您将在目标 IMAP-Server 中获得邮件的 1to1 副本。

    【讨论】:

    • 感谢您的建议,我一有空就将其整合到我的帖子中。
    【解决方案3】:

    为什么要分开帐户以及会涉及的所有麻烦?你也不能

    a) 使用标准备份工具备份邮件帐户,例如。 rdiff-备份?

    b) 在数据库中备份它们?

    甚至

    c) 创建一个别名,以便电子邮件发送到两个帐户,并且您有不同的标准从两个帐户中删除邮件(即,将它们在备份帐户中再保留一个月)

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多