2008-10-02 4 views
0

이메일을 다운로드하여 데이터베이스에 저장하는 스크립트 작업을하고 있습니다. 다운로드 한 메일은이 계정에서 수천 통의 이메일을받습니다.php - imap - 안티 구좌 계정으로 이메일 이동하기

편집증으로 인해 이메일을 적어도 한 달 이상 백업하고 싶지만 기본 사서함 주소를 혼란스럽게 만들 수는 없습니다.

그래서 하나의 사서함에서 다른 사서함으로 (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

왜 별도의 계정과 관련되는 모든 번거 로움을 위해 쓴 코드를 다음과 보았는가? 어느 쪽이든 할 수 없습니다

a) 예를 들어 표준 백업 도구를 사용하여 메일 계정을 백업하십시오. rdiff - 백업?

b) 데이터베이스에 백업 하시겠습니까?

또는

C) 이메일이 두 계정에 가서 예 (두 계정에서 메일을 제거하기위한 다른 기준을 가질 수 있도록. 별칭을 만들 백업 계정을 하나 더 달 동안 그들을 계속)

1

먼저 IMAP에는 MOVE 명령 전용 복사본이 없지만 한 IMAP 서버에서 다른 IMAP 서버로 직접 복사 할 수 있습니다.

백업용 계정의 하위 폴더를 사용하지 않는 이유는 무엇입니까? 로컬 컴퓨터로 다운로드 한 다음 하위 폴더로 복사 한 다음받은 편지함에서 삭제하십시오.

복사 및 삭제는 IMAP 서버 측들이는 "이동"두 계정은 또 다른 옵션이 동일한 서버에있는 경우

을 수행 할 서버를 떠날 필요가 백업에 대한 액세스를 허용하지 않도록 명령입니다 계정의받은 편지함을 기본 계정 사용자에게 보냅니다. 그런 다음 서버 쪽 복사/삭제를 사용하여 백업 폴더로 이동할 수 있습니다.

일부 IMAP 서버는 공유 폴더를 허용하지 않습니다.

php에는 imap_move 기능이 있지만 복사/삭제한다고 가정합니다.

+1

모든 언어의 모든 이동 기능은 백그라운드에서 복사 삭제 작업입니다. PHP는 imap_mail_move 함수를 가지고 있습니다. 공식 PHP 페이지 http://php.net/manual/es/function.imap-mail-move.php에서 자세한 내용을 볼 수 있습니다. – JoelBonetR

1

나는 PHP와 같은 다른 해결책을 모른다.

하지만 당신의 코드를 사용한다 테스트

: imap_append에서

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

는() 당신은 emailheader에서 날짜를 제공해야합니다. PHP Manual : http://php.net/manual/en/function.imap-append.php

을 참조하십시오. 그러면 대상 IMAP 서버에 메일의 1to1 사본이 생깁니다.

+0

제안 해 주셔서 감사합니다. 그것을 내 게시물에 통합 할 것입니다. –