#!/usr/bin/env python3 """Send email via Microsoft Graph API. Usage: python3 graph_send.py """ import sys,json,urllib.request,urllib.parse,ssl,random ctx=ssl.create_default_context() TENANT="1aca01da-111e-4610-8b2d-5c46bb01dc09" APP_ID="f57ec0b4-dee2-40a7-b557-bdcb725612d6" APP_SECRET="GGi8Q~EQvN2tSIzX4q2GrvyOWqDgfuHajE62abz5" SENDERS=["globaladmin@mbman.onmicrosoft.com","globaladmin2@mbman.onmicrosoft.com","adminoffice@mbman.onmicrosoft.com"] with open(sys.argv[1]) as f: d=json.load(f) to=d["to"];subj=d["subject"];html=d["body"] sender=random.choice(SENDERS) # Get token data=urllib.parse.urlencode({"grant_type":"client_credentials","client_id":APP_ID,"client_secret":APP_SECRET,"scope":"https://graph.microsoft.com/.default"}).encode() req=urllib.request.Request(f"https://login.microsoftonline.com/{TENANT}/oauth2/v2.0/token",data) try: resp=json.loads(urllib.request.urlopen(req,timeout=10,context=ctx).read()) token=resp.get("access_token","") if not token:print(f"FAIL:no_token");sys.exit(1) except Exception as e: print(f"FAIL:token:{e}");sys.exit(1) # Send payload=json.dumps({"message":{"subject":subj,"body":{"contentType":"HTML","content":html},"toRecipients":[{"emailAddress":{"address":to}}]},"saveToSentItems":False}).encode() req2=urllib.request.Request(f"https://graph.microsoft.com/v1.0/users/{sender}/sendMail",payload,{"Authorization":f"Bearer {token}","Content-Type":"application/json"}) try: urllib.request.urlopen(req2,timeout=10,context=ctx) print(f"OK:{sender}") except urllib.error.HTTPError as e: body=e.read().decode()[:80] print(f"FAIL:{e.code}:{body}");sys.exit(1) except Exception as e: print(f"FAIL:{e}");sys.exit(1)