Microsoft graph отправка электронной почты с вложениями

Я использую сервис Microsoft Graph для отправки электронного письма с вложениями. но когда я отправил письмо, у него нет вложений, которые я ему установил. это мой Json, который я генерирую

` message: {
            attachments: attachments[],
            subject: Email.Subject,
            body: {
              contentType: "HTML",
              content: Email.body
            },
            toRecipients: [
              {
                emailAddress: {
                  address: Email.To
                }
              }
            ],
          },
          saveToSentItems: true
}

есть мой массив вложений

0: {@odata.type: "#microsoft.graph.fileAttachment", contentBytes: "iVBORw0KGgoAAAANSUhEUgAAAPwA…JkiRJkiRJkiRJkiQZ4f8B1nomcWdNLuoAAAAASUVORK5CYII=", name: "outbound.png"}

1: {@odata.type: "#microsoft.graph.fileAttachment", contentBytes: "iVBORw0KGgoAAAANSUhEUgAAAQAA…eGOdrvC6af95tuTmRRrb4fxZWJvYuBoVJAAAAAElFTkSuQmCC", name: "inbound.png"}

`

и вот способ, которым я использую api для отправки почты

      sendMail: async function(accessToken, email) {

    const client = getAuthenticatedClient(accessToken);
    const sentResult = await client.api('/users/{tenantid}/sendMail').post(email);
}

вопрос в том, письмо отправлено, но почему без вложений

вот как я читаю свои файлы

var attachments = [];
function addAttachments() {
allFiles.forEach(a => {
    let reader = new FileReader();
    reader.readAsDataURL(a);
    reader.onload = function() {
        attachments.push({
            '@odata.type': "#microsoft.graph.fileAttachment",
            name: a.name,
            contentType: a.type,
            contentBytes: reader.result.split(',')[1],
        });
    };
})}

здесь консольный журнал объекта электронной почты email_object

это результат, когда я структурирую объект

{"message":{"subject":"[AU1588259832480]-random subject","body":{"contentType":"HTML","content":"<p>body test</p>"},"toRecipients":[{"emailAddress":{"address":"[email protected]"}}],"internetMessageId":"AU1588259832480","attachments":[]}}

объект аттачмента пуст, но почему?


comment
Вы выполняете вызовы как POST для вложений в черновик сообщения перед его отправкой? docs.microsoft. ru / en-us / graph / api /   -  person Jeremy Thake MSFT    schedule 28.04.2020
comment
да, я пытаюсь отправить сообщение с вложениями, это невозможно?   -  person Juan Saul    schedule 29.04.2020
comment
любая помощь!!! пожалуйста   -  person Juan Saul    schedule 05.05.2020
comment
У вас есть Fiddler (или аналогичный) след запроса?   -  person Jason Johnston    schedule 06.05.2020


Ответы (2)


У вас не должно быть data:image/png;base64 предисловия к вашему contentBytes. Это должны быть байты вашего изображения в кодировке base64.

"attachments": [
    {
        "@odata.type": "#microsoft.graph.fileAttachment",
        "contentBytes": "/9j/4AAQSkZJRgABAQEAYAB...",
        "name": "outbound.png",
        "contentType": "image/png"
    }
]
person Jason Johnston    schedule 05.05.2020
comment
есть способ связаться с вами? и посмотри подробнее мою проблему, пожалуйста - person Juan Saul; 06.05.2020
comment
Возможно, вы захотите просто выгрузить свой email объект с помощью JSON.stringify(email) перед его отправкой. Я подозреваю, что это не совсем правильная структура. Сравните с фрагментом, который я опубликовал выше. Если вы не можете понять это из этого, было бы хорошо отредактировать свой пост и включить свой код, в котором вы создаете свой массив вложений. - person Jason Johnston; 07.05.2020
comment
сообщение обновлено, здесь объект strignify {"message":{"subject":"[AU1588259832480]-random subject","body":{"contentType":"HTML","content":"<p>body test</p>"},"toRecipients":[{"emailAddress":{"address":"[email protected]"}}],"internetMessageId":"AU1588259832480","attachments":[]}} attachments пуст, но почему, я обязательно нажимаю, когда читаю файлы - person Juan Saul; 07.05.2020
comment
Хорошо, это больше похоже на ошибку JavaScript, чем на проблему с графиком. Я считаю, что ваш onload никогда не будет вызван, потому что вы делаете readAsDataURL ДО того, как определите свой onload обратный вызов. - person Jason Johnston; 07.05.2020
comment
но, как вы видите на изображении, которое я публикую, когда я консоль регистрирую объект, массив вложений имеет файлы, но когда я strignify массив исчезает - person Juan Saul; 07.05.2020
comment
как я могу это исправить - person Juan Saul; 07.05.2020
comment
Без всего вашего кода сказать невозможно. Если массив вложений внутри вашего объекта электронной почты пуст, то, конечно, у Graph не будет вложений для отправки. Учитывая все задействованные обратные вызовы, вы можете передать свой объект электронной почты в функцию отправки до того, как будет заполнен массив вложений. - person Jason Johnston; 07.05.2020
comment
есть способ прочитать файлы, которые вы предлагаете, и заполнить этот массив внутри объекта сообщения? - person Juan Saul; 07.05.2020
comment
это была моя ошибка javascript, FileReader является асинхронным, поэтому я пытался нажать на объект, пока читал, поэтому массив был пуст. теперь он работает, большое спасибо за вашу помощь - person Juan Saul; 08.05.2020

вот как я решаю пустые вложения, основываясь на этом сообщении Как записать FileReader base64 как переменная?

Я новая публикация о переполнении стека

  function getBase64(file, onLoadCallback) {
    return new Promise(function(resolve, reject) {
        var reader = new FileReader();
        reader.onload = function() { resolve(reader.result); };
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

const Send = {
message: {
    subject: `[${quoteNumb ? quoteNumb : quoteHomeNumber}]-${Email.subject}`,
    body: {
        contentType: "HTML",
        content: Email.body
    },
    toRecipients: [],
    attachments: []
}};

async function sendMail() {

for (const a of allFiles) {
    var fileData = await getBase64(a).catch(err => {
        console.log(err)
    });
    Send.message.attachments.push({
        '@odata.type': "#microsoft.graph.fileAttachment",
        name: a.name,
        contentType: a.type,
        contentBytes: fileData.split(',')[1]
    });
}
graph.sendMail(AccesToken, Send);}
person Juan Saul    schedule 07.05.2020