用微软365邮箱收发邮件【azure-应用注册】

embedded/2024/12/29 4:15:35/

前置条件:

- 有一个365邮箱,配置好许可证

- 在azure portal里有Microsoft Entra ID ,注册相关应用时graph API赋权

- 应用的应用程序(客户端) ID,目录(租户) ID,客户端的密码,邮箱的id,名称

1.收件:

import os
import json
import requests
from .auth2 import get_access_tokendef load_token_from_file():TOKEN_FILE = 'token_cache.json'if os.path.exists(TOKEN_FILE):with open(TOKEN_FILE, 'r') as f:data = json.load(f)return data.get('access_token', None)return Nonedef fetch_unread_emails():try:access_token = get_access_token()if not access_token:print('无法加载访问令牌。')returnheaders = {'Authorization': f'Bearer {access_token}','Content-Type': 'application/json'}user_id = '-------'url = f'https://graph.microsoft.com/v1.0/users/{user_id}/mailfolders/inbox/messages?$filter=isRead eq false'response = requests.get(url, headers=headers)print(f"Response Status Code: {response.status_code}")print(f"Response Content: {response.content}")if response.status_code != 200:print(f"Error fetching emails: {response.content}")return
###代码仅为示例,如想了解更多收发邮件功能,实现赋能gpt的自动收发,处理,function calling,add wx: MTMwMTE4MjY1OTI= (base64)emails = response.json().get('value', [])for email in emails:print(f"Email ID: {email['id']}")print(f"From: {email['from']['emailAddress']['address']}")print(f"Subject: {email['subject']}")print(f"Content: {email['body']['content']}")print(f"Received Time: {email['receivedDateTime']}")print("-" * 40)except Exception as ex:print("Error fetching unread emails: ", ex)# Test fetching unread emails
if __name__ == "__main__":fetch_unread_emails()

2.发件:

from flask import Flask, request, jsonify
import requests
import base64
import msal
import osapp = Flask(__name__)# Configuration variables
CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'
TENANT_ID = 'your_tenant_id'
SCOPES = ['https://graph.microsoft.com/.default']
CACHE_FILE = 'token_cache.bin'
URL = 'https://graph.microsoft.com/v1.0/me/sendMail'def load_cache():cache = msal.SerializableTokenCache()if os.path.exists(CACHE_FILE):cache.deserialize(open(CACHE_FILE, "r").read())return cachedef save_cache(cache):if cache.has_state_changed:with open(CACHE_FILE, "w") as f:f.write(cache.serialize())def get_access_token():cache = load_cache()app = msal.ConfidentialClientApplication(CLIENT_ID,authority=f"https://login.microsoftonline.com/{TENANT_ID}",client_credential=CLIENT_SECRET,token_cache=cache)result = app.acquire_token_silent(SCOPES, account=None)if not result:result = app.acquire_token_for_client(scopes=SCOPES)if "access_token" in result:save_cache(cache)return result['access_token']else:raise ValueError(f"Failed to obtain access token: {result.get('error_description')}")def create_attachment(file_path, content_id):with open(file_path, "rb") as f:content_bytes = base64.b64encode(f.read()).decode('utf-8')return {"@odata.type": "#microsoft.graph.fileAttachment","name": os.path.basename(file_path),"contentBytes": content_bytes,"contentId": content_id}@app.route('/send-email', methods=['POST'])
def send_email_api():data = request.jsontry:token = get_access_token()sender_email = data['sender']recipients_emails = data['recipients']subject = data['subject']body = data['body']attachments = [create_attachment(file_path, content_id) for file_path, content_id in data.get('attachments', [])]email_data = {"message": {"subject": subject,"body": {"contentType": "HTML","content": body},"toRecipients": [{"emailAddress": {"address": recipient}} for recipient in recipients_emails],"from": {"emailAddress": {"address": sender_email}},"attachments": attachments}}headers = {"Authorization": f"Bearer {token}","Content-Type": "application/json"}response = requests.post(URL, headers=headers, json=email_data)if response.status_code == 202:return jsonify({"message": "Email sent successfully"}), 200else:return jsonify({"error": f"Failed to send email: {response.status_code}"}), 500except Exception as e:return jsonify({"error": str(e)}), 500if __name__ == "__main__":app.run(debug=True, port=5000)


 


http://www.ppmy.cn/embedded/149265.html

相关文章

Django 模型管理器中自定义方法和添加导出功能

在 Django 中,模型管理器提供了一种扩展模型行为的方式。您可以重写或添加自定义方法,以满足特定的业务需求。在本文中,我们将探讨如何在模型管理器中自定义方法,并提供一些常见的用例。此外,我们还将介绍如何在管理员界面中添加导出数据为 CSV 文件的功能。 什么是模型管理器…

基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码

一、麋鹿群优化算法EHO 基本概念 麋鹿群优化算法(EHO,Elephant Herding Optimization)是2024年提出的一种启发式优化算法,它的灵感来自麋鹿群的繁殖过程。麋鹿有两个主要的繁殖季节:发情和产犊。在发情季节&#xff0…

Linux零基础速成篇一(理论+实操)

前言:本教程适合Linux零基础学习,也适合Linux期末考试的小伙伴,从头到尾理论与实操相结合,让你快速对Linux进行了解和掌握。 一、Linux概述 为什么要学习Linux操作系统? 完全免费-开源 任何用户均可下载使用 安全…

Python 自动化 打开网站 填表登陆 例子

图样 简价: 简要说明这个程序的功能: 1. **基本功能**: - 自动打开网站 - 自动填写登录信息(号、公司名称、密码) - 显示半透明状态窗口实时提示操作进度 2. **操作流程**: - 打开网站后自动…

云原生周刊:利用 eBPF 增强 K8s

开源项目推荐 Slurm-operator Slurm-operator 是一个高效可扩展的框架,用于在 K8s 环境中部署和运行 Slurm 工作负载。 它结合了 Slurm 的可靠性和 Kubernetes 的灵活性,支持快速部署 Slurm 集群、动态扩展 HPC 工作负载,并提供高度灵活的定…

微服务——服务通信与接口设计

1、微服务之间常见的通信方式有哪些?请对比它们的优缺点。 通信方式优点缺点RESTful API技术栈无关,兼容性强易于调试,适合跨平台调用性能较低(基于 HTTP),延迟较大数据传输量较大RPC高性能,低…

Java的垃圾回收机制介绍、工作原理、算法及分析调优

Java的垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)提供的一种自动内存管理机制,用于自动回收不再使用的内存空间,以避免内存泄露和内存溢出等问题。下面主要介绍Java垃圾回收的基本概念、…

王佩丰24节Excel学习笔记——第十九讲:Indirect函数

【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 如果indirect引用出错,首先检查一下引用位置的双引号有没有出错,再检查引用值的位置是否出错,如果是双引号出错,可以使用英文状态下输入…