python - 如何使用基于 Web 应用程序的身份验证在 Python Django 中使用 M

我不熟悉使用 Microsoft Graph API 进行 Office 365 集成。我已经阅读了 https://github.com/O365/python-o365 的官方文档,并且能够使用控制台内容实现邮件发送和邮件读取。

代码如下:

from O365 import Account

credentials = ('5ed870b6-efee-41bb-83cf-1234567890', '6a~4o-F_2~z__n97iaNAG7f7r_1234567890')
account = Account(credentials)
if account.authenticate(scopes=['basic', 'message_all']):
   print('Authenticated!')

在这里它要求复制和粘贴完成,然后我可以

def readMail(convId, account):
    mailbox = account.mailbox()
    test_mailbox = mailbox.get_folder(folder_name="Inbox")
    query = mailbox.new_query().on_attribute('conversation_id').equals(convId)
    listOfMails = []
    for message in test_mailbox.get_messages(limit=100, query=query, batch=20):
        mail_time = message.received
        # print(mail_time)
        mail_ID = message.internet_message_id
        mail_sender = message.sender
        mail_cc = message.cc
        mail_subject = message.subject
        mail_content = message.get_body_text()
        mail_dict = {'mail_time': mail_time, 'mail_ID': mail_ID, 'mail_sender': mail_sender, 'mail_cc': mail_cc,
                     'mail_subject': mail_subject, 'mail_content': mail_content}
        listOfMails.append(mail_dict)
    lastMail = listOfMails[len(listOfMails) - 1]
    # print(len(listOfMails))
    return lastMail

convId = 'AAQkAGFiYTcwOWM1LTgwNWQtNDk0Ny1hY2I0LWRjNTM2NTVjMmFhMgAQAO_HWbiF8xtLtpSPxMKOGtA='
lastMail = readMail(convId, account)

print(lastMail)


def sendMail(lastMail, account):
    mail_id = lastMail.get('mail_ID')
    mailbox = account.mailbox()
    test_mailbox = mailbox.get_folder(folder_name="Inbox")
    query = mailbox.new_query().on_attribute('internet_message_id').contains(mail_id)  # see Query object in Utils
    for message in test_mailbox.get_messages(1, query=query):
        # print("dsdsdf")
        print(message.get_body_text())
        message.mark_as_read()
        reply_msg = message.reply()
        reply_msg.body = 'Sorry Its just a Test Mail !'
        reply_msg.attachments.add('C:/Users/geetanjali.sharma/Pictures/Screenshots/Sabbatical_Fail/Screenshot (16).png')
        reply_msg.send()

sendMail(lastMail, account)

但是当我尝试使用基于 Web 应用程序的身份验证界面做同样的事情时。

我的代码:

from O365 import Account,FileSystemTokenBackend
import os
credentials = ('7c00f426-2ac5-486f-a137-1234567890', 'cOtN3a4_e.dv0WNF0.qN.xx5wgF42Tu.10.')

token_backend = FileSystemTokenBackend(token_path=os.getcwd()+'/token_folder/', token_filename='my_token.txt')
account = Account(credentials, auth_flow_type='credentials', tenant_id='3d4f5678b727a530-a0d5-4fb8-bd40-d8f9763e97db',token_backend=token_backend)
if account.authenticate():
   print('Authenticated!')
   m = account.new_message()
   m.to.add('someone@someone.com')
   m.subject = 'Testing!'
   m.body = "George Best quote: I've stopped drinking, but only while I'm asleep."
   m.send()

我得到错误

Authenticated!
Client Error: 400 Client Error: Bad Request for url: https://graph.microsoft.com/v1.0/sendMail | Error Message: Resource not found for the segment 'sendMail'.
Traceback (most recent call last):
  File "/home/ntl/Documents/projects/dataIngestionApp/dataingestionBackend/dataIngestionML/send_mail.py", line 13, in <module>
    m.send()
  File "/home/ntl/anaconda3/envs/dataai/lib/python3.7/site-packages/O365/message.py", line 694, in send
    response = self.con.post(url, data=data)
  File "/home/ntl/anaconda3/envs/dataai/lib/python3.7/site-packages/O365/connection.py", line 811, in post
    return self.oauth_request(url, 'post', data=data, **kwargs)
  File "/home/ntl/anaconda3/envs/dataai/lib/python3.7/site-packages/O365/connection.py", line 789, in oauth_request
    return self._internal_request(self.session, url, method, **kwargs)
  File "/home/ntl/anaconda3/envs/dataai/lib/python3.7/site-packages/O365/connection.py", line 751, in _internal_request
    raise HTTPError('{} | Error Message: {}'.format(e.args[0], error_message), response=response) from None
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://graph.microsoft.com/v1.0/sendMail | Error Message: Resource not found for the segment 'sendMail'.

Process finished with exit code 1

还在 Azure 中添加我的应用权限

最佳答案

您需要为消息设置资源。

account = Account(credentials, auth_flow_type='credentials', tenant_id=tenant_id)
m = account.mailbox(resource='{the email address of sender}')

关于python - 如何使用基于 Web 应用程序的身份验证在 Python Django 中使用 Microsoft graph api (python-o365) 发送和读取邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62320602/

相关文章:

python - Pandas 仅与列中的非空值合并并保留具有空值的值

angular - 单元测试 FormGroup 无法读取未定义的 Prop 值

node.js - sqlite3 安装在 node 和 macos 上报错

amazon-web-services - 亚马逊电子病历 : do i need core nod

python - 如何在 jupyterlab 中更改内核的 Logo 图像

r - 在 R::multipanelfigure 中设置面板标签大小

image - 来自 Markdown 元数据或 frontmatter 的 NextJs 图像

r - unnest_longer 给出美元符号而不是正常的 tibble

laravel-5 - 解决facade root has not been set

sql - hive 中的 with (nolock) 相当于 sql (nolock)