ไลบรารี PHP IMAP สำหรับอ่านและประมวลผลอีเมลผ่านโปรโตคอล IMAP สร้างขึ้นด้วยสถาปัตยกรรมเชิงวัตถุที่แข็งแกร่ง
ไลบรารีนี้ต้องการ PHP >= 8.3 พร้อมติดตั้งส่วนขยาย IMAP, iconv และ Multibyte String
วิธีที่แนะนำในการติดตั้งไลบรารี IMAP คือผ่าน Composer:
$ ผู้แต่งต้องการ ddeboer/imap
คำสั่งนี้กำหนดให้คุณต้องติดตั้ง Composer ทั่วโลก ตามที่อธิบายไว้ในบทการติดตั้งของเอกสารประกอบของ Composer
ใช้ DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection เป็นอินสแตนซ์ของ DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
คุณสามารถระบุพอร์ต แฟล็ก และพารามิเตอร์ให้กับเซิร์ฟเวอร์ได้:
$server = เซิร์ฟเวอร์ใหม่($hostname, // required$port, // defaults to '993'$flags, // defaults to '/imap/ssl/validate-cert'$parameters);
ดึงกล่องจดหมาย (หรือที่เรียกว่าโฟลเดอร์อีเมล) จากเซิร์ฟเวอร์อีเมลและทำซ้ำ:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// ข้ามกล่องจดหมายเฉพาะคอนเทนเนอร์// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($กล่องจดหมาย->getAttributes() & LATT_NOSELECT) {ดำเนินการต่อ; }// $mailbox เป็นอินสแตนซ์ของ DdeboerImapMailboxprintf('Mailbox "%s" has %s Messages', $mailbox->getName(), $mailbox->count()); -
หรือเรียกค้นกล่องจดหมายเฉพาะ:
$mailbox = $connection->getMailbox('INBOX');
ลบกล่องเมล:
$connection->deleteMailbox($เมลบ็อกซ์);
คุณสามารถตั้งค่าหรือล้างการตั้งค่าสถานะข้อความในกล่องจดหมายจำนวนมาก (ตาม UID) ได้ ดังนี้
$mailbox->setFlag('Seen Flag', ['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('ส่งแล้ว');$mailbox->addMessage($messageMIME, 'Seen');
โปรดทราบว่าข้อความควรเป็นสตริงในรูปแบบ MIME (ตามที่อธิบายไว้ใน RFC2045)
ใช้ DdeboerImapSearchExpression;ใช้ DdeboerImapSearchEmailTo;ใช้ DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $กล่องจดหมาย->getMessages($ค้นหา);
คำเตือน ขณะนี้เราไม่สามารถใช้ทั้งช่องว่าง และ เครื่องหมายคำพูดคู่ร่วมกันได้ ขณะนี้มีเพียงช่องว่างเท่านั้นที่มีการหลีกอย่างถูกต้อง คุณสามารถใช้ DdeboerImapSearchRawExpression
เพื่อเขียนเงื่อนไขการค้นหาที่สมบูรณ์ได้ด้วยตัวเอง
ข้อความสามารถดึงข้อมูลได้โดยจัดเรียงตามฟังก์ชัน imap_sort:
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // เรียงลำดับเกณฑ์true // ลำดับจากมากไปน้อย);
โปรดทราบว่าไลบรารี PHP imap อาศัยไลบรารี c-client
ที่ https://www.washington.edu/imap/ ซึ่งไม่รองรับเกณฑ์การค้นหา IMAP4 บางอย่างเช่น OR
อย่างสมบูรณ์ หากคุณต้องการเกณฑ์ที่ไม่รองรับ คุณจะต้องแพตช์เวอร์ชันล่าสุดด้วยตนเอง ( imap-2007f
วันที่ 23 ก.ค. 2554 ณ เวลาที่คอมมิตนี้) และคอมไพล์ PHP ใหม่ลงในไลบรารี c-client
ที่ได้รับแพตช์ของคุณ
อย่างไรก็ตาม เกณฑ์การค้นหาทั่วไปส่วนใหญ่พร้อมใช้งานและทำงานได้ ให้เรียกดูใน ./src/Search
Search
อ้างอิง:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
และ ./docs/internal.txt
รับหมายเลขข้อความและรหัสข้อความเฉพาะในรูปแบบ <...>:
$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 ($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);
การลบข้อความ:
$กล่องจดหมาย->getMessage(1)->ลบ();$กล่องจดหมาย->getMessage(2)->ลบ();$การเชื่อมต่อ->ล้างข้อมูล();
รับไฟล์แนบข้อความ (ทั้งแบบอินไลน์และแบบแนบ) และทำซ้ำ:
$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 เป็น $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage เป็นอินสแตนซ์ของ DdeboerImapMessageEmbeddedMessage } -
EmbeddedMessage มี API เดียวกันกับข้อความปกติ นอกเหนือจากแฟล็กและการดำเนินการต่างๆ เช่น คัดลอก ย้าย หรือลบ
ส่วนขยาย IMAP มีฟังก์ชัน imap_timeout เพื่อปรับวินาทีการหมดเวลาสำหรับการดำเนินการต่างๆ
อย่างไรก็ตาม การใช้งานส่วนขยายไม่ได้เชื่อมโยงฟังก์ชันการทำงานกับบริบทหรือการเชื่อมต่อเฉพาะ แต่จะเป็นแบบสากลแทน ดังนั้น เพื่อที่จะไม่ส่งผลกระทบต่อฟังก์ชันการทำงานภายนอกไลบรารีนี้ เราต้องเลือกว่าจะรวมการเรียก imap_*
ทุกรอบกับการหมดเวลาที่ผู้ใช้กำหนดหรือไม่ก็ได้ หรือปล่อยให้งานนี้ตกเป็นหน้าที่ของผู้ใช้
เนื่องจากโลกที่ต่างกันของเซิร์ฟเวอร์ IMAP และภาระค่าใช้จ่ายที่ซับซ้อนสูงซึ่งได้รับผลประโยชน์เพียงเล็กน้อยจากแบบแรก เราจึงเลือกแบบหลัง
ความสามารถในการจำลองนั้นได้รับจากอินเทอร์เฟซที่มีอยู่สำหรับแต่ละ API เจาะลึก MockabilityTest เพื่อดูตัวอย่างเวิร์กโฟลว์จำลอง
จำเป็นต้องใช้นักเทียบท่าเพื่อรันบิลด์บนคอมพิวเตอร์ของคุณ
คำสั่งแรกที่คุณต้องรันคือ make start-imap-server
ซึ่งเริ่มเซิร์ฟเวอร์ IMAP ในเครื่อง
จากนั้น build ในระบบสามารถถูกทริกเกอร์ได้ด้วย make
เปล่าๆ
เมื่อคุณเสร็จสิ้นการพัฒนา ให้หยุดเซิร์ฟเวอร์ IMAP ในเครื่องด้วย make stop-imap-server