تم الإعلان عنه منذ فترة طويلة - الواقع الآن : لقد أوقفت Microsoft المصادقة بكلمة مرور لبعض البروتوكولات في Exchange Online من سبتمبر 2022 لصالح oAuth2. توضح مشكلات GitHub في العديد من المكتبات ونصوص النسخ الاحتياطي أن التغيير قد فاجأ العديد من المسؤولين. نعرض أدناه طريقة يمكنك من خلالها الاستمرار في الوصول إلى محتويات صندوق بريد Exchange الخاص بك بمساعدة oAuth2 عبر PHP عبر IMAP.
من وجهة نظر أمنية ، يعد تحرك Microsoft صحيحًا للغاية ، لكن تعقيد الوصول البرمجي إلى رسائل البريد الإلكتروني الخاصة بها قد زاد قليلاً. على سبيل المثال ، إذا كنت تستخدم مكتبة barbushin / php-imap المستخدمة على نطاق واسع ، فسيكون الوصول كما يلي:
734a82898010e2fcb02c72c3cd9702c2
انها فقط لا تعمل بعد الآن. من أجل إنشاء اتصال عبر oAuth2 ، تتمثل الصعوبة الأولى في الحصول على رمز الوصول. ولهذا عليك أن تواجه عقبتين.
دليل Azure النشط
تسجل الخطوات التالية تطبيقًا جديدًا في Azure Active Directory:













بوويرشيل
الآن ندير التطبيق في مايكروسوفت بوويرشيل (وضع المسؤول) وتعيين أذونات لصناديق البريد الفردية (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> يجب استبداله في كل حالة):
Install-Module -Name ExchangeOnlineManagement
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -Organization <TENANTID>
New-ServicePrincipal -AppId <CLIENTID> -ServiceId <OBJECTID>
Add-MailboxPermission -Identity "<EMAIL>" -User <OBJECTID> -AccessRights FullAccess
...
بمجرد القيام بذلك ، فإن الباقي ليس علم الصواريخ. نظرًا لأن barbushin / php-imap لا يدعمان oAuth2 ، يمكنك الاتصال بالمكتبة البديلة Webklex / php-imap (والتي تتمتع أيضًا بميزة عدم طلب وحدة PHP IMAP ).:
734a82898010e2fcb02c72c3cd9702c2
ومع ذلك ، يمكن أيضًا استخدام المكتبات التي لا تدعم oAuth2 رسميًا مع وكيل مثل simonrob / البريد الإلكتروني- oauth2- الوكيل اجعلها قابلة للتطبيق. بعد هذا تحميل والتثبيت عبر python -m pip install -r requirements-no-gui.txt (مطلوب Python ≥3.6) تقوم بتحرير الملف emailproxy.config على سبيل المثال على النحو التالي (استبدال هذه المرة <TENANTID>, <CLIENTID>, <CLIENTSECRET> و <EMAIL>):
[Server setup]
[IMAP-1993]
local_address = localhost
server_address = outlook.office365.com
server_port = 993
[Account setup]
[<EMAIL>]
token_url = https://login.microsoftonline.com/<TENANTID>/oauth2/v2.0/token
oauth2_scope = https://outlook.office365.com/.default
redirect_uri = http://localhost:8080
client_id = <CLIENTID>
client_secret = <CLIENTSECRET>
ثم تبدأ الوكيل بـ python emailproxy.py --no-gui ويمكن الآن الانتقال إلى IP غير المشفر localhost في الميناء 1993 الاتصال عبر المصادقة الأساسية العادية (وأي مجموعة كلمات مرور). إذا كنت ترغب في بدء تشغيل الوكيل كخدمة في الخلفية عند بدء تشغيل النظام ، فيمكنك استخدام ، على سبيل المثال systemd:
sudo systemctl edit --force --full emailproxy.service
[Unit]
Description=Email OAuth 2.0 Proxy
[Service]
ExecStart=/usr/bin/python /path/to/emailproxy.py --no-gui
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable emailproxy.service --now
sudo systemctl status emailproxy.service
sudo systemctl start emailproxy.service
إذا كان الاتصال المشفر مطلوبًا ، فهذا ممكن أيضًا - ولهذا عليك أولاً إنشاء مفتاح خاص وشهادة موقعة ذاتيًا:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
ثم يتم الإشارة في emailproxy.config هذين الملفين:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
إرسال البريد الإلكتروني
يواجه كل من يرغب في إرسال رسائل البريد الإلكتروني برمجيًا عبر Microsoft Exchange Online تغييرًا جذريًا: فقد عطّلت مايكروسوفت المصادقة التقليدية باستخدام اسم المستخدم وكلمة المرور لبروتوكول SMTP في Exchange Online. ما كان يُنجز ببضعة أسطر من التعليمات البرمجية لسنوات، يتطلب الآن استخدام OAuth2، بما في ذلك تسجيل التطبيق في Azure Active Directory، والشهادات، وإدارة الرموز المميزة. يمكننا تطبيق نفس الأسلوب لإرسال رسائل البريد الإلكتروني، بالإضافة إلى استقبالها.




يتبع إرسال SMTP عبر Microsoft Exchange 365 نفس مبدأ الوصول عبر IMAP: فبعد تعطيل المصادقة الأساسية، لم يعد هناك بديل لـ OAuth2. بعد إضافة إذن "SMTP.SendAsApp" في تسجيل تطبيق Azure ومنح موافقة المسؤول، يمكن إرسال الرسائل، على سبيل المثال، باستخدام... PHPMailer تم تطبيق هذا. بدلاً من مجرد إرسال اسم المستخدم وكلمة المرور كما كان من قبل، أصبح التحقق من الهوية على خادم SMTP يستخدم الآن رمز الوصول. smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
قد تبدو عملية الإعداد الإضافية شاقة في البداية، لكنها تُؤتي ثمارها على المدى البعيد: فالمصادقة القائمة على بروتوكول OAuth2 أكثر أمانًا بشكل ملحوظ، إذ لا حاجة لتخزين كلمات المرور كنص عادي في ملفات التكوين أو البرامج النصية، كما يُمكن تحديد مدة صلاحية رمز الوصول والتحكم في صلاحياته بدقة متناهية. وتجدر الإشارة أيضًا إلى مكتبة mailhelper التي توفر واجهة برمجة تطبيقات (API) سهلة الاستخدام لاستقبال وإرسال رسائل البريد الإلكتروني.