IMAP プロトコル経由で電子メールを読み取り、処理するための PHP IMAP ライブラリ。堅牢なオブジェクト指向アーキテクチャで構築されています。
このライブラリには、IMAP、iconv、およびマルチバイト文字列拡張機能がインストールされた PHP 8.3 以上が必要です。
IMAP ライブラリをインストールする推奨方法は、Composer を使用することです。
$コンポーザーにはddeboer/imapが必要です
このコマンドでは、Composer ドキュメントのインストールの章で説明されているように、Composer をグローバルにインストールする必要があります。
use DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection は DdeboerImapConnection のインスタンスです$connection = $server->authenticate('my_username', 'my_password');
サーバーにポート、フラグ、パラメータを指定できます。
$server = new Server($hostname, // required$port, // デフォルトは '993'$flags, // デフォルトは '/imap/ssl/validate-cert'$parameters);
メールサーバーからメールボックス (メールフォルダーとも呼ばれます) を取得し、それらを反復処理します。
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// コンテナ専用メールボックスをスキップします// @https://secure.php.net/manual/en/function.imap-getmailboxes を参照してください.phpif ($mailbox->getAttributes() & LATT_NOSELECT) {続行; }// $mailbox は DdeboerImapMailboxprintf('メールボックス "%s" には %s メッセージがあります', $mailbox->getName(), $mailbox->count()) のインスタンスです。 }
または、特定のメールボックスを取得します。
$mailbox = $connection->getMailbox('INBOX');
メールボックスを削除します。
$connection->deleteMailbox($mailbox);
メールボックス メッセージのフラグを (UID によって) 一括で設定またはクリアできます。
$mailbox->setFlag('Seen Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Seen', '1,3,5,6: 8');$mailbox->clearFlag('フラグ付き', '1,3');
警告フラグを一括変更して単一のメッセージ フラグを更新する場合は、新しいメッセージ インスタンスを取得する必要があります。
メールボックスからメッセージ (電子メール) を取得し、それを反復処理します。
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message は DdeboerImapMessage のインスタンスです}
新しいメッセージ (送信されたばかりのメッセージ) を送信済みメールボックスに挿入し、既知のフラグを付けるには:
$mailbox = $connection->getMailbox('Sent');$mailbox->addMessage($messageMIME, 'Seen');
メッセージは MIME 形式の文字列である必要があることに注意してください (RFC2045 で説明されているとおり)。
DdeboerImapSearchExpression を使用;DdeboerImapSearchEmailTo を使用;DdeboerImapSearchTextBody を使用;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $mailbox->getMessages($search);
警告現在、スペースと二重引用符を一緒にエスケープすることはできません。現在、スペースのみが正しくエスケープされます。 DdeboerImapSearchRawExpression
を使用して、完全な検索条件を自分で記述することができます。
メッセージは imap_sort 関数に従って並べ替えて取得することもできます。
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // 並べ替え条件 true //降順);
PHP imap ライブラリは、https://www.washington.edu/imap/ で入手可能なc-client
ライブラリに依存していることに注意してください。このライブラリは、 OR
などの一部の IMAP4 検索条件を完全にはサポートしていません。これらのサポートされていない基準が必要な場合は、最新バージョン (このコミット時点では 2011 年 7 月 23 日のimap-2007f
) に手動でパッチを適用し、パッチを当てたc-client
ライブラリに PHP を再コンパイルする必要があります。
ちなみに、一般的な検索条件のほとんどは利用可能で機能しており、 ./src/Search
で参照できます。
参考文献:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
および./docs/internal.txt
<...> の形式でメッセージ番号と一意のメッセージ ID を取得します。
$message->getNumber();$message->getId();
他のメッセージ プロパティを取得します。
$message->getSubject();$message->getFrom(); // MessageEmailAddress$message->getTo(); // MessageEmailAddress$message->getDate(); の配列 // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
メッセージ ヘッダーを DdeboerImapMessageHeaders オブジェクトとして取得します。
$message->getHeaders();
メッセージ本文を HTML またはプレーン テキストとして取得します (最初の部分のみ):
$message->getBodyHtml(); // text/html 部分の内容 (存在する場合)$message->getBodyText(); // テキスト/プレーン部分の内容 (存在する場合)
完全なボディ (すべての部分) を取得します。
$body = $message->getCompleteBodyHtml(); // text/html 部分の内容、存在する場合 ($body === null) { // body が null の場合、HTML 部分がないため、テキストを取得してみましょう body$body = $message->getCompleteBodyText() ; // テキスト/プレーン部分の内容(存在する場合)}
メッセージ本文を読むと、メッセージは表示されないままになります。メッセージを既読としてマークしたい場合:
$message->markAsSeen();
または、任意のフラグを設定またはクリアすることもできます。
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
メッセージを別のメールボックスに移動します。
$mailbox = $connection->getMailbox('another-mailbox');$message->move($mailbox);
メッセージの削除:
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
メッセージの添付ファイル (インラインと添付の両方) を取得し、それらを反復処理します。
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment は DdeboerImapMessageAttachment のインスタンスです}
メッセージの添付ファイルをローカル ファイルにダウンロードします。
// getDecodedContent() は添付ファイルのコンテンツを自動的にデコードします:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
添付ファイルが埋め込みメッセージであるかどうかを確認し、それを取得します。
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage は DdeboerImapMessageEmbeddedMessage のインスタンスです} }
EmbeddedMessage には、フラグやコピー、移動、削除などの操作を除けば、通常のメッセージと同じ API があります。
IMAP 拡張機能は、さまざまな操作のタイムアウト秒を調整する imap_timeout 関数を提供します。
ただし、拡張機能の実装は、機能を特定のコンテキストまたは接続にリンクせず、代わりにグローバルです。したがって、このライブラリの外部の機能に影響を与えないようにするには、すべてのimap_*
呼び出しをオプションのユーザー指定のタイムアウトでラップするか、このタスクをユーザーに任せるかを選択する必要がありました。
IMAP サーバーの異種混合の世界と、前者のようなわずかな利益の複雑さによる負担コストの高さのため、私たちは後者を選択しました。
モック可能性は、各 API に存在するインターフェイスによって付与されます。モック化されたワークフローの例については、MockabilityTest を詳しく調べてください。
コンピューター上でビルドを実行するには Docker が必要です。
最初に実行する必要があるコマンドはmake start-imap-server
で、IMAP サーバーをローカルで起動します。
その後、ベアmake
を使用してローカル ビルドをトリガーできます。
開発が終了したら、 make stop-imap-server
を使用してローカル IMAP サーバーを停止します。