PHP менен Exchange/Office 365ке кирүү

Көптөн бери жарыяланган - азыр чындык : Microsoft 2022-жылдын сентябрынан тартып oAuth2 пайдасына Exchange Online'дагы айрым протоколдор үчүн сырсөз менен аутентификацияны өчүрдү. Көптөгөн китепканалардын жана резервдик скрипттердин GitHub маселелери, өзгөртүү көптөгөн администраторлорду таң калтырганын ачык көрсөтүп турат. Төмөндө биз IMAP аркылуу PHP аркылуу oAuth2 жардамы менен Exchange почта ящигиңиздин мазмунуна кантип жетүүнү улантсаңыз болорун көрсөтөбүз.


Коопсуздук көз карашынан алганда, Microsoftтун кадамы абдан туура, бирок анын электрондук почталарына программалык кирүүнүн татаалдыгы бир аз көбөйдү. Мисалы, эгер сиз кеңири колдонулган barbushin/php-imap китепканасын колдонсоңуз , кирүү төмөнкүдөй болгон.:

734a82898010e2fcb02c72c3cd9702c2

Бул мындан ары анчалык жөнөкөй эмес. OAuth2 аркылуу байланыш түзүү үчүн эми алгач кирүү токенин алуу керек. Бул эки тоскоолдукту жеңүүнү талап кылат.

Azure Active Directory

Төмөнкү кадамдар Azure Active Directoryде жаңы колдонмону каттайт:

https://portal.azure.com кирүү
"Azure Active Directory" ачуу
"Колдонмону каттоо" жана "Жаңы каттоо" тандаңыз.
"Колдонмонун идентификатору (кардар)" (=Кардардын ID) жана "Каталог ID (Ижарачы)" (=Ижарачы ID) көчүрүңүз.
"API уруксаттары" & "Уруксат кошуу"
"Менин уюмум колдонгон API'лер" & "Office 365 Exchange Online"
"Колдонмого уруксаттар" жана "IMAP.AccessAsApp"
Администратордун макулдугун бериңиз
"Сертификаттар жана сырлар" & "Кардар сырлары" & "Жаңы кардар сыры"
Сүрөттөмөнү тандап, жарактуулугун белгилеңиз
Алмашуу буферине "Secret ID" (Кардардын сыры) көчүрүңүз
Ачык ишкана колдонмолору
"Объект ID" көчүрүү.

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-прокси аны ишке жарамдуу кылуу. Ушундан кийин Жүктөп алуу жана орнотуу аркылуу 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 аркылуу туташуу (жана кандайдыр бир сырсөз коюлган). Эгер сиз тутумду иштеткениңизде проксиди фондо кызмат катары баштоону кааласаңыз, мисалы, колдоно аласыз 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 аркылуу электрондук каттарды программалык түрдө жөнөткүсү келгендер дагы түп-тамырынан бери өзгөрүүгө туш болууда: Microsoft Exchange Online'да SMTP үчүн классикалык колдонуучу атын жана сырсөздү аутентификациялоону өчүрүп койду. Бир нече жылдан бери бир нече сап код менен аткарылып келген нерсе эми OAuth2 аркылуу айланып өтүүнү талап кылат – анын ичинде Azure Active Directory'де тиркемелерди каттоо, сертификаттар жана токендерди башкаруу. Биз электрондук каттарды алуудан тышкары, аларды жөнөтүү үчүн да ушундай эле ыкманы колдоно алабыз.

"API уруксаттары" & "Уруксат кошуу"
"Менин уюмум колдонгон API'лер" & "Office 365 Exchange Online"
"Колдонмонун уруксаттары" жана "SMTP.SendAsApp"
Администратордун макулдугун бериңиз

Microsoft Exchange 365 аркылуу SMTP жөнөтүү IMAP мүмкүндүк алуу принцибине ылайык келет: бул жерде да Негизги аутентификация өчүрүлгөндөн бери oAuth2ден айланып өтүүгө эч кандай жол жок. Azure тиркемесинде "SMTP.SendAsApp" уруксатын кошуп, администратордун макулдугун бергенден кийин, мисалы, жөнөтүүгө болот PHPMailer Бул ишке ашырылды. Мурдагыдай жөн гана колдонуучу атын жана сырсөздү жөнөтүүнүн ордуна, SMTP серверине каршы аутентификация эми кирүү токенин колдонот. smtp.office365.com:

734a82898010e2fcb02c72c3cd9702c2

Кошумча орнотуу аракети башында коркунучтуу көрүнүшү мүмкүн, бирок узак мөөнөттүү келечекте ал өзүн актайт: OAuth2 негизиндеги аутентификация бир топ коопсуз, анткени конфигурация файлдарында же скрипттерде ачык текст сырсөздөрүн сактоонун кажети жок – жана кирүү токенин убакыт менен чектеп, анын уруксаттарын майда-чүйдөсүнө чейин тактык менен башкарууга болот. Ошондой эле, электрондук каттарды алуу жана жөнөтүү үчүн ыңгайлуу API сунуштаган mailhelper китепканасын белгилеп кетүү керек.

Артка