ចូលប្រើជាមួយ 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 ងាយស្រួលសម្រាប់ទទួល និងផ្ញើអ៊ីមែល។

ថយក្រោយ