Search code examples
restpowershelloffice365outlook.com

PowerShell - How to save Office 365 email as File?


I would like to know is it possible to Save Email to file as .msg or .eml in Office 365?

This is what I have up to with REST API.

$credential = get-credential
$messagesuri = 'https://outlook.office365.com/api/v1.0/me/folders/Inbox/messages'

$messages = Invoke-RestMethod -Uri $messagesuri -Credential $credential
$messages.value | % {
    $mailitem = $_
    $subject = $mailitem.Subject
    $messageid = $mailitem.Id

    $messageid

    // Save Message ($messageid) as File
    // ???????
}

Thanks in Advance. Regards Dat.


Solution

  • // C# Console Application, using EWS connecting to Office 365
    // Working Solution (Prove of Concept).
    using System;
    using System.IO;
    using Microsoft.Exchange.WebServices.Data; // Download Library using Nugget.
    
    namespace EwsClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                string myemail = ""; // Replace with your email address
                string password = ""; // Replace with your email password
    
                ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
                service.Credentials = new WebCredentials(myemail, password);
                service.UseDefaultCredentials = false;
                service.AutodiscoverUrl(myemail, RedirectionUrlValidationCallback);
                //service.TraceEnabled = true;
                //service.TraceFlags = TraceFlags.All;
                ItemView itemsView = new ItemView(1);
                string querystring = "Kind:email";
    
                FindItemsResults<Item> itemResults = service.FindItems(WellKnownFolderName.Inbox, querystring, view: itemsView);
    
                foreach (var message in itemResults)
                {
                    Console.WriteLine(message.Subject);
    
                    using (FileStream fileStream = File.Open(@"C:\message.msg", FileMode.Create, FileAccess.Write))
                    {
                        message.Load(new PropertySet(ItemSchema.MimeContent));
                        MimeContent mc = message.MimeContent;
                        fileStream.Write(mc.Content, 0, mc.Content.Length);
                    }
                }
            }
    
            private static bool RedirectionUrlValidationCallback(string redirectionUrl)
            {
                // The default for the validation callback is to reject the URL.
                bool result = false;
    
                Uri redirectionUri = new Uri(redirectionUrl);
    
                // Validate the contents of the redirection URL. In this simple validation
                // callback, the redirection URL is considered valid if it is using HTTPS
                // to encrypt the authentication credentials. 
                if (redirectionUri.Scheme == "https")
                {
                    result = true;
                }
                return result;
            }
        }
    }