Microsoft.Graph send mail with attachment

2019-02-26 18:52发布

问题:

using Microsoft.Graph
IMessageAttachmentsCollectionPage Message.Attachments

I can not seem to get this to take any "ContentBytes" which is in the FileAttachment.ContentBytes.

My sample is from Microsoft https://github.com/microsoftgraph/aspnet-snippets-sample.

        // Create the message.
        Message email = new Message
        {
            Body = new ItemBody
            {
                Content = Resource.Prop_Body + guid,
                ContentType = BodyType.Text,
            },
            Subject = Resource.Prop_Subject + guid.Substring(0, 8),
            ToRecipients = recipients,
            HasAttachments = true,
            Attachments = new[]

                {

                    new FileAttachment

                    {

                        ODataType = "#microsoft.graph.fileAttachment",

                        ContentBytes = contentBytes,

                        ContentType = contentType,

                        ContentId = "testing",

                        Name = "tesing.png"

                    }

                }
        };

回答1:

Using the sample above from GitHub this is resolved, see below:

// Create the message with attachment.
byte[] contentBytes = System.IO.File.ReadAllBytes(@"C:\test\test.png");
string contentType = "image/png";
MessageAttachmentsCollectionPage attachments = new MessageAttachmentsCollectionPage();
attachments.Add(new FileAttachment
{
    ODataType = "#microsoft.graph.fileAttachment",
    ContentBytes = contentBytes,
    ContentType = contentType,
    ContentId = "testing",
    Name = "testing.png"
});
Message email = new Message
{
    Body = new ItemBody
    {
        Content = Resource.Prop_Body + guid,
        ContentType = BodyType.Text,
    },
    Subject = Resource.Prop_Subject + guid.Substring(0, 8),
    ToRecipients = recipients,
    Attachments = attachments
};

// Send the message.
await graphClient.Me.SendMail(email, true).Request().PostAsync();


回答2:

I'm not quite sure what exactly is going here without seeing a trace of what is being set in the request, an error message, or a http status code. I do know that you can't set the HasAttachments property, that property is only set by the service. Oh, the issue here is that you're setting the Message.Attachments property as a new[] instead of a new MessageAttachmentsCollectionPage. With that said, I just ran the following code and it worked as expected so we know the service will work for this scenario.

        var message = await createEmail("Sent from the MailSendMailWithAttachment test.");

        var attachment = new FileAttachment();
        attachment.ODataType = "#microsoft.graph.fileAttachment";
        attachment.Name = "MyFileAttachment.txt";
        attachment.ContentBytes = Microsoft.Graph.Test.Properties.Resources.textfile;

        message.Attachments = new MessageAttachmentsCollectionPage();
        message.Attachments.Add(attachment);

        await graphClient.Me.SendMail(message, true).Request().PostAsync();

I hope this helps and saves you time.

Update: This is using Microsoft.Graph.