microsoftgraph / microsoftgraph/msgraph-sdk-typescript

Mail with File Attachments don't work - attachments content doesn't get serialized.

Open
#853 7 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

status:waiting-for-triage ToTriage type:bug
Dominant language
TypeScript
Stars
44
Forks
7
Avg merge
12h 40m
Merged PRs (30d)
5

Description

Describe the bug

I am trying to send a Mail with an Image-Attachment via the Graph SDK. This is what my Test-Code looks like:


import { ClientSecretCredential } from "@azure/identity";
import { AzureIdentityAuthenticationProvider } from "@microsoft/kiota-authentication-azure";
import {
  createGraphServiceClient,
  GraphRequestAdapter,
} from "@microsoft/msgraph-sdk";
import { SendMailPostRequestBody } from "@microsoft/msgraph-sdk-users/users/item/sendMail/index.js";
import "@microsoft/msgraph-sdk-users";
import { FileAttachment } from "@microsoft/msgraph-sdk/models/index.js";
import fs from "fs";

const fromRecipient = "<from@mail.com>";
const toRecipient = "<to@mail.com>";

const credential = new ClientSecretCredential(
<tenantId>,
  <clientId>,
  <clientSecret>
);

// @microsoft/kiota-authentication-azure
const authProvider = new AzureIdentityAuthenticationProvider(credential, [
  "https://graph.microsoft.com/.default",
]);

const requestAdapter = new GraphRequestAdapter(authProvider);

const client = createGraphServiceClient(requestAdapter);

const fileBuffer = fs.readFileSync("test.jpeg");

const fileAttachment: FileAttachment = {
  odataType: "#microsoft.graph.fileAttachment",
  name: "test.jpg",
  contentType: "image/jpeg",
  contentBytes: fileBuffer,
  size: fileBuffer.byteLength,
};

const body: SendMailPostRequestBody = {
  message: {
    subject: "Testmail",
    body: {
      content:
        '<style type="text/css">html, p { font-size:14px !important; font-family: Arial, Helvetica, sans-serif !important; }</style><p>this is a test message</p>',
      contentType: "html",
    },
    hasAttachments: true,
    toRecipients: [
      {
        emailAddress: {
          address: toRecipient,
        },
      },
    ],
    attachments: [fileAttachment],
  },
};

try {
  const user = client.users.byUserId(fromRecipient);
  const mail = user.sendMail;
  await mail.post(body);
  console.log("done");
} catch (error) {
  console.log(error.message);
}

My dependencies are:

"dependencies": {
    "@azure/identity": "^4.10.2",
    "@microsoft/kiota-authentication-azure": "^1.0.0-preview.96",
    "@microsoft/kiota-http-fetchlibrary": "^1.0.0-preview.96",
    "@microsoft/msgraph-sdk": "^1.0.0-preview.64",
    "@microsoft/msgraph-sdk-users": "^1.0.0-preview.64",
    ...
  },

When I send this, I get an error with this message: 'Required property is missing.'

I debugged it and saw, that in https://github.com/microsoftgraph/msgraph-sdk-typescript/blob/main/packages/msgraph-sdk/models/index.ts the serializeFileAttachment Function only gets called with isSerializingDerivedType = true which leads to the state where "contentBytes" never gets written.

When i change isSerializingDerivedType to false in debug mode, the mail with the attachments got sent successfully!

Can you please fix that?

Thank you.

Expected behavior

The attachment's "contentBytes" gets written.

How to reproduce

Send a Mail with a File Attachment via Graph SDK - as shown above.

SDK Version

1.0.0-preview.64

Latest version known to work for scenario above?

No response

Known Workarounds

No response

Debug output
Click to expand log ```

Required property is missing.

</details>


### Configuration

_No response_

### Other information

_No response_

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with packages/msgraph-sdk/models/index.ts and inspect serializeFileAttachment, especially how isSerializingDerivedType affects contentBytes. Run the supplied TypeScript send-mail reproduction with SDK version 1.0.0-preview.64. Done means the attachment contentBytes is serialized and the mail sends successfully without the missing-property error.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.