اذهب إلى المحتوى

ملاحظات حول استعمال بروتوكول IMAP في PHP


سارة محمد2

الاتصال إلى صندوق البريد (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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...