Python Post Request - Ошибка 415 при отправке файлов через Outlook API - PullRequest
0 голосов
/ 12 апреля 2019

У меня были некоторые проблемы с отправкой файлов через модуль отдыха python. Я могу отправлять электронные письма без вложений, но, как только я пытаюсь добавить параметр files, происходит сбой вызова, и я получаю ошибку 415.

Я просмотрел сайт и обнаружил, что это может быть потому, что я не отправлял тип содержимого файлов при создании этого массива данных, поэтому изменил его, чтобы запросить тип содержимого с помощью mimetypes; еще 415.

Эта тема: Python запрашивает загрузку файла внесла еще пару изменений, но все равно 415.

Сообщение об ошибке гласит:

"Не удалось найти поддерживаемый тип MIME, который соответствует типу содержимого ответа. Ни один из поддерживаемых типов (типов)"

Затем выводится список типов json, например: "application / json; odata.metadata = минимальный; odata.streaming = true; IEEE754Compatible = false"

затем говорит:

"соответствует типу содержимого 'multipart / form-data; border = 0e5485079df745cf0d07777a88aeb8fd'"

Что, конечно, заставляет меня думать, что я все еще где-то неправильно обрабатываю тип контента.

Кто-нибудь может увидеть, где я ошибаюсь в своем коде?

Спасибо!

Вот функция:


def send_email(access_token):

    import requests
    import json
    import pandas as pd
    import mimetypes

    url = "https://outlook.office.com/api/v2.0/me/sendmail"

    headers = {
        'Authorization': 'Bearer '+access_token,
    }

    data = {}
    data['Message'] = {
        'Subject': "Test",
        'Body': {
            'ContentType': 'Text',
            'Content': 'This is a test'
        },
        'ToRecipients': [
            {
                'EmailAddress':{
                'Address': 'MY TEST EMAIL ADDRESS'
                }
            }
        ]
    }
    data['SaveToSentItems'] = "true"

    json_data = json.dumps(data)
    #need to convert the above json_data to dict, otherwise it won't work
    json_data = json.loads(json_data)

    ###ATTACHMENT WORK
    file_list = ['test_files/test.xlsx', 'test_files/test.docx']

    files = {}
    pos = 1
    for file in file_list:
        x = file.split('/') #seperate file name from file path

        files['file'+str(pos)] = ( #give the file a unique name
        x[1], #actual filename
        open(file,'rb'), #open the file
        mimetypes.MimeTypes().guess_type(file)[0] #add in the contents type
        )

        pos += 1 #increase the naming iteration

    #print(files)

    r = requests.post(url, headers=headers, json=json_data, files=files)

    print("")
    print(r)
    print("")
    print(r.text)

1 Ответ

0 голосов
/ 02 мая 2019

Я понял это!Взглянул на документацию по outlook API и понял, что мне следует добавлять вложения в виде закодированных списков в сообщение Json, а не в функцию request.post.Вот мой рабочий пример:

import requests
import json
import pandas as pd
import mimetypes
import base64

url = "https://outlook.office.com/api/v2.0/me/sendmail"

headers = {
    'Authorization': 'Bearer '+access_token,
}


Attachments = []
file_list = ['test_files/image.png', 'test_files/test.xlsx']

for file in file_list:

    x = file.split('/') #file the file path so we can get it's na,e
    filename = x[1] #get the filename
    content = open(file,'rb') #load the content

    #encode the file into bytes then turn those bytes into a string
    encoded_string = ''
    with open(file, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read())

    encoded_string = encoded_string.decode("utf-8")

    #append the file to the attachments list
    Attachments.append({
            "@odata.type": "#Microsoft.OutlookServices.FileAttachment",
            "Name": filename,   
            "ContentBytes": encoded_string        
    })


data = {}
data['Message'] = {
    'Subject': "Test",
    'Body': {
        'ContentType': 'Text',
        'Content': 'This is a test'
    },
    'ToRecipients': [
        {
            'EmailAddress':{
            'Address': 'EMAIL_ADDRESS'
            }
        }
    ],
    "Attachments": Attachments
}
data['SaveToSentItems'] = "true"

json_data = json.dumps(data)
json_data = json.loads(json_data)



r = requests.post(url, headers=headers, json=json_data)

print(r)
...