一個 PHP IMAP 庫,用於透過 IMAP 協定讀取和處理電子郵件,採用強大的物件導向架構建置。
該函式庫需要 PHP >= 8.3,並安裝 IMAP、inov 和多位元組字串擴充。
安裝 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, // 必要的$port, // 預設為 '993'$flags, // 預設為 '/imap/ssl/validate-cert'$parameters);
從郵件伺服器檢索郵箱(也稱為郵件資料夾)並迭代它們:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// 跳過僅容器郵箱// @see 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('Flagged', '1,3');
警告在批次修改標誌的情況下,您必須檢索新的訊息實例以刷新單一訊息標誌。
從郵箱檢索訊息(電子郵件)並迭代它們:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message 是 DdeboerImapMessage 的實例}
若要將新郵件(剛剛傳送的郵件)插入「已傳送」信箱並將其標記為「已傳送」:
$mailbox = $connection->getMailbox('已發送');$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),SORATEAgo),SORATE, // 排序條件/降序排列);
請注意,PHP imap 庫依賴 https://www.washington.edu/imap/ 上提供的c-client
庫,該庫不完全支援某些 IMAP4 搜尋條件,例如OR
。如果您想要那些不受支援的標準,則需要手動修補最新版本(本次提交時為 2011 年 7 月 23 日的imap-2007f
),並將 PHP 重新編譯到已修補的c-client
端程式庫上。
順便說一下,大多數常見的搜尋條件都可用且有效,請在./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 部分的內容 if presentif ($body === null) { // 如果 body 為 null,則沒有 HTML 部分,所以讓我們嘗試取得文字 body$body = $message->getCompleteBodyText() ; // 文字/純文字部分的內容(如果存在)}
讀取訊息正文會使訊息保持不可見狀態。如果您想將訊息標記為已查看:
$message->markAsSeen();
或者您可以設定或清除任何標誌:
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
將郵件移至另一個郵件信箱:
$mailbox = $connection->getMailbox('另一個郵箱');$message->move($mailbox);
刪除訊息:
$郵箱->getMessage(1)->delete();$郵箱->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 具有與普通訊息相同的 API。
IMAP擴充提供了imap_timeout函數來調整各種操作的超時秒數。
然而,擴展的實作並不將功能連結到特定的上下文或連接,而是全局的。因此,為了不影響該庫之外的功能,我們必須選擇是將每個imap_*
呼叫包裝在可選的用戶提供的超時周圍,還是將此任務留給用戶。
由於 IMAP 伺服器的異質世界以及前者的一點點收益所帶來的高複雜性負擔成本,我們選擇了後者。
可模擬性是由每個 API 的介面授予的。深入研究 MockabilityTest 以取得模擬工作流程的範例。
需要 Docker 才能在您的電腦上運行建置。
您需要執行的第一個命令是make start-imap-server
,它在本地啟動 IMAP 伺服器。
然後可以透過裸make
觸發本地建置。
完成開發後,使用make stop-imap-server
停止本機 IMAP 伺服器。