1

さまざまなアカウント(主にPOPとIMAP)からメールを収集し、分析(メールの内容など)のためにそれらをすべて1つのシステムにまとめることができるシステムをPHP/Zendで作成しようとしています。

私が設計しているシステムでは、ユーザーがメールを表示する必要がある場合に元の形式でメールを表示するように求められるため、アカウントからメールを読み取ってローカルに移動する予定です。Zend_Mail_Storage_Writable_Maildirを使用してローカルのMaildir構造を作成し、各アカウントから戻ってきたメッセージを追加しています。

さまざまなアカウントに接続してメールを取得し、問題なくローカルのMaildirアカウントに追加することができます。私の問題は、Maildirアカウントに追加された各メッセージを区切る一意の識別子が見つからないように見えることです(各電子メールの電子メール情報の一部を一意の識別子とともにデータベースに保存する予定です)。

Zend_Mail_Storage_Writable_Maildirインスタンスに最近追加されたメッセージの一意の識別子を取得する方法を知っている人はいますか?

私の基本的なコードは次のとおりです。

// Set config array for connecting to an email account (Hotmail, gMail etc.)
$config = array(
    'host'=> 'xxxx',
    'user' => 'xxxx',
    'password' => 'xxxx',
    'ssl' => 'SSL',
    'port' => 995);

// Connect to the account and get the messages
$mail = new Zend_Mail_Storage_Pop3($config);

// Connect to the local Mairdir instance so we can add new messages
$mailWrite = new Zend_Mail_Storage_Writable_Maildir(array('dirname' => '/xxxx/xxxx/'));

// Loop through the messages and add them        
foreach ($mail as $messageId => $message)
{
    // ADDING THE MESSAGE WORKS FINE, BUT HOW DO I GET THE UNIQUE 
    //  IDENTIFIER FOR THE MESSAGE I JUST ADDED?
    $mailWrite->appendMessage($message);

    // FYI: $messageId seems to be the message ID from the originating account; it
    //  starts at one and increments, so this can't be used :(
}

あなたが提供できるかもしれない洞察に感謝します!

ダン

4

1 に答える 1

2

Zend_Mail_Storage_Writable_Maildir::getUniqueId()メソッドを使用して、追加されたメッセージの一意のIDを取得できます。

関数にIDを渡さない場合は、メールディレクトリからすべてのメッセージの一意のIDの配列が返されます。

次に例を示します。

foreach ($mail as $messageId => $message)
{
    // ADDING THE MESSAGE WORKS FINE, BUT HOW DO I GET THE UNIQUE 
    //  IDENTIFIER FOR THE MESSAGE I JUST ADDED?
    $mailWrite->appendMessage($message);

    $ids = $mailWrite->getUniqueId();
    $lastMessageId = $ids[sizeof($ids)];
}

からの戻り配列getUniqueId()は0ベースではなく1ベースであることに注意してください。そのため、注意してください。

また、これがバグなのか設計によるものなのかはわかりませんが、新しく追加されたファイルに対して返される一意のIDには、ファイル名にメッセージサイズや情報文字列が含まれていませんが、既存のメッセージには含まれています。

つまり、配列は次のようになります。

array(21) {
  [1]=>
  string(38) "1338311280.0773.1143.localhost.localdomain,S=34226"
  [2]=>
  string(38) "1338311278.5589.1143.localhost.localdomain,S=108985"
  [3]=>
  // ...
  [20]=>
  string(39) "1338311217.6442.18718.localhost.localdomain,S=2142"
  [21]=>
  string(31) "1338312073.7461.18715.localhost.localdomain"
}

最後のメッセージのサイズがまだないことに注意してください(appendMessageで追加されたメッセージ)。

それがあなたを助けることを願っています。

于 2012-05-29T17:26:34.387 に答える