msgraph-sdk-typescript icon indicating copy to clipboard operation
msgraph-sdk-typescript copied to clipboard

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

Open brosnic opened this issue 5 months ago • 5 comments

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 = "<[email protected]>";
const toRecipient = "<[email protected]>";

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_

brosnic avatar Jul 21 '25 11:07 brosnic

Is there anything else I need to do, to get this bug fixed? My backend needs to send Mails with Attachments via the Graph SDK in late August.

brosnic avatar Jul 24 '25 15:07 brosnic

@brosnic

https://blog.icewolf.ch/archive/2025/07/08/send-mail-with-attachment-via-microsoft-graph/

Did you try to encode the Content (Attachment) with Base64?

#Convert to Base64 $Base64 =[Convert]::ToBase64String($ContentByte)

$ContentType = "application/json" $Headers = @{"Authorization" = "Bearer "+ $AccessToken} $Body = @" { "@odata.type": "#microsoft.graph.fileAttachment", "name": "AndresBohren.jpg", "contentBytes": "$Base64" } "@

Kind Regards Andres

BohrenAn avatar Aug 18 '25 15:08 BohrenAn

@BohrenAn thank you for your answer! Yes I did try to encode the content with Base64, but it didn't work either. If you look at the property type of contentBytes of the FileAttachment Interface in the typescript SDK, you'll see, that it's of type "ArrayBuffer". Image

The SDK should encode it later - but this code never gets called.

brosnic avatar Aug 20 '25 07:08 brosnic

Nevermind, I implemented the few post requests to send a message with attachments. Like that I don't need the SDK and am not dependent to the maintainers.

brosnic avatar Aug 22 '25 07:08 brosnic

Can confirm that this issue still persists. Would love a response on this topic.

mariusfriess avatar Nov 24 '25 14:11 mariusfriess

Also can confirm that issue still is present and is blocking a migration to Graph API sending in a production service. Any updates for plans of remediation?

inertica avatar Dec 10 '25 12:12 inertica