在python中使用outlook rest api发送邮件时出错
我正在使用下面的代码在python中使用outlook rest api发送邮件。在python中使用outlook rest api发送邮件时出错
outlookservice.py
import requests
import uuid
import json
outlook_api_endpoint = 'https://outlook.office.com/api/v2.0{0}'
# Generic API Sending
def make_api_call(method, url, token, user_email, payload = None, parameters = None):
# Send these headers with all API calls
headers = { 'User-Agent' : 'python_tutorial/1.0',
'Authorization' : 'Bearer {0}'.format(token),
'Accept' : 'application/json',
'X-AnchorMailbox' : user_email }
# Use these headers to instrument calls. Makes it easier
# to correlate requests and responses in case of problems
# and is a recommended best practice.
request_id = str(uuid.uuid4())
instrumentation = { 'client-request-id' : request_id,
'return-client-request-id' : 'true' }
headers.update(instrumentation)
response = None
if (method.upper() == 'GET'):
response = requests.get(url, headers = headers, params = parameters)
elif (method.upper() == 'DELETE'):
response = requests.delete(url, headers = headers, params = parameters)
elif (method.upper() == 'PATCH'):
headers.update({ 'Content-Type' : 'application/json' })
response = requests.patch(url, headers = headers, data = json.dumps(payload), params = parameters)
elif (method.upper() == 'POST'):
headers.update({ 'Content-Type' : 'application/json' })
response = requests.post(url, headers = headers, data = json.dumps(payload), params = parameters)
return response
def get_me(access_token):
get_me_url = outlook_api_endpoint.format('/Me')
# Use OData query parameters to control the results
# - Only return the DisplayName and EmailAddress fields
query_parameters = {'$select': 'DisplayName,EmailAddress'}
r = make_api_call('GET', get_me_url, access_token, "", parameters = query_parameters)
if (r.status_code == requests.codes.ok):
return r.json()
else:
return "{0}: {1}".format(r.status_code, r.text)
def get_my_messages(access_token, user_email):
get_messages_url = outlook_api_endpoint.format('/Me/MailFolders/Inbox/Messages')
query_parameters = {'$top': '10',
'$select': 'ReceivedDateTime,Subject,From',
'$orderby': 'ReceivedDateTime DESC'}
r = make_api_call('GET', get_messages_url, access_token, user_email, parameters = query_parameters)
if (r.status_code == requests.codes.ok):
return r.json()
else:
return "{0}: {1}".format(r.status_code, r.text)
def send_message(access_token,user_email):
get_messages_url = outlook_api_endpoint.format('/Me/sendmail')
query_parameters = {
"Message": {
"Subject": "Meet for lunch?",
"Body": {
"ContentType": "Text",
"Content": "The new cafeteria is open."
},
"ToRecipients": [
{
"EmailAddress": {
"Address": "[email protected]"
}
}
],
"Attachments": [
{
"@odata.type": "#Microsoft.OutlookServices.FileAttachment",
"Name": "menu.txt",
"ContentBytes": "bWFjIGFuZCBjaGVlc2UgdG9kYXk="
}
]
},
"SaveToSentItems": "false"
}
r = make_api_call('POST', get_messages_url, access_token, user_email, parameters = query_parameters)
if (r.status_code == requests.codes.ok):
print r.json()
return r.json()
else:
return "{0}: {1}".format(r.status_code, r.text)
views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from tutorial.authhelper import get_signin_url,get_token_from_code, get_token_from_refresh_token, get_access_token
import requests
import time
from tutorial.outlookservice import get_me,get_my_messages,send_message
# Create your views here.
def home(request):
redirect_uri = "http://localhost:8000/tutorial/gettoken/"
sign_in_url = get_signin_url(redirect_uri)
return HttpResponse('<a href="' + sign_in_url +'">Click here to sign in and view your mail</a>')
def gettoken(request):
auth_code = request.GET['code']
redirect_uri = "http://localhost:8000/tutorial/gettoken/"
token = get_token_from_code(auth_code, redirect_uri)
access_token = token['access_token']
user = get_me(access_token)
refresh_token = token['refresh_token']
expires_in = token['expires_in']
expiration = int(time.time()) + expires_in - 300
# Save the token in the session
request.session['access_token'] = access_token
request.session['refresh_token'] = refresh_token
request.session['token_expires'] = expiration
request.session['user_email'] = user['EmailAddress']
return HttpResponse('User Email: {0}, Access token: {1}'.format(user['EmailAddress'], access_token))
这是send_message被称为
def mail(request):
access_token = get_access_token(request,request.build_absolute_uri(reverse('tutorial:gettoken')))
user_email = request.session['user_email']
if not access_token:
return HttpResponseRedirect(reverse('tutorial:home'))
else:
abc = send_message(access_token,user_email)
return HttpResponse(abc)
我收到以下错误,而在Django编译它的功能
400:{“error”:{“code”:“RequestBroker-ParseUri”,“message”:“查询选项'Message'被指定了多次,但最多只能指定一次。”}}
我知道这有点旧,但是您是否尝试从send_message
方法中的query_parameters
JSON中删除“消息”字段? 尝试创建您的JSON,就好像Message字段已经存在一样,您只需要提供/填充内部字段。就像这样:
query_parameters = { "Subject": "Meet for lunch?", "Body": { "ContentType": "Text", "Content": "The new cafeteria is open." }, "ToRecipients": [ { "EmailAddress": { "Address": "[email protected]" } } ], "Attachments": [ { "@odata.type": "#Microsoft.OutlookServices.FileAttachment", "Name": "menu.txt", "ContentBytes": "bWFjIGFuZCBjaGVlc2UgdG9kYXk=" } ] }
在outlookservice.py你SEND_EMAIL功能,你发出的信息内容make_api_call作为参数,而不是作为有效载荷。以下内容可以解决您的问题:
r = make_api_call('POST', get_messages_url, access_token, user_email, payload = query_parameters)
请您分享请求正文并请求uri?正如在电线上看到的那样 – Yogesh