Longe anoncite - nun realaĵo : Microsoft malŝaltis aŭtentikigon per pasvorto por iuj protokoloj en Exchange Online ekde septembro 2022 favore al oAuth2. La GitHub-problemoj de multaj bibliotekoj kaj rezervaj skriptoj klarigas, ke la ŝanĝo surprizis multajn administrantojn. Malsupre ni montras manieron kiel vi povas daŭrigi aliri la enhavon de via Exchange-leterkesto helpe de oAuth2 per PHP per IMAP.
El sekureca vidpunkto, la movo de Mikrosofto estas tre ĝusta, sed la komplekseco de programa aliro al ĝiaj retpoŝtoj sufiĉe pliiĝis. Ekzemple, se vi uzas la vaste uzatan barbushin/php-imap-bibliotekon , aliro kutimis esti jena:
734a82898010e2fcb02c72c3cd9702c2
Ĝi jam ne plu estas tiel simpla. Establi konekton per OAuth2 nun postulas unue akiri la alirĵetonon. Tio necesigas superi du obstaklojn.
Azure Active Directory
La sekvaj paŝoj registras novan apon en Azure Active Directory:













PowerShell
Nun ni turnas la apon en la Microsoft PowerShell (Administra reĝimo) kaj asigni permesojn al la individuaj leterkestoj (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> devas esti anstataŭigita en ĉiu kazo):
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
...
Post tio, la resto estas facila. Ĉar barbushin/php-imap ne subtenas oAuth2, vi povas ekzemple establi konekton uzante la alternativan bibliotekon Webklex/php-imap (kiu ankaŭ havas la avantaĝon ne bezoni la PHP IMAP-modulon ).:
734a82898010e2fcb02c72c3cd9702c2
Sed bibliotekoj kiuj ne oficiale subtenas oAuth2 ankaŭ povas esti uzataj helpe de prokurilo kiel simonrob/email-oauth2-proxy fari ĝin realigebla. Post ĉi tio Elŝutu kaj la instalado per python -m pip install -r requirements-no-gui.txt (Python ≥3.6 bezonata) vi redaktas la dosieron emailproxy.config ekz. jene (anstataŭigante ĉi tiun fojon <TENANTID>, <CLIENTID>, <CLIENTSECRET> kaj <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>
Tiam vi komencas la prokurilon per python emailproxy.py --no-gui kaj nun povas iri al la IP neĉifrita localhost sur haveno 1993 konekti per regula Basic Auth (kaj ajna pasvorta aro). Se vi volas komenci la prokurilon kiel servon en la fono kiam vi ekfunkciigas la sistemon, vi povas uzi, ekzemple 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
Se necesas ĉifrita konekto, tio ankaŭ eblas - por tio vi unue kreas privatan ŝlosilon kaj memsubskribitan atestilon.:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
Tiam referenco estas farita en la emailproxy.config ĉi tiuj du dosieroj:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Retpoŝta sendado
Ĉiu, kiu volas sendi retpoŝtojn programece per Microsoft Exchange Online, ankaŭ alfrontas fundamentan ŝanĝon: Microsoft malŝaltis la klasikan uzantnomon kaj pasvorton por SMTP en Exchange Online. Kio dum jaroj estis atingita per nur kelkaj linioj de kodo nun postulas la kromvojon per OAuth2 - inkluzive de aplikaĵa registrado en Azure Active Directory, atestiloj kaj ĵetonadministrado. Ni povas efektivigi la saman aliron por sendi retpoŝtojn, krom ricevi ilin.




SMTP-sendo per Microsoft Exchange 365 sekvas la saman principon kiel IMAP-aliro: ankaŭ ĉi tie estas neniu maniero ĉirkaŭ oAuth2 ĉar Baza Aŭtentigo estis malŝaltita. Post aldoni la permeson "SMTP.SendAsApp" en la registriĝo de Azure-aplikaĵo kaj doni konsenton al administranto, sendado povas esti farita, ekzemple PHPMailer Ĉi tio estas efektivigita. Anstataŭ simple sendi uzantnomon kaj pasvorton kiel antaŭe, aŭtentigo kontraŭ la SMTP-servilo nun uzas alirĵetonon. smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
La aldona agorda peno komence povas ŝajni senkuraĝiga, sed longtempe ĝi rekompencas: OAuth2-bazita aŭtentikigo estas signife pli sekura, ĉar neniuj klartekstaj pasvortoj devas esti konservitaj en agordodosieroj aŭ skriptoj - kaj la alirĵetono ankaŭ povas esti templimigita kaj ĝiaj permesoj kontrolitaj kun detala precizeco. Ankaŭ menciindas ĉi tie la biblioteko mailhelper , kiu ofertas oportunan API-on por ricevi kaj sendi retpoŝtojn.