39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Send email via Microsoft Graph API. Usage: python3 graph_send.py <json_file>"""
|
|
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)
|