الاتصال إلى صندوق البريد (mailbox)
للقيام بأي فعل مع حساب IMAP (Internet Message Access Protocol) تحتاج للاتصال به أولًا، ولتتصل تحتاج لتحديد بعض المعاملات المطلوبة:
- اسم الخادم أو عنوان IP لخادم البريد (mail server).
-
المنفذ الذي تريد الاتصال به:
- منفذ IMAP هو 143 أو993 (آمن).
- منفذ POP (Post Office Protocol) هو 110 أو995 (آمن).
- منفذ SMTP (Simple Mail Transfer Protocol) هو 25 أو465 (آمن).
- منفذ NNTP (Network News Transfer Protocol) هو 119 أو563 (آمن).
- رايات الاتصال: موضحة في الجدول التالي:
الراية | الوصف | الخيارات | القيمة الافتراضية |
---|---|---|---|
/service=service | الخدمة التي نريد استخدامها | imap,pop3,nntp, smtp | imap |
/user=user | اسم المستخدم البعيد لتسجيل الدخول على الخادم | ||
/authuser=user | مستخدم المصادقة عن بعد، إذا حُدِّد فهذا هو اسم المستخدم الذي تُستخدم كلمة المرور الخاصة به | ||
/anonymous | الوصول البعيد كمستخدم غريب | ||
/debug | تسجيل بروتوكول القياس عن بعد في سجل أخطاء التطبيق | disabled | |
/secure | لا ترسل كلمة المرور كنص عادي عبر الشبكة | ||
/norsh | لا تستخدم rsh أو ssh لتأسيس جلسة IMAP مسبقة الوثوقية | ||
/ssl | استخدم طبقة المقبس الآمنة لتشفير الجلسة | ||
/validate-cert | ترخيص من خادم TLS/SSL | enabled | |
/novalidate-cert | لا تتحقق من شهادات الخادم TLS/SSL، نحتاجها إذا كان الخادم يستخدم شهادات ذاتية التوقيع، استخدم هذه الراية بحذر | disabled | |
/tls | فرض استخدام طريقة start-TLS لتشفير الجلسة ورفض الاتصال بالخوادم التي لا تدعمها | ||
/notls | لا تستخدم طريقة start-TLS لتشفير الجلسة حتى لو كانت الخوادم تدعمها | ||
/readonly | طلب فتح صندوق البريد للقراءة فقط (في IMAP فقط، يتم تجاهلها مع NNTP ويعطي خطأ مع SMTP وPOP3) |
ستبدو سلسلة الاتصال بالشكل التالي:
{imap.example.com:993/imap/tls/secure}
لاحظ أنّه إذا كان أي محرف في سلسة الاتصال غير مرمّز بالترميز ASCII فيجب ترميزه باستخدام utf7_encode($string).
نستخدم الأمر imap open للاتصال إلى صندوق البريد، يعيد هذا الأمر قيمة مورد تشير إلى مجرى:
<?php $mailbox = imap_open("{imap.example.com:993/imap/tls/secure}", "username", "password"); if ($mailbox === false) { echo "Failed to connect to server"; }
تحميل الإضافة IMAP
نحتاج لتثبيت الإضافة IMAP حتى نتمكن من استخدام دوال IMAP في PHP.
التثبيت في نظام ديبيان/أبونتو مع PHP5
sudo apt-get install php5-imap sudo php5enmod imap
التثبيت في نظام ديبيان/أبونتو مع PHP5
sudo apt-get install php7.0-imap
التثبيت في التوزيعات المعتمدة على YUM
sudo yum install php-imap
التثبيت في إصدارات نظام التشغيل ماك مع php5.6
brew reinstall php56 --with-imap
إنشاء قائمة بكل مجلدات صندوق البريد
عندما تتصل بصندوق البريد الخاص بك، سترغب في إلقاء نظرة بداخله، الأمر الأول المفيد في هذه الحالة هو imap list، المعامل الأول هو المورد الذي حصلت عليه من imap_open
والثاني هو صندوق البريد الخاص بك والثالث سلسلة بحث غامضة (نستخدم * لمطابقة أي نمط).
$folders = imap_list($mailbox, "{imap.example.com:993/imap/tls/secure}", "*"); if ($folders === false) { echo "Failed to list folders in mailbox"; } else { print_r($folders); }
يجب أن يكون الخرج مشابهًا للتالي:
Array ( [0] => {imap.example.com:993/imap/tls/secure}INBOX [1] => {imap.example.com:993/imap/tls/secure}INBOX.Sent [2] => {imap.example.com:993/imap/tls/secure}INBOX.Drafts [3] => {imap.example.com:993/imap/tls/secure}INBOX.Junk [4] => {imap.example.com:993/imap/tls/secure}INBOX.Trash )
يمكننا استخدام المعامل الثالث لترشيح هذه النتائج بالشكل التالي:
$folders = imap_list($mailbox, "{imap.example.com:993/imap/tls/secure}", "*.Sent");
عندها ستحتوي النتيجة على المداخل التي فيها السلسلة النصية .Sent
في الاسم:
Array ( [0] => {imap.example.com:993/imap/tls/secure}INBOX.Sent )
ملاحظة: سيعيد استخدام * للبحث الغامض كل التطابقات بشكلٍ متكرر، ويعيد استخدام % التطابقات في المجلد الحالي المحدد فقط.
البحث عن الرسائل في صندوق البريد
يمكنك أن تستخدم imap_headers لتحصل على قائمة بكل الرسائل الموجودة في صندوق البريد.
<?php $headers = imap_headers($mailbox);
تكون النتيجة مصفوفة من السلاسل النصية بالنمط التالي:
[FLAG] [MESSAGE-ID])[DD-MM-YYY] [FROM ADDRESS] [SUBJECT TRUNCATED TO 25 CHAR] ([SIZE] chars)
إليك عينة عن الشكل الذي سيبدو عليه كل سطر:
A 1)19-Aug-2016 someone@example.com Message Subject (1728 chars) D 2)19-Aug-2016 someone@example.com RE: Message Subject (22840 chars) U 3)19-Aug-2016 someone@example.com RE: RE: Message Subject (1876 chars) N 4)19-Aug-2016 someone@example.com RE: RE: RE: Message Subje (1741 chars)
الرمز | الراية | المعنى |
---|---|---|
A | Answered | تم الرد على هذه الرسالة |
D | Deleted | حُذفت الرسالة (ولم تُزال نهائيًا) |
F | Flagged | مُيِّزت هذه الرسالة للفت الانتباه |
N | New | الرسالة جديدة ولم تُقرأ بعد |
R | Recent | الرسالة جديدة ومقروءة |
U | Unread | الرسالة لم تُقرأ بعد |
X | Draft | الرسالة مسودة |
لاحظ أنّ هذا الاستدعاء سيأخذ بعض الوقت ليُنفَّذ وقد يعيد قائمة طويلة جدًا، الخيار البديل هو تحميل الرسائل بشكلٍ منفصل وفقًا للحاجة، يُسند معرِّف لكل بريد إلكتروني من الرقم 1 (الأقدم) وحتى قيمة imap_num_msg($mailbox).
يوجد عدة دوال للوصول إلى بريد إلكتروني مباشرةً، لكن أبسط طريقة هي استخدام الدالة imap_header التي تُرجع معلومات ترويسة مهيكلة:
<?php $header = imap_headerinfo($mailbox , 1); stdClass Object ( [date] => Wed, 19 Oct 2011 17:34:52 +0000 [subject] => Message Subject [message_id] => <04b80ceedac8e74$51a8d50dd$0206600a@user1687763490> [references] => <ec129beef8a113c941ad68bdaae9@example.com> [toaddress] => Some One Else <someoneelse@example.com> [to] => Array ( [0] => stdClass Object ( [personal] => Some One Else [mailbox] => someonelse [host] => example.com ) ) [fromaddress] => Some One <someone@example.com> [from] => Array ( [0] => stdClass Object ( [personal] => Some One [mailbox] => someone [host] => example.com ) ) [reply_toaddress] => Some One <someone@example.com> [reply_to] => Array ( [0] => stdClass Object ( [personal] => Some One [mailbox] => someone [host] => example.com ) ) [senderaddress] => Some One <someone@example.com> [sender] => Array ( [0] => stdClass Object ( [personal] => Some One [mailbox] => someone [host] => example.com ) ) [Recent] => [Unseen] => [Flagged] => [Answered] => [Deleted] => [Draft] => [Msgno] => 1 [MailDate] => 19-Oct-2011 17:34:48 +0000 [Size] => 1728 [udate] => 1319038488 )
ترجمة -وبتصرف- للفصول [IMAP] من كتاب PHP Notes for Professionals book
اقرأ أيضًا
- المقال التالي: التعامل مع واجهة سطر الأوامر (CLI) في PHP
- المقال السابق: كيفية إرسال بريد إلكتروني في PHP
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.