ចូលប្រើជាមួយ PHP ទៅ Exchange/Office 365

បានប្រកាសជាយូរមកហើយ - ឥឡូវនេះការពិត ៖ ក្រុមហ៊ុន Microsoft បានបិទការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវដោយពាក្យសម្ងាត់សម្រាប់ពិធីការមួយចំនួននៅក្នុង Exchange Online ចាប់ពីខែកញ្ញា ឆ្នាំ 2022 ដើម្បីគាំទ្រ oAuth2 ។ បញ្ហា GitHub នៃ បណ្ណាល័យ និង ស្គ្រីបបម្រុងទុកជាច្រើន ធ្វើឱ្យវាច្បាស់ថាការផ្លាស់ប្តូរនេះបានធ្វើឱ្យអ្នកគ្រប់គ្រងជាច្រើនភ្ញាក់ផ្អើល។ ខាងក្រោមនេះ យើងបង្ហាញពីរបៀបដែលអ្នកអាចបន្តចូលប្រើមាតិកានៃប្រអប់សំបុត្រ Exchange របស់អ្នក ដោយមានជំនួយពី oAuth2 តាមរយៈ PHP តាមរយៈ IMAP ។


តាមទស្សនៈសុវត្ថិភាព ការផ្លាស់ប្តូររបស់ Microsoft គឺត្រឹមត្រូវណាស់ ប៉ុន្តែភាពស្មុគស្មាញនៃការចូលប្រើកម្មវិធីទៅកាន់អ៊ីមែលរបស់ខ្លួនបានកើនឡើងបន្តិច។ ឧទាហរណ៍ ប្រសិនបើអ្នកប្រើ បណ្ណាល័យ barbushin/php-imap ដែល បានប្រើយ៉ាងទូលំទូលាយ ការចូលប្រើមានដូចខាងក្រោម:

734a82898010e2fcb02c72c3cd9702c2

វាគ្រាន់តែមិនដំណើរការទៀតទេ។ ដើម្បីបង្កើតការតភ្ជាប់តាមរយៈ oAuth2 ការលំបាកដំបូងគឺដើម្បីទទួលបានសញ្ញាសម្ងាត់ចូលប្រើ។ ហើយសម្រាប់នេះអ្នកត្រូវទទួលយកឧបសគ្គពីរ។

Azure Active Directory

ជំហានខាងក្រោមចុះឈ្មោះកម្មវិធីថ្មីនៅក្នុង Azure Active Directory:

ចូលទៅ https://portal.azure.com
បើក "Azure Active Directory"
ជ្រើសរើស "ការចុះឈ្មោះកម្មវិធី" និង "ការចុះឈ្មោះថ្មី" ។
ចម្លង "លេខសម្គាល់កម្មវិធី (អតិថិជន)" (=លេខសម្គាល់អតិថិជន) និង "លេខសម្គាល់បញ្ជីឈ្មោះ (អ្នកជួល)" (=លេខសម្គាល់អ្នកជួល)។
"ការអនុញ្ញាត API" និង "បន្ថែមការអនុញ្ញាត"
"APIs ដែលប្រើដោយស្ថាប័នរបស់ខ្ញុំ" & "Office 365 Exchange Online"
"ការអនុញ្ញាតកម្មវិធី" និង "IMAP.AccessAsApp"
ផ្តល់ការយល់ព្រមពីអ្នកគ្រប់គ្រង
"វិញ្ញាបនបត្រ និងអាថ៌កំបាំង" និង "អាថ៌កំបាំងអតិថិជន" និង "អាថ៌កំបាំងអតិថិជនថ្មី"
ជ្រើសរើសការពិពណ៌នា និងកំណត់សុពលភាព
ចម្លង "លេខសម្គាល់សម្ងាត់" (សម្ងាត់អតិថិជន) ទៅក្ដារតម្បៀតខ្ទាស់
បើកកម្មវិធីសហគ្រាស
ចម្លង "លេខសម្គាល់វត្ថុ" ។

PowerShell

ឥឡូវនេះយើងបើកកម្មវិធីនៅក្នុង Microsoft PowerShell (របៀបអ្នកគ្រប់គ្រង) និងផ្តល់ការអនុញ្ញាតទៅប្រអប់សំបុត្រនីមួយៗ (<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/email-oauth2-proxy ធ្វើឱ្យវាអាចដំណើរការបាន។ បន្ទាប់ពី​នេះ ទាញយក និងការដំឡើងតាមរយៈ 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 ភ្ជាប់តាមរយៈ Basic Auth ធម្មតា (និងការកំណត់ពាក្យសម្ងាត់ណាមួយ)។ ប្រសិនបើអ្នកចង់ចាប់ផ្តើមប្រូកស៊ីជាសេវាកម្មក្នុងផ្ទៃខាងក្រោយ នៅពេលអ្នកចាប់ផ្តើមប្រព័ន្ធ អ្នកអាចប្រើឧទាហរណ៍ ប្រព័ន្ធ:

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 ក៏កំពុងប្រឈមមុខនឹងការផ្លាស់ប្តូរជាមូលដ្ឋានផងដែរ៖ Microsoft បានបិទការផ្ទៀងផ្ទាត់ឈ្មោះអ្នកប្រើប្រាស់ និងពាក្យសម្ងាត់បុរាណសម្រាប់ SMTP នៅក្នុង Exchange Online។ អ្វីដែលសម្រេចបានដោយគ្រាន់តែសរសេរកូដពីរបីបន្ទាត់អស់រយៈពេលជាច្រើនឆ្នាំ ឥឡូវនេះតម្រូវឱ្យមានការបង្វែរតាមរយៈ OAuth2 - រួមទាំងការចុះឈ្មោះកម្មវិធីនៅក្នុង Azure Active Directory វិញ្ញាបនបត្រ និងការគ្រប់គ្រងសញ្ញាសម្ងាត់។ យើងអាចអនុវត្តវិធីសាស្រ្តដូចគ្នាសម្រាប់ការផ្ញើអ៊ីមែល បន្ថែមពីលើការទទួលអ៊ីមែល។

"ការអនុញ្ញាត API" និង "បន្ថែមការអនុញ្ញាត"
"APIs ដែលប្រើដោយស្ថាប័នរបស់ខ្ញុំ" & "Office 365 Exchange Online"
"ការអនុញ្ញាតកម្មវិធី" និង "SMTP.SendAsApp"
ផ្តល់ការយល់ព្រមពីអ្នកគ្រប់គ្រង

ការផ្ញើ SMTP តាមរយៈ Microsoft Exchange 365 អនុវត្តតាមគោលការណ៍ដូចគ្នានឹងការចូលប្រើ IMAP៖ ចាប់តាំងពីការបិទការផ្ទៀងផ្ទាត់មូលដ្ឋានមក គ្មានជម្រើសផ្សេងក្រៅពី OAuth2 ទេ។ បន្ទាប់ពីបន្ថែមការអនុញ្ញាត "SMTP.SendAsApp" នៅក្នុងការចុះឈ្មោះកម្មវិធី Azure និងផ្តល់ការយល់ព្រមពីអ្នកគ្រប់គ្រង ការផ្ញើអាចធ្វើបាន ឧទាហរណ៍ ជាមួយ... PHPMailer នេះត្រូវបានអនុវត្ត។ ជំនួស​ឲ្យ​ការ​ដាក់​ស្នើ​ឈ្មោះ​អ្នក​ប្រើ និង​ពាក្យ​សម្ងាត់​ដូច​មុន ការ​ផ្ទៀងផ្ទាត់​ភាព​ត្រឹមត្រូវ​ប្រឆាំង​នឹង​ម៉ាស៊ីន​បម្រើ SMTP ឥឡូវ​ប្រើ​សញ្ញា​សម្ងាត់​ចូល​ដំណើរការ។ smtp.office365.com:

734a82898010e2fcb02c72c3cd9702c2

ការខិតខំប្រឹងប្រែងដំឡើងបន្ថែមដំបូងឡើយអាចហាក់ដូចជាគួរឱ្យខ្លាច ប៉ុន្តែវានឹងផ្តល់ផលល្អនៅទីបំផុត៖ ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវដោយផ្អែកលើ OAuth2 មានសុវត្ថិភាពជាងគួរឱ្យកត់សម្គាល់ ព្រោះមិនចាំបាច់រក្សាទុកពាក្យសម្ងាត់អត្ថបទធម្មតានៅក្នុងឯកសារកំណត់រចនាសម្ព័ន្ធ ឬស្គ្រីបទេ - ហើយសញ្ញាសម្ងាត់ចូលប្រើក៏អាចមានកំណត់ពេលវេលាផងដែរ ហើយការអនុញ្ញាតរបស់វាត្រូវបានគ្រប់គ្រងដោយភាពជាក់លាក់។ អ្វីដែលគួរនិយាយនៅទីនេះគឺបណ្ណាល័យ mailhelper ដែលផ្តល់ជូននូវ API ងាយស្រួលសម្រាប់ទទួល និងផ្ញើអ៊ីមែល។

ថយក្រោយ