مكتبة 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 = 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) {continue; }// $mailbox هو مثيل لـ DdeboerImapMailboxprintf('صندوق البريد "%s" يحتوي على %s رسائل', $mailbox->getName(), $mailbox->count()); }
أو استرداد صندوق بريد محدد:
$mailbox = $connection->getMailbox('INBOX');
حذف صندوق بريد:
$connection->deleteMailbox($mailbox);
يمكنك تعيين أو مسح أي علامة لرسائل صندوق البريد بشكل مجمع (بواسطة UIDs):
$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('Sent');$mailbox->addMessage($messageMIME, 'Seen');
لاحظ أن الرسالة يجب أن تكون سلسلة بتنسيق MIME (كما هو موضح في RFC2045).
use DdeboerImapSearchExpression;use DdeboerImapSearchEmailTo;use 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, // معايير الفرز صحيحة // ترتيب تنازلي)؛
لاحظ أن مكتبة PHP imap تعتمد على مكتبة c-client
المتوفرة على https://www.washington.edu/imap/ والتي لا تدعم بشكل كامل بعض معايير البحث IMAP4 مثل OR
. إذا كنت تريد هذه المعايير غير المدعومة، فأنت بحاجة إلى تصحيح أحدث إصدار يدويًا ( imap-2007f
بتاريخ 23 يوليو 2011 في وقت هذا الالتزام) وإعادة ترجمة 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
احصل على رقم الرسالة ومعرف الرسالة الفريد في النموذج <...>:
$message->getNumber();$message->getId();
الحصول على خصائص الرسالة الأخرى:
$message->getSubject();$message->getFrom(); // messageEmailAddress$message->getTo(); // مصفوفة الرسالةEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
الحصول على رؤوس الرسائل ككائن DdeboerImapMessageHeaders:
$message->getHeaders();
الحصول على نص الرسالة بتنسيق HTML أو نص عادي (الجزء الأول فقط):
$message->getBodyHtml(); // محتوى جزء النص/html، إذا كان موجودًا$message->getBodyText(); // محتوى النص/الجزء العادي، إن وجد
الحصول على جسم كامل (جميع الأجزاء):
$body = $message->getCompleteBodyHtml(); // محتوى جزء النص/html، إذا كان موجودًا if ($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 على نفس واجهة برمجة التطبيقات مثل الرسالة العادية، بصرف النظر عن العلامات والعمليات مثل النسخ أو النقل أو الحذف.
يوفر ملحق IMAP وظيفة imap_timeout لضبط المهلة بالثواني لمختلف العمليات.
ومع ذلك، فإن تنفيذ الامتداد لا يربط الوظيفة بسياق أو اتصال محدد، بل هو عالمي. لذلك، لكي لا نؤثر على الوظائف خارج هذه المكتبة، كان علينا أن نختار ما إذا كان سيتم تغليف كل استدعاء imap_*
حول مهلة اختيارية يوفرها المستخدم أو ترك هذه المهمة للمستخدم.
ونظرًا للعالم غير المتجانس لخوادم IMAP وتكلفة العبء العالي التعقيد لمثل هذا المكسب البسيط من الأول، فقد اخترنا الأخير.
يتم منح القدرة على السخرية من خلال الواجهات الموجودة لكل واجهة برمجة تطبيقات. ابحث في MockabilityTest للحصول على مثال لسير العمل الذي تم الاستهزاء به.
هناك حاجة إلى Docker لتشغيل البناء على جهاز الكمبيوتر الخاص بك.
الأمر الأول الذي تحتاج إلى تشغيله هو make start-imap-server
، الذي يبدأ خادم IMAP محليًا.
ومن ثم يمكن تشغيل البناء المحلي باستخدام make
مجرد.
عند الانتهاء من التطوير، قم بإيقاف خادم IMAP المحلي باستخدام make stop-imap-server
.